如何以安全的方式在 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

这里选项很少。

  1. 将它们添加到模板的 Parameters 部分(一定要添加 NoEcho 选项)并在部署时将它们传入。
  2. 更好的选择是在模板中使用 Secrets Manager to store the value and then use dynamic references。 CloudFormation 将在您部署时为您从 Secrets Manager 检索值。
  3. 更好的选择是根本不将它们作为环境变量传递(因为任何有权查看该函数的人都可以看到该值)。相反,使用 Secrets Manager 存储值并在代码中查找值。如果您决定使用这种方法,请务必缓存该值,以便您至少可以在 lambda 的热启动之间重用它。
  4. 另一种选择是使用 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}`);
};