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

Jam*_*win 7 amazon-web-services aws-cloudformation aws-codepipeline aws-cdk

使用 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],
})
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试部署时,出现此错误:

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]
Run Code Online (Sandbox Code Playgroud)

所述CodePipeline文档指定在值Configuration的ActionDeclaration的属性可多达1000个字符。如果我查看来自 的 YAML 输出cdk synth,则该ParameterOverrides属性为 1351 个字符。所以这是一个问题。

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

Jam*_*win 5

我从这里的CDK 维护者那里得到了一些帮助,这让我远远低于 1000 个字符的限制。在这里重现解决方法:

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

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

您还可以显式命名 Artifacts,从而比默认值节省大量字符:

const sourceOutput = new codepipeline.Artifact('S');
Run Code Online (Sandbox Code Playgroud)

编辑2020年1月10日

我终于得到了AWS支持关于这个问题的回复:

我询问了 CodePipeline 团队并搜索了当前的开发工作流程,但找不到任何与增加传递给 CloudFormation 堆栈的参数限制或此操作的任何替代方法相关的当前活动,因此我们发布了基于功能请求的功能。根据您对我们开发团队的要求。

我无法提供该功能的预计上线时间,但您可以通过 CloudFormation 和 CodePipeline 官方页面关注新功能的发布,以查看新功能何时可用。

所以目前看来,CfnParameter解决方法是最好的选择。