如何将机密信息(RDS密码)传递给由CloudFormation / SAM创建的Lambda函数?

时间:2018-07-26 07:34:45

标签: amazon-web-services security 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

2 个答案:

答案 0 :(得分:3)

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

您只需要在RDS实例上打开IAM数据库身份验证,创建具有rds-db:connect权限的角色,并将该角色附加到Lambda函数。 This article详细介绍了设置步骤。

不幸的是,您似乎无法从CloudFormation启用IAM数据库身份验证,因此,如果这不行或不使用兼容的数据库引擎,您也可以查看AWS Secrets Manager 。您将需要创建一个IAM role that can access your Secrets Manager secrets并将该角色附加到Lambda函数。这种方法的一个好处是AWS provides secrets rotation out-of-the-box为您提供RDS用户名/密码。

答案 1 :(得分:0)

因此,请勿直接通过Cloudformation传递凭据。通过读取dynamodb,参数存储(SSM)或AWS机密,使lambda成为凭据。

  • 参数存储对密码显示****
  • 使用DynamoDB,您可以将视图限制为某些用户。
  • AWS机密是另一项服务,允许您将机密存储在key:value