【问题标题】:How to add environment variables in template.yaml in a secured way?如何以安全的方式在 template.yaml 中添加环境变量?
【发布时间】:2021-06-09 06:18:36
【问题描述】:
通过 SAM CLI 使用 template.yaml 创建 Lambda 函数时,我必须传递一些环境变量,它们不应该暴露在 GitHub 上。有什么办法可以通过.env文件引用template.yaml中的环境变量?
我没有找到任何相同的来源。
来自 template.yaml 的示例代码 sn-p:
Properties:
CodeUri: student /
FunctionName: list
Handler: index.listHandler
Runtime: nodejs14.x
Environment:
Variables:
MONGODB_URI: mongodb://username:pwd
【问题讨论】:
标签:
aws-lambda
amazon-cloudformation
aws-sam-cli
sam
【解决方案1】:
这里的选项很少。
- 将它们添加到模板的
Parameters 部分(务必添加NoEcho 选项)并在部署时传递它们。
- 更好的选择是使用Secrets Manager 来存储值,然后在模板中使用dynamic references。 CloudFormation 会在您部署时为您从 Secrets Manager 中检索值。
- 更好的选择是根本不将它们作为环境变量传递(因为任何有权查看该函数的人都可以看到该值)。相反,使用 Secrets Manager 存储值并在代码中查找值。如果您决定使用这种方法,请务必缓存该值,以便您至少可以在 lambda 的热启动之间重用它。
- 另一种选择是使用 KMS 加密值,并将加密(Base64 编码)值传递给函数。您需要调用 KMS 解密来获取解密后的值。此操作非常快,并且不太可能受到限制。我仍然会缓存该值以帮助加快热启动之间的速度。
【解决方案2】:
通过@Jason 的回答 2 的扩展。这里是一个完整的工作示例:
模板.yaml
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: My test secrets manager dynamic reference SAM template/ Cloudformation stack
Resources:
# lambdas
myLambda:
Type: AWS::Serverless::Function
Properties:
FunctionName: !Sub ${AWS::StackName}-myLambda
Runtime: nodejs12.x
Handler: index.handler
CodeUri: ./src/handlers/myLambda
MemorySize: 128
Timeout: 10
Environment:
Variables:
someSecret: '{{resolve:secretsmanager:somePreviouslyStoredSecret}}'
src/handlers/myLambda/index.js
const { someSecret } = process.env;
exports.handler = (event, context, callback) => {
if (someSecret) callback(null, `secret: ${someSecret}`);
callback(`Unexpected error, secret: ${someSecret}`);
};