Менеджер секретов AWS: «Предыдущая ротация не завершена» при ротации секретов

Я создал секрет и обновил его, чтобы включить функцию вращения лямбда

Мой секрет выглядит как

aws secretsmanager list-secret-version-ids --secret-id envir/username
{
    "Versions": [
        {
            "VersionId": "90179cd3-daa1-48e4-9fe5-dde0a4cf22e4",
            "VersionStages": [
                "AWSPREVIOUS"
            ],
            "LastAccessedDate": 1524528000.0,
            "CreatedDate": 1524568488.358
        },
        {
            "VersionId": "60576823-5d98-4360-af53-7e1f909b88d0",
            "VersionStages": [
                "AWSCURRENT"
            ],
            "LastAccessedDate": 1524528000.0,
            "CreatedDate": 1524568827.466
        }
    ],
    "ARN": "arn:aws:secretsmanager:eu-west-1:8282828282828:secret:username-YdgbPA",
    "Name": "envir/username"
}

и когда я пытаюсь повернуть его, я получаю эту ошибку

An error occurred (InvalidRequestException) when calling the RotateSecret operation: A previous rotation isn’t complete. That rotation will be reattempted.

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

У кого-нибудь есть идеи?


Ссылки по теме:


person user2599522    schedule 24.04.2018    source источник


Ответы (5)


Просто примечание для людей в будущем, которые могут получить ту же ошибку ...

Если вы используете AWS Secrets Manager для смены пароля Amazon RDS, диспетчер секретов автоматически создаст функцию Lambda. Эта функция требует:

  • Доступ к Интернету (для вызова диспетчера секретов) ИЛИ конечной точке VPC для службы диспетчера секретов в подсети / подсетях, связанных с лямбда-функцией
  • Доступ к экземпляру RDS (для входа и смены пароля)

Таким образом, работают следующие комбинации:

  • Общедоступная база данных (плохо для безопасности) с лямбда-функцией, которая не прикреплена к VPC, ИЛИ
  • Функция Lambda в частной подсети со шлюзом NAT в общедоступной подсети (чтобы функция Lambda могла получить доступ к Интернету) ИЛИ эластичный IP-адрес, прикрепленный к ENI функции Lambda

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

  • Измените группу безопасности базы данных, чтобы разрешить входящие подключения от самой (то есть от Lambda к базе данных через ту же группу безопасности), ИЛИ
  • Измените группу безопасности, используемую функцией Lambda, на группу, которой в настоящее время разрешен доступ к группе безопасности базы данных.
person John Rotenstein    schedule 31.05.2018
comment
Разве нельзя просто поместить лямбду вращения и базу данных в одну группу безопасности? - person Dan; 09.06.2020
comment
Ресурсы @Dan обычно не входят в одну группу безопасности. Группа безопасности не похожа на подсеть, в которой ресурсы находятся в подсети. Скорее, правила группы безопасности применяются к каждому отдельному ресурсу, с которым они связаны. Тот факт, что два ресурса имеют одну и ту же группу безопасности, не означает, что они могут взаимодействовать - это возможно только в том случае, если группа безопасности имеет правило, которое специально разрешает «себе» доступ «к себе». Таким образом, обычно лучше размещать разные группы безопасности на разных типах ресурсов, а затем ссылаться друг на друга (например, БД разрешает входящий трафик от Lambda). - person John Rotenstein; 09.06.2020
comment
+1, ценю разъяснения. У вас это работает в CDK? В настоящее время пытаюсь установить бессерверный стек Aurora с автоповоротом ключей с помощью CDK и биться головой о стену ???? - person Dan; 09.06.2020
comment
Не стесняйтесь создавать новый вопрос со всеми деталями. - person John Rotenstein; 09.06.2020
comment
Я только что ответил на аналогичный вопрос, который также представлял собой «Предыдущая ротация не завершена». Ответ Джона здесь помог мне на пути к решению, к которому я пришел. stackoverflow.com/a/62975607/2344607. Просто комментирую здесь, если это поможет кому-то другому. - person theJasonHall; 19.07.2020

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

Например, с секретом с секретным идентификатором thefrog вызовите

aws secretsmanager get-secret-value \
    --secret-id thefrog \
    --version-stage AWSPENDING

чтобы получить идентификатор версии с ожидающей меткой. Результат будет выглядеть так

{                                                                      
    "CreatedDate": 1541540242.561,                         
    "Name": "thefrog",                
    "VersionStages": [                               
        "AWSPENDING"                                        
    ],                                                    
    "SecretString": "TOP-SECRET",                                                    
    "ARN": "arn:aws:secretsmanager:xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "VersionId": "2a27cecb-23c7-4320-b168-78661c24612f"   
} 

Тогда позвони

aws secretsmanager update-secret-version-stage \
    --secret-id thefrog \
    --version-stage AWSPENDING \
    --remove-from-version-id 2a27cecb-23c7-4320-b168-78661c24612f

чтобы удалить версию секрета с ожидающей меткой.

Отсюда вы можете повторить ротацию

person committedandroider    schedule 26.06.2018
comment
Просто интересно, какой вывод указывает на то, что вращение происходит успешно? Я получил это "Versions": [ { "VersionId": "xxx", "VersionStages": [ "AWSCURRENT" ], "LastAccessedDate": 1580342400.0, "CreatedDate": 1580391706.854 }, { "VersionId": "xxxx", "VersionStages": [ "AWSPREVIOUS" ], "LastAccessedDate": 1580342400.0, "CreatedDate": 1580297852.964 } - person Cecilia; 30.01.2020
comment
(Извините, не могу поместиться в один комментарий) Означает ли это, что мои учетные данные были изменены? Я проверил секрет в консоли SM, пароль не изменился. - person Cecilia; 30.01.2020

Для тех, кто считает, что ссылка на https://forums.aws.amazon.com/thread.jspa?threadID=280093&tstart=0 не применяется, обязательно проверьте вывод как aws secretsmanager list-secret-version-ids, так и aws secretsmanager list-secrets, чтобы убедиться, что они синхронизированы друг с другом. У меня был только один секрет, который я не мог повернуть, продолжал получать сообщение об ошибке «Предыдущая ротация не завершена. Ротация будет повторяться». У меня был запрос в службу поддержки с открытым на нем AWS, и пока я ждал в ожидании разговора с представителем службы поддержки, я решил проверить вывод list-secrets, и, о чудо, я обнаружил метку AWSPENDING на секрете, который я не мог повернуть. (эта метка НЕ ​​отображалась на выходе list-secret-version-ids для этого секрета). Как только я очистил этот ярлык, я смог успешно повернуть секрет, с которым у меня возникли проблемы.

person subzero2000    schedule 14.05.2018
comment
Интересно, почему они держат этикетку AWSPENDING в секрете там, где ротация не удалась - person committedandroider; 02.07.2018

Проблема заключалась в том, что лямбда-функция не выполнялась, и повторная попытка происходила без моего контроля (в настоящее время нет способа ограничить повторные попытки лямбда-функции).

person user2599522    schedule 30.04.2018
comment
Разве повторная попытка не происходит только при повторной попытке поворота? - person committedandroider; 11.07.2018

У меня была похожая проблема. Для моей documentdb у меня есть шаблон облачной информации, который имеет следующее содержимое шаблона:

  MyDocumentDbSecret:
    Type: AWS::SecretsManager::Secret
    Properties:
      Name: "/secrets/documentdb/root"
      Description: 'DocDB root secret'
      GenerateSecretString:
        SecretStringTemplate: !Sub '{"username": "${DefaultDocDbUser}"}'
        GenerateStringKey: "password"
        PasswordLength: 16
        ExcludeCharacters: '"@/\'

Но с этим шаблоном облачной информации я всегда получаю тайм-аут соединения в лямбда-функции (которая пытается изменить мой пароль для пользователя).

Но когда я меняю свой шаблон облачной информации на этот с ssl = true в атрибуте SecretStringTemplate:

  DocDBClusterRotationSecret:
    Type: AWS::SecretsManager::Secret
    Properties:
      Name: "/secrets/documentdb/root"
      Description: 'DocDB root secret'
      GenerateSecretString:
        SecretStringTemplate: !Sub '{"username": "${DefaultDocDbUser}", "ssl": "true"}'
        GenerateStringKey: "password"
        PasswordLength: 16
        ExcludeCharacters: '"@/\'

тогда он работает нормально. Для моего типа облачной информации: AWS :: SecretsManager :: SecretTargetAttachment не предоставляет мой секрет с атрибутами ssl = true, поэтому мне нужно добавить его вручную в мой шаблон облачной информации. Теперь работает отлично, без ошибок.

Моя секретная строка сейчас выглядит так:

{
 "password": "My PW",
 "engine": "mongo",
 "port": 27017,
 "host": "My Host",
 "ssl": "true",
 "username": "My User"
}
person Guchelkaben    schedule 30.03.2020