【问题标题】:RDS, AWS Lambda, App client - type of set upRDS、AWS Lambda、应用程序客户端 - 设置类型
【发布时间】:2019-07-26 01:53:02
【问题描述】:

我绞尽脑汁好几天都找不到解决办法。

我有一个用 python 编写的应用程序,并希望使用用户通过文本、png 和复选框输入的变量到数据库中,但安全地使用 AWS lambda 而不是将数据库硬编码到应用程序中。

我已经设置了所有实例 VPC,其中包含数据库。我可以创建一个可以由 AWS lambda 调用的部署 .py,但是如何使用客户端为此部署提供变量?还是有其他方法可以做到这一点?

非常感谢,

p.s 该应用还使用 cognito 进行身份验证(使用授权)。

【问题讨论】:

  • 我没有得到你的问题。敏感信息从何而来?你的意思是密码和连接字符串是用户提供的吗?
  • @ThalesMinussi 是的数据库配置(我知道我可能可以散列它们或类似的)
  • 如果它们是由用户提供的,那应该是显而易见的。在将它们存储到数据库之前对其进行加密,在运行时获取它们并创建数据库连接。我在这里错过了什么吗?如果是,我可以详细说明答案,但我没有看到超出上述内容的任何内容
  • 根据 RDS 选项的类型,您可以使用IAM roles 访问数据库或使用AWS Secrets Manager
  • 不,也许我认为我让你感到困惑。应用程序(客户端)连接到数据库,不同的用户(使用 cognito 登录客户端)将他们的特定数据输入到相应的表中。

标签: python-3.x aws-lambda amazon-rds


【解决方案1】:

这是一个如何使用Secrets Manager 从您的代码中隐藏数据库连接信息的示例。我使用 Cloudformation 脚本设置 RDS 和秘密管理器。

DBSecret:
Type: AWS::SecretsManager::Secret
Properties:
  Name: !Sub '${AWS::StackName}-${MasterUsername}'
  Description: DB secret
  GenerateSecretString:
    SecretStringTemplate: !Sub '{"username": "${MasterUsername}"}'
    GenerateStringKey: "password"
    PasswordLength: 16
    ExcludeCharacters: '"@/\'

DBInstance:
Type: AWS::RDS::DBInstance
DependsOn: DBSecret
DeletionPolicy: Delete
Properties:
  DBInstanceClass: !FindInMap [InstanceSize, !Ref EnvironmentSize, DB]
  StorageType: !FindInMap [InstanceSize, !Ref EnvironmentSize, TYPE]
  AllocatedStorage: !FindInMap [InstanceSize, !Ref EnvironmentSize, STORAGE]
  AutoMinorVersionUpgrade: true
  AvailabilityZone: !Select [0, !Ref AvailabilityZones ]
  BackupRetentionPeriod: !Ref BackupRetentionPeriod
  CopyTagsToSnapshot: false
  DBInstanceIdentifier: !Ref AWS::StackName
  DBSnapshotIdentifier: !If [isRestore, !Ref SnapToRestore, !Ref "AWS::NoValue"]
  DBSubnetGroupName: !Ref DBSubnets
  DeleteAutomatedBackups: true
  DeletionProtection: false
  EnableIAMDatabaseAuthentication: false
  EnablePerformanceInsights: false
  Engine: postgres
  EngineVersion: 10.5
  MasterUsername: !Join ['', ['{{resolve:secretsmanager:', !Ref DBSecret, '::username}}' ]]
  MasterUserPassword: !Join ['', ['{{resolve:secretsmanager:', !Ref DBSecret, '::password}}' ]]
  MonitoringInterval: 0
  MultiAZ: !If [isMultiAZ, true, false]
  PreferredBackupWindow: '03:00-03:30'
  PreferredMaintenanceWindow: 'mon:04:00-mon:04:30'
  PubliclyAccessible: false
  StorageEncrypted: !If [isMicro, false, true]
  VPCSecurityGroups: !Ref VPCSecurityGroups

DBSecretAttachment:
Type: AWS::SecretsManager::SecretTargetAttachment
Properties:
  SecretId: !Ref DBSecret
  TargetId: !Ref DBInstance
  TargetType: 'AWS::RDS::DBInstance'

上面的脚本创建了一个 RDS 实例,一个包含所有连接信息的数据库密钥。请注意,密码由脚本创建并存储在密钥中。

Nodejs 中用于检索具有已知秘密 ID 的秘密值的示例代码

const params = {
  SecretId: <secret id>, 
};
secretsmanager.getSecretValue(params, async function(err, data) {
    if (err)
      console.log(err);
    else {
      console.log(data.SecretString);

      const data1= JSON.parse(data.SecretString);

      dbPort = data1.port;
      dbUsername = data1.username;
      dbPassword = data1.password;
      dbName = data1.dbname;
      dbEndpoint = data1.host;
    }
  });

这是您的 RDS 安全组的外观。

其中 source 是您的 lambda 的安全组。 希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-08-24
    • 2018-03-23
    • 2018-05-20
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多