Как обойти ограничение количества символов действия Cfn в CodePipeline - PullRequest
1 голос
/ 17 октября 2019

Используя AWS CDK, у меня есть CodePipeline, который создает артефакты сборки для 5 различных функций Lambda, а затем передает эти артефакты в качестве параметров в шаблон CloudFormation. Базовая настройка такая же, как в этом примере , и действие развертывания CloudFormation выглядит в основном так:

new CloudFormationCreateUpdateStackAction({
    actionName: 'Lambda_CFN_Deploy',
    templatePath: cdkBuildOutput.atPath('LambdaStack.template.json'),
    stackName: 'LambdaDeploymentStack',
    adminPermissions: true,
    parameterOverrides: {
        ...props.lambdaCode.assign(lambdaBuildOutput.s3Location),
        // more parameter overrides here
    },
    extraInputs: [lambdaBuildOutput],
})

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

1 validation error detected: Value at 'pipeline.stages.3.member.actions.1.member.configuration' failed to satisfy constraint:
Map value must satisfy constraint: 
[Member must have length less than or equal to 1000, Member must have length greater than or equal to 1]

В документации CodePipeline указано, что значения в свойстве Configuration ActionDeclaration могут содержать до 1000 символов. Если я посмотрю на вывод YAML из cdk synth, свойство ParameterOverrides будет содержать 1351 символ. Так что это проблема.

Как я могу обойти эту проблему? Возможно, мне понадобится добавить больше лямбда-функций в будущем, так что эта проблема будет только усугубляться. Частично проблема заключается в том, что код CDK вставляет 'LambdaSourceBucketNameParameter' и 'LambdaSourceObjectKeyParameter' в каждое имя пары контейнеров / объектов в выходных данных конфигурации, в результате чего я получаю 61 * 5 = 305 символов, потерянных только из-за многословия. Могу ли я получить часть пути, переопределив эти сгенерированные имена?

1 Ответ

0 голосов
/ 07 ноября 2019

Я получил некоторую помощь от сопровождающего CDK здесь , что позволило мне выздороветь ниже предела в 1000 символов. Воспроизводим обходной путь здесь:

LambdaSourceBucketNameParameter и LambdaSourceObjectKeyParameter являются просто именами параметров по умолчанию. Вы можете создать свой собственный:

lambda.Code.fromCfnParameters({
  bucketNameParam: new CfnParameter(this, 'A'),
  objectKeyParam: new CfnParameter(this, 'B'),
});

Вы также можете явно назвать Артефакты, таким образом сохраняя много символов по умолчанию:

const sourceOutput = new codepipeline.Artifact('S');
...