AWS Secrets Manager и Cloud Formation - не может создать секрет, потому что он уже существует - PullRequest
0 голосов
/ 07 января 2019

У меня есть шаблон CF с простым секретом внутри, например:

Credentials:
    Type: 'AWS::SecretsManager::Secret'
    Properties:
    Name: !Sub ${ProjectKey}.${StageName}.${ComponentId}.credentials
    Description: client credentials
    SecretString: !Sub 
        '{"client_id":"${ClientId}","client_secret":"${ClientSecret}"}'

Стек успешно создан и секрет сгенерирован правильно.

Однако, когда я удаляю стек и заново создаю его, я получаю следующее сообщение об ошибке:

Операция не удалась из-за секретного pk.stage.compid.credentials уже существует. (Сервис: AWSSecretsManager; Код состояния: 400; Ошибка Код: ResourceExistsException; Идентификатор запроса: ###)

Полагаю, это потому, что секрет на самом деле не удален, а помечен для удаления только на x дней.

Можно немедленно удалить секрет через CLI, но как это можно сделать в шаблоне CF?

Мне нужно удалить и воссоздать стеки, поскольку они являются частью непрерывного конвейера интеграции / доставки, который автоматически запускается при фиксации исходного кода.

1 Ответ

0 голосов
/ 08 января 2019

Обычно при удалении стека секрет также должен быть удален; и CFN выполняет вышеупомянутое немедленное удаление. Это должно произойти, даже если секрет был запланирован для удаления вне стека CFN.

Если (после удаления вашего стека) секрет был создан другим стеком формирования облаков или тот же тест, запущенный в другом конвейере CI, заново создал секрет, вы можете увидеть эту ошибку. Кроме того, большинство систем AWS (включая Secrets Manager) в конечном итоге становятся согласованными, и вы можете увидеть задержку между удалением стека и фактическим удалением секрета. Если ваши тесты выполняются достаточно быстро или одно и то же секретное имя повторно используется в нескольких тестах, предыдущее удаление может не завершиться до следующего создания.

Мы столкнулись с похожими проблемами в наших стеках CI, и способ, которым мы работаем с ним, заключается в использовании генерируемого случайного имени для каждого теста. Например, вы можете передать случайный префикс стекам в качестве параметра и использовать его для построения имени (при условии, что в каждом тесте используется уникальный суффикс).

Кстати - вы можете проверить, был ли секрет запланирован для удаления или фактически отсутствует, запустив get-secret-value для секрета. Если он запланирован для удаления, вы увидите ошибку "... Вы не можете выполнить эту операцию с секретом, потому что он был удален", тогда как если секрет действительно удален, вы увидите "Диспетчер секретов не может найти указанное секрет». Если вы запланируете секрет для удаления, а затем удалите его с помощью --force-delete-без-восстановления, вы можете увидеть короткую задержку в несколько секунд между двумя состояниями.

...