3

在使用 SAM CLI 创建 Lambda 函数时template.yaml,我必须传递一些环境变量,它们不应该在 GitHub 上公开。有什么方法可以template.yaml通过.env文件引用环境变量吗?

我没有找到任何相同的来源。

来自 template.yaml 的示例代码片段:

Properties:
  CodeUri: student /
  FunctionName: list
  Handler: index.listHandler
  Runtime: nodejs14.x
  Environment: 
    Variables:
      MONGODB_URI: mongodb://username:pwd
4

2 回答 2

5

这里几乎没有选择。

  1. 将它们添加到Parameters模板的部分(确保添加NoEcho选项)并在部署时将它们传递进来。
  2. 更好的选择是使用Secrets Manager来存储值,然后在模板中使用动态引用。CloudFormation 将在您部署时为您从 Secrets Manager 中检索值。
  3. 更好的选择是根本不将它们作为环境变量传递(因为任何有权查看该函数的人都可以看到该值)。相反,使用 Secrets Manager 存储值并在代码中查找值。如果您决定使用这种方法,请确保缓存该值,以便您至少可以在 lambda 的热启动之间重用它。
  4. 另一种选择是使用 KMS 加密值,并将加密(Base64 编码)值传递给函数。您需要调用 KMS 解密来获取解密后的值。此操作非常快,并且不太可能受到限制。我仍然会缓存该值以帮助加快热启动之间的速度。
于 2021-03-12T02:15:13.123 回答
2

通过@Jason's answer 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}`);
};
于 2021-04-25T10:50:32.157 回答