Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to work around Cfn action's character limit in CodePipeline

Using the AWS CDK, I have a CodePipeline that produces build artifacts for 5 different Lambda functions, and then passes those artifacts as parameters to a CloudFormation template. The basic setup is the same as this example, and the CloudFormation deploy action looks basically like this:

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],
})

However, when I try to deploy, I get this error:

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]

The CodePipeline documentation specifies that values in the Configuration property of the ActionDeclaration can be up to 1000 characters. If I look at the YAML output from cdk synth, the ParameterOverrides property comes out to 1351 characters. So that's a problem.

How can I work around this issue? I may need to add more Lambda functions in the future, so this problem will only get worse. Part of the problem is that the CDK code inserts 'LambdaSourceBucketNameParameter' and 'LambdaSourceObjectKeyParameter' in each bucket/object pair name in the configuration output, putting me at 61 * 5 = 305 characters lost just to being verbose. Could I get part of the way there by overriding those generated names?

like image 206
James Irwin Avatar asked Oct 17 '19 19:10

James Irwin


1 Answers

I got some assistance from a CDK maintainer here, which let me get well under the 1000-character limit. Reproducing the workaround here:

LambdaSourceBucketNameParameter and LambdaSourceObjectKeyParameter are just the default parameter names. You can create your own:

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

You can also name Artifacts explicitly, thus saving a lot of characters over the defaults:

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

EDIT 10-Jan-2020

I finally got a response from AWS Support regarding the issue:

I've queried the CodePipeline team and searched though the current development workflows and couldn't find any current activity related to increasing the limit for parameters passed to a CloudFormation stack or any alternative method for this action, so we have issued a feature request based on your request for our development team.

I'm not able to provide an estimated time for this feature to be available, but you can follow the release on new features through the CloudFormation and CodePipeline official pages to check when the new feature will be available.

So for now, it looks like the CfnParameter workaround is the best option.

like image 183
James Irwin Avatar answered Sep 18 '22 13:09

James Irwin