pulumi / pulumi-cdk

Pulumi/CDK Interop Library
Apache License 2.0
62 stars 5 forks source link

LoadBalancer "name" cannot be longer than 32 characters #62

Open lukehoban opened 1 year ago

lukehoban commented 1 year ago

Question from Community Slack:

I have a question about names and length of names. When set up an sample infrastructure with Pulumi CDK I got this error message when running pulumi preview:

Diagnostics:
  aws:lb:LoadBalancer (loadbalancedserviceLB1BE8EDCE):
    error: aws:lb/loadBalancer:LoadBalancer resource 'loadbalancedserviceLB1BE8EDCE' has a problem: "name" cannot be longer than 32 characters: "loadbalancedserviceLB1BE8EDCE-403d9b7". Examine values at 'LoadBalancer.Name'.

The corresponding code looks like this:

const lbservice = new ApplicationLoadBalancedFargateService(this, 'loadbalanced-service', {
  cluster,
  taskDefinition: taskdef,
  desiredCount: 2,
  serviceName: 'my-service',
  circuitBreaker: { rollback: true },
  publicLoadBalancer: true,
  listenerPort: webserverPort,
});

The name part is not an issue with regular AWS CDK, and Pulumi generates a different (shorter) name than AWS CDK, but still too short compared to name lengths allowed by CloudFormation, it seems. The question is really what to think and consider in terms of name issues here, what would be preferred approaches besides keeping construct id values short - and how many levels will this work out with?

I suspect that the issue is that we should be passing name through explicitly in the mapping linked below if provided (which it will always be I believe?) so that Pulumi doesn't apply it's own autonaming here. If you open an issue on this - we can look into whether that is indeed the right resolution. https://github.com/pulumi/pulumi-cdk/blob/342f7d5bbbc0d272c7e1616ae108b04c478add5d/src/aws-resource-mappings.ts#L210

eriklz commented 1 year ago

Yes, AWS CDK will always have a name associated with a construct, and the name must be unique at the specific construct/component level. The global name associated with the resource is built from the hierarchy of resource names, with some characters stripped out.

That model can also cause very long names. This tends to become more of a problem with CDK pipelines, since the pipeline itself gets encoded into the name hierarchy and sometimes things hit a 128 character limit and will not work (with CloudFormation). However, if it works to use pretty much the same model, then it will at least be predictable in terms of names compared to AWS CDK (CloudFormation flavour).

corymhall commented 4 months ago

This one is going to be tricky to fix generally. We are using the CloudFormation logicalId which can be up to 128 characters. CloudFormation will then generate a unique resource name using the Stack name and the resource name, but will make sure the generated name fits within any unique service limits.

So for example if I have a stack with the name AwsCdkTestAppStack and a LB with the logicalId myapplicationloadbalancerwithalongname802BEFCA, I might end up with a resource name of AwsCdk-myapp-ed0Q19JSgqxi

I can think of a couple of options

  1. Let the user override the CloudFormation logicalId

    (lb.node.defaultChild as CfnResource).overrideLogicalId('shortername');
  2. Update the aws-native autonaming implementation to modify the names to be within the max characters rather than throw an error

  3. pulumi-cdk could process the schema similar to autonaming and modify the logicalId if it is too long.