如何以安全的方式在 template.yaml 中添加环境变量?
How to add environment variables in template.yaml in a secured way?
使用 template.yaml
通过 SAM CLI 创建 Lambda 函数时,我必须传递几个环境变量,它们不应在 GitHub 上公开。有什么方法可以通过 .env
文件引用 template.yaml
中的环境变量?
我没有找到任何相同的资源。
来自 template.yaml 的示例代码片段:
Properties:
CodeUri: student /
FunctionName: list
Handler: index.listHandler
Runtime: nodejs14.x
Environment:
Variables:
MONGODB_URI: mongodb://username:pwd
这里选项很少。
- 将它们添加到模板的
Parameters
部分(一定要添加 NoEcho
选项)并在部署时将它们传入。
- 更好的选择是在模板中使用 Secrets Manager to store the value and then use dynamic references。 CloudFormation 将在您部署时为您从 Secrets Manager 检索值。
- 更好的选择是根本不将它们作为环境变量传递(因为任何有权查看该函数的人都可以看到该值)。相反,使用 Secrets Manager 存储值并在代码中查找值。如果您决定使用这种方法,请务必缓存该值,以便您至少可以在 lambda 的热启动之间重用它。
- 另一种选择是使用 KMS 加密值,并将加密(Base64 编码)值传递给函数。您需要调用 KMS decrypt 来获取解密后的值。此操作非常快,并且不太可能受到限制。我仍然会缓存该值以帮助加快热启动之间的速度。
通过扩展@Jason 的回答 2。这里有一个完整的工作示例:
template.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}`);
};
使用 template.yaml
通过 SAM CLI 创建 Lambda 函数时,我必须传递几个环境变量,它们不应在 GitHub 上公开。有什么方法可以通过 .env
文件引用 template.yaml
中的环境变量?
我没有找到任何相同的资源。
来自 template.yaml 的示例代码片段:
Properties:
CodeUri: student /
FunctionName: list
Handler: index.listHandler
Runtime: nodejs14.x
Environment:
Variables:
MONGODB_URI: mongodb://username:pwd
这里选项很少。
- 将它们添加到模板的
Parameters
部分(一定要添加NoEcho
选项)并在部署时将它们传入。 - 更好的选择是在模板中使用 Secrets Manager to store the value and then use dynamic references。 CloudFormation 将在您部署时为您从 Secrets Manager 检索值。
- 更好的选择是根本不将它们作为环境变量传递(因为任何有权查看该函数的人都可以看到该值)。相反,使用 Secrets Manager 存储值并在代码中查找值。如果您决定使用这种方法,请务必缓存该值,以便您至少可以在 lambda 的热启动之间重用它。
- 另一种选择是使用 KMS 加密值,并将加密(Base64 编码)值传递给函数。您需要调用 KMS decrypt 来获取解密后的值。此操作非常快,并且不太可能受到限制。我仍然会缓存该值以帮助加快热启动之间的速度。
通过扩展@Jason 的回答 2。这里有一个完整的工作示例:
template.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}`);
};