如何在CodePipeline中解决Cfn操作的字符限制

时间:2019-10-17 19:09:12

标签: amazon-web-services amazon-cloudformation aws-codepipeline aws-cdk

使用AWS CDK,我有一个CodePipeline,它为5个不同的Lambda函数生成构建工件,然后将这些工件作为参数传递给CloudFormation模板。基本设置与this example相同,并且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 documentation指定ActionDeclaration的Configuration属性中的值最多可以包含1000个字符。如果我查看cdk synth的YAML输出,则ParameterOverrides属性显示为1351个字符。所以这是一个问题。

如何解决此问题?将来我可能需要添加更多的Lambda函数,所以这个问题只会变得更糟。问题的部分原因是,CDK code在配置输出的每个存储桶/对象对名称中插入'LambdaSourceBucketNameParameter''LambdaSourceObjectKeyParameter',使我失去61 * 5 = 305个字符,这些字符只是因为太冗长。通过覆盖那些生成的名称,我可以成为其中的一部分吗?

1 个答案:

答案 0 :(得分:0)

我从CDK维护者here获得了一些帮助,这使我在1000个字符以下的限制之内得到了很好的解决。在此处复制解决方法:

LambdaSourceBucketNameParameterLambdaSourceObjectKeyParameter只是默认参数名称。您可以创建自己的:

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

您还可以显式命名工件,从而比默认设置节省很多字符:

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