AWS SAM本地化和环境参数

10

我希望能够消除我在AWS部署的lambda函数中的硬编码密码。我发现我应该修改packaged.yaml

Parameters:
  DATABASE_URI:
    Description: 'Required. MongoDB connection URL'
    Type: 'String'
Resources:
  BUDAuthorizeUserHandler:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: BUDAuthorizeUserHandler
      Handler: src/handlers/users/authorizeUser.handler
      Runtime: nodejs10.x
      Environment:
        Variables:
          MONGODB_URI: !Ref DATABASE_URI

这是使用方法:

const MONGODB_URI = process.env.MONGODB_URI;
console.log(MONGODB_URI);

到目前为止,一切都很好,符合规格要求。但是我花了两个小时在本地使其正常工作。

配置文件 env.json

{
  "BUDAuthorizeUserHandler": {
     "MONGODB_URI": "mongodb+srv://USER:PASSWORD@HOST/bud?retryWrites=true&w=majority"
   }
}

我尝试了这些选项,但环境变量从未定义:

sam local start-api --env-vars env.json

sam local start-api --parameter-overrides ParameterKey=DATABASE_URI,ParameterValue="mongodb+srv://USER:PASSWORD@HOST/bud?retryWrites=true&w=majority"

我已经浏览了以下页面:

https://github.com/awslabs/aws-sam-cli/issues/1163 aws-sam-local环境变量 运行AWS SAM Local时如何指定模板参数? 在AWS SAM中使用!Ref设置环境变量?

SAM CLI版本为0.39.0

怎样使它工作起来?我做错了什么?

2个回答

16
在你的情况下,问题可能在于参数名称DATABASE_URI中包含非字母数字字符(例如下划线)。请将其重命名为DatabaseUri并在sam invoke local命令中执行相同操作。它应该可以工作。
此外,需要更改的是template.yaml而不是packaged.yaml。当您运行sam package命令时,会自动生成packaged.yaml文件。
做出这些更改后,以下template.yaml适用于我。
Parameters:
    DatabaseUri: # Changed this to remove underscore
        Description: 'Required. MongoDB connection URL'
        Type: 'String'
Resources:
    BUDAuthorizeUserHandler:
        Type: AWS::Serverless::Function
        Properties:
            FunctionName: BUDAuthorizeUserHandler
            Handler: index.pingWithEnvVariable # Ignore this change, my test function is at this location
            Runtime: nodejs10.x
            Environment:
                Variables:
                    MONGODB_URI: !Ref DatabaseUri # Removed underscore from here as well, obviously

index.js(在输出中返回环境变量的值以进行测试)

exports.pingWithEnvVariable = async event => {
    const response = {};
    response.statusCode = 200;
    const env = process.env.MONGODB_URI;
    response.body = JSON.stringify({ env });
    return response;
};

我使用了与你相同的 env.json 文件。

$ sam local invoke BUDAuthorizeUserHandler  --env-vars env.json
START RequestId: 6a9d398c-fecd-1b07-c9a0-d9fe4293cfe1 Version: $LATEST
END RequestId: 6a9d398c-fecd-1b07-c9a0-d9fe4293cfe1
REPORT RequestId: 6a9d398c-fecd-1b07-c9a0-d9fe4293cfe1  Init Duration: 211.76 ms        Duration: 5.66 ms       Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 43 MB

{"statusCode":200,"body":"{\"env\":\"mongodb+srv://USER:PASSWORD@HOST/bud?retryWrites=true\u0026w=majority\"}"}

同样适用于参数覆盖

$ sam local invoke BUDAuthorizeUserHandler  --parameter-overrides 'ParameterKey=DatabaseUri,ParameterValue=mongodb+srv://USER:PASSWORD@HOST/bud?retryWrites=true&w=majority'
START RequestId: e0415251-2655-139b-e5df-5f9db658ca01 Version: $LATEST
END RequestId: e0415251-2655-139b-e5df-5f9db658ca01
REPORT RequestId: e0415251-2655-139b-e5df-5f9db658ca01  Init Duration: 163.06 ms        Duration: 6.88 ms       Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 43 MB

{"statusCode":200,"body":"{\"env\":\"mongodb+srv://USER:PASSWORD@HOST/bud?retryWrites=true\u0026w=majority\"}"}

谢谢,我会尝试。顺便问一下,在公共Git中存储template.yaml是否安全?我认为没有敏感信息,但我担心,因为我读过一篇关于意外提交敏感信息的文章,一些黑客利用它启动了大量EC2实例.. - Leos Literak
1
只要 template.yaml 中没有存储凭据,我认为就没有风险。 - Sarthak Jain
很棒的东西。MONGODB_URI是从env.json中使用的,而不是DatabaseUri。我现在会接受你的解决方案,谢谢。你能给我的问题点个赞吗? - Leos Literak
sam包和部署不接受--env-vars参数。我该如何将参数传递到AWS? 在调用CreateChangeSet操作时发生错误(ValidationError):Parameters: [DatabaseUri]必须具有值。 - Leos Literak
只需在 template.yamlResources 下添加环境变量,即使带有下划线也能正常工作。 - Sanil
显示剩余2条评论

1

samconfig.toml

[prod.deploy.parameters]
region = "us-east-1"
parameter_overrides = "TableName=\"banana-one\" DatabaseUri=\"https://prod.database.com\""

template.yaml

Parameters:
  TableName:
    Type: String
  DatabaseUri:
    Type: String

Resources:
  BUDAuthorizeUserHandler:
    Type: AWS::Serverless::Function
    Properties:
        FunctionName: BUDAuthorizeUserHandler
        Handler: index.pingWithEnvVariable
        Runtime: nodejs10.x
        Environment:
            Variables:
                MONGODB_URI: !Ref DatabaseUri

Lambda文件
const tableName = process.env.TableName;

Command Line

sam deploy --guided --config-env prod

注意:只需在.toml文件中添加更多内容以适应其他环境

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接