Настройка ротации паролей Aurora Serverless с использованием CloudFormation (и шаблонов ротации Lambda)

AWS имеет полностью настроенную и готовую к использованию поддержку ротации для некоторые поддерживаемые механизмы RDS, включая Amazon Aurora (также бессерверные?)

Я пытаюсь настроить ротацию паролей в моем шаблоне CloudFormation, используя _ 1_ (обратите внимание, что это не полностью функциональный шаблон, а только иллюстрация):

  DBCluster:
    Type: AWS::RDS::DBCluster
    Properties:
      Engine        : aurora
      EngineMode    : serverless
      EngineVersion : 5.6.10a

  Secret:
    Type: AWS::SecretsManager::Secret
    Properties:
      GenerateSecretString:
        SecretStringTemplate: '{"username": "admin"}'
        GenerateStringKey: password
        PasswordLength: 20
        ExcludeCharacters: '"@/\'

  SecretTargetAttachment:
    Type: AWS::SecretsManager::SecretTargetAttachment
    Properties:
      SecretId: !Ref Secret
      TargetId: !Ref DBCluster
      TargetType: AWS::RDS::DBCluster

  SecretRotation:
    Type: AWS::SecretsManager::RotationSchedule
    Properties:
      SecretId: !Ref UserAdminSecret
      RotationLambdaARN: <ARN_GET_FROM_SERVERLESS_APPLICATION_REPOSITORY>
      RotationRules:
        AutomaticallyAfterDays: 1

Но функция ротации AWS Lambda не работает со следующим сообщением:

«Ядро базы данных должно быть установлено на 'mysql', чтобы использовать эту лямбда-выражение ротации»: KeyError

Похоже, что Aurora Serverless не поддерживается функцией ротации AWS Lambda, предоставляемой AWS.

Есть ли простой способ настроить ротацию секретов Aurora Serverless с помощью существующие шаблоны поворота лямбда?

Есть ли какой-нибудь пример для написания моей собственной функции вращения для Aurora Serverless?

PS: Этот вопрос как бы связан с Создание бессерверного кластера Aurora из облачной информации? < / а>




Ответы (4)


Ресурс RotationSchedule зависит от ресурса SecretTargetAttachment. Ресурс вложения обновляет значение вашей секретной строки, чтобы содержать информацию о соединении, такую ​​как механизм базы данных, порт и конечная точка.

К сожалению, CloudFormation не может узнать об этой неявной зависимости между двумя ресурсами. Вам необходимо поместить DependsOn на Ресурс RotationSchedule с логическим идентификатором ресурса вложения.

См. Ресурс RotationSchedule в этом примере - https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-rotationschedule.html#aws-resource-secretsmanager-rotationschedule--examples

person Parimal    schedule 07.08.2019
comment
Я не знаю, почему вы получаете +1, это не ответ на вопрос об Aurora Serverless - person Yves M.; 08.08.2019
comment
То, что у вас есть, правильно. Добавьте эту строку в свой ресурс RotationSchedule - DependsOn: SecretTargetAttachment - person Parimal; 09.08.2019
comment
@YvesM. Привет, у меня сейчас аналогичная проблема, мой движок db - это также Aurora MySQL, просто интересно, решили ли вы эту проблему, можете ли вы поделиться шаблоном функции? Заранее спасибо. - person Cecilia; 29.01.2020
comment
@Cecilia Я еще не продал задачу, у меня отключена ротация паролей. Но я займусь исследованием, чтобы выработать решение в день. Сообщите мне, если найдете готовое решение - person Yves M.; 29.01.2020
comment
@ YvesM. Я действительно нашел потенциальное решение, взламываю его на данный момент, оно должно работать, если вы также используете движок Aurora MySQL, мы можем просто использовать шаблон функции вращения для MySQL db, поэтому вместо использования CloudFormation мы можем создать функцию вручную (проверьте этот шаблон github.com/aws-samples/aws-secrets-manager-rotation-lambdas/), затем скажите Secretc Manager вызвать эту функцию для выполнения ротации, позвольте мне сначала провести некоторый эксперимент. - person Cecilia; 29.01.2020

Мне удалось настроить ротацию секретов для Aurora Serverless с помощью AWS Fully Configured and Ready to Use Rotation Support: aws-secrets-manager-rotation-lambdas/SecretsManagerRDSPostgreSQLRotationSingleUser/

Я получал ту же ошибку, о которой говорилось в Q выше, я обнаружил, что в моих настройках «Секреты» отсутствует параметр "engine": "postgres". После добавления настройки, как показано ниже, он начал работать

{
  "username": "XXXX",
  "password": "XXXXXXXXXX",
  "engine": "postgres",
  "host": "db.cluster-XXXX.us-XXXX-X.rds.amazonaws.com",
  "port": 5432,
  "dbClusterIdentifier": "XXXXX"
}
person Yogesh Jagtap    schedule 20.04.2020

Я столкнулся с аналогичной ошибкой при установке параметров PostgreSQL "password_encryption: 'scram-sha-256'"

Решением было отказаться от воссоздания всего стека CloudFormation с помощью MD5. (Обновление значения не устранило ошибку)

Кроме того, если у Lambdalog есть тайм-аут без других ошибок, увеличьте таймаут лямбда-функции по умолчанию с 30 секунд до 60 секунд, чтобы решить проблему.

person internetuser2008    schedule 04.02.2020
comment
Это больше похоже на комментарий, чем на ответ. Как только у вас будет достаточная репутация, вы сможете комментировать любое сообщение - person Anna; 05.02.2020

Я не использовал бессерверную версию, но получил ту же самую ошибку.

Ядро базы данных должно быть установлено на mysql, чтобы использовать эту лямбду вращения: KeyError


Решение

Для меня проблема заключалась в том, что мне нужно было предоставить подсети и группу безопасности для лямбда-выражения ротации.

Набросок шаблона CloudFormation будет выглядеть так (обратите внимание на параметры, переданные в лямбду):

DBSecrets:
  Type: AWS::SecretsManager::Secret
  Properties:
    GenerateSecretString:
      SecretStringTemplate: '{"username": "XXXXXXXXXX"}'
      GenerateStringKey: password
      PasswordLength: 24
      ExcludeCharacters: '"@/\'

DBSecretsRDSAttachment:
  Type: AWS::SecretsManager::SecretTargetAttachment
  Properties:
    SecretId: !Ref DBSecrets
    TargetId: !Ref RDSDatabase
    TargetType: AWS::RDS::DBInstance

SecretRotationSchedule:
  Type: AWS::SecretsManager::RotationSchedule
  DependsOn: DBSecretsRDSAttachment
  Properties:
    SecretId: !Ref DBSecrets
    RotationLambdaARN: !GetAtt MySQLRotationLambda.Outputs.RotationLambdaARN
    RotationRules:
      AutomaticallyAfterDays: 30

MySQLRotationLambda:
  Type: AWS::Serverless::Application
  Properties:
    Location:
      ApplicationId: <ARN_GET_FROM_SERVERLESS_APPLICATION_REPOSITORY>
      SemanticVersion: 1.1.0
    Parameters:
      endpoint: !Sub 'https://secretsmanager.${AWS::Region}.amazonaws.com'
      functionName: <Function Name>
      vpcSubnetIds: <Comma delimited List of VPC subnet IDs>
      vpcSecurityGroupIds: <Comma delimited List of VPC security grouop IDs>

RDSDatabase:
  Type: AWS::RDS::DBInstance
  Properties:
    MasterUsername: !Sub '{{resolve:secretsmanager:${DBSecrets}::username}}'
    MasterUserPassword: !Sub '{{resolve:secretsmanager:${DBSecrets}::password}}'
    Engine: mysql
    DBSubnetGroupName: <Your Subnet Group>
    VPCSecurityGroups: <Your Security Group>

Почему отображается эта ошибка?

Лямбда вращения проходит следующие этапы:

  • Сначала попробуйте войти в систему с ожидающим секретом, если это удастся, верните
  • Теперь попробуйте текущий пароль
  • Если и текущий, и ожидающий не работают, попробуйте предыдущий

Ему не удается войти в систему с ожидающим и текущим секретом, затем происходит сбой с этой ошибкой при попытке использовать предыдущий секрет. Текущий и ожидающий секреты действительны, Lambda просто не может подключиться к базе данных. Предыдущий секрет - это секрет, который вы изначально указываете в шаблоне CloudFormation выше.

{
  "username": "XXXXXXXXXX", 
  "password": "XXXXXXXXXX"
}

AWS::SecretsManager::SecretTargetAttachment изменяет его на правильный формат (для RDS MySQL Single User):

{
  "engine": "mysql",
  "host": "<required: instance host name/resolvable DNS name>",
  "username": "<required: username>",
  "password": "<required: password>",
  "dbname": "<optional: database name. If not specified, defaults to None>",
  "port": "<optional: TCP port number. If not specified, defaults to 3306>"
}

Вложенный стек поворота Lambda имеет больше параметров, которые вы можете передать, просто посмотрите его шаблон на панели управления CloudFormation.

person theJasonHall    schedule 19.07.2020