node.js - AWS SAM FindInMap 未填充变量
问题描述
我正在尝试使用 !FindInMap 内在函数获取一个简单的 SAM 模板来“动态”填充环境变量。我遵循了许多示例,包括 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
还不支持。这是相关的 GitHub 问题:
https ://github.com/awslabs/aws-sam-cli/issues/476
要在 SAM CLI 中设置和测试环境变量,您可以改用该--env-vars
选项。!FindInMap
通过 CloudFormation 部署时也支持,您可以通过部署一个简单的 Lambda 函数并针对它运行测试查询来测试此功能。
推荐阅读
- python-3.x - 在 Windows\Linux CentOS for Python3 上安装 quickfix 模块
- c# - ASP.NET Core,Telerik 网格,不显示数据,但控制器操作返回数据
- if-statement - SAS删除符合组内条件的观察
- reactjs - React Native:如何使用 iOS 14.0 获得 iPad 模拟器?
- daml - daml 测试命令失败,原因是:damlc:用户错误(无法启动场景服务:BErrorClient
- sql - SQL 一对多关系:我应该在表中看到“多”字段吗?
- ios - 从带有 cameraMode = `nonAR` 的 ARView 导航到常规 AR 模式 ARView 时的 SIGABRT
- gradle - 有没有一种简单的方法可以从 gradle 任务中访问项目资源文件?
- combobox - 组合框中项目的不完整显示wpf c#
- java - 只有一个字符串字段的模型类