Неразрешенный параметр Хранить динамическую ссылку SecureString в шаблоне CloudFormation - PullRequest
0 голосов
/ 05 февраля 2019

Согласно AWS, при развертывании инфраструктуры, для которой требуются секреты, т. Е. Пароли или аналогичные, в CloudFormation, одним из популярных решений является использование SecureStrings хранилища параметров из SSM.

Однако, несмотря на существующую документацию CFNОписывая шаг за шагом, как использовать динамические ссылки в шаблонах CFN , я не могу использовать фактическое значение SecureStrings.

Предполагая следующее представление JSON существующегоSecureString хранится в хранилище параметров SSM:

{
  "MyRedshiftMasterUserPassword": {
    "value": "Abcd2019",
    "type": "SecureString"
  }
}

и шаблон YAML CFN, который использует его, как указано в документации:

Resources
  Redshift:
    Type: 'AWS::Redshift::Cluster'
    Properties:
      NodeType: dc2.large
      NumberOfNodes: !Ref RedshiftNodes
      ClusterType: multi-node
      AutomatedSnapshotRetentionPeriod: !Ref AutomatedSnapshotRetentionPeriod
      DBName: datawarehouse_v1
      MasterUsername: !Ref RedshiftMasterUsername
      MasterUserPassword: '{{resolve:ssm-secure:MyRedshiftMasterUserPassword:1}}'

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

В частности, я столкнулся со следующими ошибками, которые все заканчиваются как стек UPDATE_FAILED:

  1. Всякий раз, когда ссылкаИмя параметра, которое необходимо разрешить, достаточно длинное. CloudFormation жалуется:

Параметр MasterUserPassword не является допустимым паролем, поскольку он длиннее 64 символов.(Сервис: AmazonRedshift; Код состояния: 400; Код ошибки: InvalidParameterValue; Идентификатор запроса: 7be9bd43-2927-11e9-aa88-29bbdcae859e)

Кроме того, даже если специально указано, что в ссылках шаблона могут использоваться косые черты, например, /infrastructure/datawarehouse/redshift/MyRedshiftMasterUserPassword выдается следующая ошибка:

Параметр MasterUserPassword не является допустимым паролем.Можно использовать только печатные символы ASCII, за исключением символов '/', '@', '' ',' ',' \ ',' ''. (Сервис: AmazonRedshift; Код состояния: 400; Код ошибки: InvalidParameterValue)

Таким образом, в результате ссылка на SecureString, по-видимому, не совместима с иерархией SSM ParameterStore (параметры с косой чертой).

Кроме того, удаляя любой ранее сообщенный недопустимый символ из имени параметра, он жалуется на следующее:

Параметр MasterUserPassword должен содержать как минимум 1 заглавную букву.(Сервис: AmazonRedshift; Код состояния: 400; Код ошибки: InvalidParameterValue; Идентификатор запроса: 90a263bd-2929-11e9-80c0-ffcecf297c44)


В конце концов, хотя используется базовое короткое-Slashed Parameter name в шаблоне позволяет стеку завершать операцию Update Динамическая привязка все еще не происходит , поскольку оказывается, что фактическое используемое значение передается Имя параметра, а не значениеНа это ссылаются, например, MyRedshiftMasterUserPassword вместо Abcd2019.

Я знаю, что AWS Secrets Manager также можно использовать, но он не бесплатный.

1 Ответ

0 голосов
/ 12 февраля 2019

Открыт случай поддержки с AWS, запрашивающим руководство для этого странного поведения CloudFormation.

По мнению команды поддержки, по сути, это действительно известная ошибка для службы CloudFormation, хотя предполагаемое время ее устранения не устранено.Разрешение параметра SSM Parameter Store SecureString при использовании в качестве динамической ссылки в конкретном случае свойства RedshiftMasterUserPassword, несмотря на то, что на него ссылаются в документации, не разрешается должным образом, и вместо него используется имя параметра.

В качестве альтернативы онипредложите 2 обходных пути, пока проблема исправлена:

  1. Получите 'MasterUserPassword' для Redshift из входного параметра со свойством NoEcho, установленным в значение true.Свойство NoEcho позволяет маскировать значение пароля, и вам не нужно хранить пароль в файле шаблона.Однако каждый раз, когда вы обновляете стек, вам нужно вводить пароль в качестве входного параметра.Для справки ниже будет полезен фрагмент кода.

Второй вариант, который является более универсальным:

Определите Настраиваемый Lambda пользовательский ресурс в файле шаблона, который запрашивает службу SSM и возвращает пароль в CloudFormation.В этом случае вам нужно написать пользовательский код для лямбда-функции, которая использует вызов API AWS GetParameter для получения значения параметра SSM Secure String и возвращает расшифрованное значение в CloudFormation.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...