RDS, AWS Lambda, клиент приложения - тип настройки - PullRequest
0 голосов
/ 04 марта 2019

Я уже несколько дней ломаю голову и не могу найти решение.

У меня есть приложение, написанное на python, и я хочу использовать переменные, которые пользователь вводит через text, png и checkboxв базу данных, но безопасно, используя AWS лямбда вместо жесткого кодирования БД в приложение.

Я настроил все экземпляры VPC с БД внутри них.Я могу создать развертывание .py, которое может вызываться лямбда-сервером AWS, но как я могу использовать клиент для предоставления переменных для этого развертывания?Или есть другой способ сделать это?

Большое спасибо,

ps, приложение также использует Cognito для аутентификации (используя варрант).

1 Ответ

0 голосов
/ 05 марта 2019

Вот пример использования Secrets Manager до скрытия информации о подключении к БД из вашего кода.Я настраиваю RDS и секретный менеджер, используя скрипт Cloudformation.

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 для получения секретного значения с известным секретным идентификатором

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 - группа безопасности вашей лямбды.Надеюсь, это поможет.

...