Согласно 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
:
- Всякий раз, когда имя параметра, на которое указывает ссылка, является достаточно длинным, 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)
В конце концов, хотя использование базового короткого Parameter name
без косой черты в шаблоне позволяет стеку завершить операцию Update, динамическая ссылка по-прежнему не возникает, поскольку фактическое используемое значение меняется out должно быть предоставлено Имя параметра, а не значение, на которое он ссылается, например, MyRedshiftMasterUserPassword
вместо Abcd2019
.
Я знаю, что можно также использовать AWS Secrets Manager, но он платный.