我正在尝试获取一个简单的SAM模板,以使用!FindInMap内部函数“动态”填充环境变量。我遵循了很多示例,包括AWS的文档,但没有任何运气。由于某种原因,即使一切似乎正确,该函数也不会使用它来填充环境变量。它将只是将变量设置为空字符串。
您可以从下面的代码中看到我正在其中使用!Ref函数,但是尝试对函数的参数进行硬编码没有任何运气。您还会注意到该功能在Global
部分中,并且您可能会认为它不起作用,因为它在那里并且没有函数环境,但是我尝试了两个都没有起作用。您还会注意到,我正在填充一个名为STAGE
的环境变量,该变量正常工作并将其设置为"local"
。
我正在通过运行sam start local-api
并在响应中输出环境变量来测试该功能。
任何建议都会很有帮助。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: "Test Server"
Parameters:
Environment:
Type: String
Default: local
AllowedValues:
- local
- test
- prod
Mappings:
EnvParams:
local:
stage: "local"
databaseUrl: "mongodb://localhost:32768/test"
Globals:
Function:
Timeout: 500
Runtime: nodejs8.10
Environment:
Variables:
STAGE: !Ref Environment
DB_URL: !FindInMap [EnvParams, !Ref Environment, databaseUrl]
Resources:
ArticlesGetFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: src/articles/
Handler: index.getById
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /api/article/
Method: get
Outputs:
HelloWorldApi:
Description: "API Gateway endpoint URL for Prod stage for Hello World function"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
HelloWorldFunction:
Description: "Hello World Lambda Function ARN"
Value: !GetAtt HelloWorldFunction.Arn
HelloWorldFunctionIamRole:
Description: "Implicit IAM Role created for Hello World function"
Value: !GetAtt HelloWorldFunctionRole.Arn
答案 0 :(得分:3)
看来本地调试尚不支持!FindInMap
。这是相关的GitHub问题:
https://github.com/awslabs/aws-sam-cli/issues/476
要在SAM CLI中设置和测试环境变量,可以改为使用--env-vars
选项。通过CloudFormation部署时,也支持!FindInMap
,您可以通过部署简单的Lambda函数并对其运行测试查询来测试此功能。
答案 1 :(得分:0)
由于这个原因,我有类似的错误:
!FindInMap [EnvMap, !Ref Stage, dbpass] - correct
!FindInMap [EnvMap, !Ref Stage, dbpass] - error