Каков наилучший способ использования значения хранилища параметров в AWS CDK? - PullRequest
2 голосов
/ 22 апреля 2020

У меня проблемы с использованием метода SSM valueForStringParameter в CDK. Он работает при первом развертывании стека, но не перехватывает обновления значения параметра при повторном развертывании стека, потому что шаблон CloudFormation не изменился, и поэтому CloudFormation считает, что обновлений не было, даже если изменился параметр SSM.

Для контекста я развертываю стек через CodePipeline, где сначала запускаю cdk synth, а затем использую действие CloudFormationCreateUpdateStackAction для развертывания шаблона.

Кто-нибудь знает, как обойти это? Единственный другой вариант, который, как я знаю, будет работать, - это переключиться на лямбду настраиваемого ресурса, которая вызывает SSM и возвращает значение, используя aws -sdk, но это слишком сложный вариант.

Обновление 1 Я не могу использовать ValueFromLookup, поскольку значение обновляется только во время выполнения как часть развертывания облачной информации другим стеком (я развертываю оба стека в CodePipeline в 2 разных регионах), поэтому поиск по времени синтеза приведет к устареванию значения.

Ответы [ 3 ]

2 голосов
/ 26 апреля 2020

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

Например, вы можете создать фиктивный параметр в вашем стеке для увеличения при каждом развертывании.

var deploymentId = new CfnParameter(this, "deploymentId", new CfnParameterProps() { Type = "String", Description = "Deployment Id" });
SetParameterValue(deploymentId, this.Node.GetContext("deploymentId").ToString());

и когда вы синтезируете CF, вы можете сгенерировать ID:

cdk synth -c deploymentId=$(uuidgen)

Если вы можете избежать "среды" agnosti c "syth и вам действительно нужен неизменный артефакт для развертывания в нескольких средах, вы можете использовать встроенный пакет из вашего cdk, например, пакет npm, содержащий ваш cdk. Следовательно, вы можете развернуть его в каждой среде, перезаписав параметры контекста вместо использования хранилища параметров ssm.

0 голосов
/ 23 апреля 2020

Все методы valueOf* и from* работают путем добавления параметра CloudFormation. Как вы уже поняли, изменение значения параметра не приводит к изменению шаблона, и никакие изменения не сработают.

Вместо этого вы, вероятно, захотите использовать метод valueFromLookup. Поиск выполняется во время синтеза, и результат помещается в сгенерированный шаблон CFN.

ssm.StringParameter.valueFromLookup(this, 'param-name');

Но имейте в виду, что поиск хранится в cdk.context.json. Если вы передали этот файл в свой репозиторий, вам нужно стереть этот ключ с помощью cdk context -e ... перед синтезом / diff / deploy.

0 голосов
/ 23 апреля 2020

См. https://docs.aws.amazon.com/cdk/latest/guide/get_ssm_value.html, вы можете использовать метод valueFromLookup, который возвращает хранилище параметров value во время синтеза, когда значение отличается от предыдущего, это вызовет обновление стека CF.

Однако у меня сложилось впечатление, что valueForStringParameter должен работать и с обновленными значениями параметров ssm, основанными на https://aws.amazon.com/blogs/mt/integrating-aws-cloudformation-with-aws-systems-manager-parameter-store/ Пример 2:

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