RDS,AWS Lambda,App客户端 - 设置类型

问题描述 投票:1回答:1

我已经绞尽脑汁待了好几天,找不到解决办法。

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

我已经在其中设置了所有带有DB的VPC实例。我可以创建一个可以由AWS lambda调用的部署.py,但是如何使用客户端为此部署提供变量?或者还有另一种方法吗?

非常感谢,

该应用程序还使用cognito进行身份验证(使用保证)。

python-3.x aws-lambda amazon-rds
1个回答
0
投票

这是一个如何使用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安全组应该是什么样子。

enter image description here,其中source是你lambda的安全组。希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.