【问题标题】:AWS SAM FindInMap Not Populating VariableAWS SAM FindInMap 未填充变量
【发布时间】:2020-07-28 15:59:32
【问题描述】:

我正在尝试获取一个简单的 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

【问题讨论】:

  • 为了更好地理解这一点 - 您正在测试 !FindInMap 是否通过 sam local 工作,而不是通过 CloudFormation 部署并检查控制台中的环境变量,对吗?
  • @KeetonHodgson 是的,这是正确的,这只是通过sam local进行测试

标签: node.js amazon-web-services serverless aws-serverless aws-sam-cli


【解决方案1】:

本地调试似乎还不支持!FindInMap。这是相关的 GitHub 问题: https://github.com/awslabs/aws-sam-cli/issues/476

要在 SAM CLI 中设置和测试环境变量,您可以改用 --env-vars 选项。 !FindInMap 在通过 CloudFormation 部署时也受支持,您可以通过部署一个简单的 Lambda 函数并对其运行测试查询来测试此功能。

【讨论】:

    【解决方案2】:

    因此我遇到了类似的错误:

    !FindInMap [EnvMap, !Ref Stage, dbpass] - correct
    !FindInMap [EnvMap, !Ref Stage, dbpass] - error
    

    【讨论】:

    • 请描述你的答案。
    • 类似于特殊字符的东西,而不仅仅是 EnvMap 和 !Ref 之间的空格
    猜你喜欢
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2020-03-22
    • 2022-01-07
    • 2022-01-10
    • 2013-07-04
    相关资源
    最近更新 更多