我应该如何将机密(RDS 密码)传递到 CloudFormation/SAM 创建的 Lambda 函数中?

Jie*_*eng 2 security amazon-web-services aws-lambda

我使用 CloudFormation/AWS SAM 创建了 RDS 数据库和 Lambda 函数。我目前通过环境变量传递数据库连接信息,但不确定这是否是推荐的方式,因为在 AWS 仪表板中,我可以以明文形式看到密码

TestApiFunction:
    Type: AWS::Serverless::Function
    DependsOn: DB
    Properties:
      Handler: src/test.handler
      FunctionName: Test
      VpcConfig:
        SecurityGroupIds:
          - !Ref DataTierSecurityGroup
        SubnetIds:
          - !Ref PrivateSubnet1
          - !Ref PrivateSubnet2
          - !Ref PrivateSubnet3
      Environment:
        Variables:
          'DB_HOST': !GetAtt DB.Endpoint.Address
          'DB_USER': !Ref DBUser
          'DB_PASSWORD': !Ref DBPassword
Run Code Online (Sandbox Code Playgroud)

Tom*_*Tom 5

如果您使用的是 MySQL 或与 MySQL 兼容的 Aurora,则可以使用IAM 数据库身份验证来使用 IAM 角色(而不是用户名和密码)来连接到数据库。

您只需在 RDS 实例上启用 IAM 数据库身份验证,创建具有rds-db:connect权限的角色,并将该角色附加到 Lambda 函数。本文将介绍有关设置的更详细说明。

不幸的是,您似乎无法从 CloudFormation 启用 IAM 数据库身份验证,因此如果这是不行的或者您没有使用兼容的数据库引擎,您还可以查看AWS Secrets Manager。您需要创建一个IAM 角色来访问您的 Secrets Manager 密钥并将该角色附加到您的 Lambda 函数。这种方法的好处之一是, AWS为您提供 RDS 用户名/密码的开箱即用的密钥轮换。