Skip to content

aws-s3-deployment: "cross stack" deploy-time values not supported #21503

@yeDor

Description

@yeDor

Describe the bug

using aws-s3-deployment with Source.jsonData() and deploy-time values from different stack(i.e. cross stack references),
deployment fails with Template error: instance of Fn::GetAtt references undefined resource testBucketDF4D7D1A.

If the referenced resource is declared within the same stack, deploy-time values just resolved normally.

Expected Behavior

cross stack references used as deploy-time values get resolved

Current Behavior


Stack2: deploying...
[0%] start: Publishing 02927fd0ce5bb130cbc8d11f17469e74496526efe5186a9ab36e8a8138e9a557:452187169681-eu-central-1
[0%] start: Publishing f98b78092dcdd31f5e6d47489beb5f804d4835ef86a8085d0a2053cb9ae711da:452187169681-eu-central-1
[0%] start: Publishing e5032a7ed03a7762b99560439c17f58d046a35d40ebf64ba70c63157df388563:452187169681-eu-central-1
[0%] start: Publishing 64dbe1ed56c8fbe09738c86c49833c7c7622d7abb1f3fb35bb9363cb05c6c481:452187169681-eu-central-1
[0%] start: Publishing 5702d929d6c85803b88e19d7a0c96258a615dd17804d9ba37e2a66c77c02ed36:452187169681-eu-central-1
[20%] success: Published 02927fd0ce5bb130cbc8d11f17469e74496526efe5186a9ab36e8a8138e9a557:452187169681-eu-central-1
[40%] success: Published f98b78092dcdd31f5e6d47489beb5f804d4835ef86a8085d0a2053cb9ae711da:452187169681-eu-central-1
[60%] success: Published e5032a7ed03a7762b99560439c17f58d046a35d40ebf64ba70c63157df388563:452187169681-eu-central-1
[80%] success: Published 64dbe1ed56c8fbe09738c86c49833c7c7622d7abb1f3fb35bb9363cb05c6c481:452187169681-eu-central-1
[100%] success: Published 5702d929d6c85803b88e19d7a0c96258a615dd17804d9ba37e2a66c77c02ed36:452187169681-eu-central-1
Stack2: creating CloudFormation changeset...

 ❌  Stack2 failed: Error [ValidationError]: Template error: instance of Fn::GetAtt references undefined resource testBucketDF4D7D1A
    at Request.extractError (C:\Users\Yevgen\AppData\Roaming\npm\node_modules\aws-sdk\lib\protocol\query.js:50:29)
    at Request.callListeners (C:\Users\Yevgen\AppData\Roaming\npm\node_modules\aws-sdk\lib\sequential_executor.js:106:20)
    at Request.emit (C:\Users\Yevgen\AppData\Roaming\npm\node_modules\aws-sdk\lib\sequential_executor.js:78:10)
    at Request.emit (C:\Users\Yevgen\AppData\Roaming\npm\node_modules\aws-sdk\lib\request.js:686:14)
    at Request.transition (C:\Users\Yevgen\AppData\Roaming\npm\node_modules\aws-sdk\lib\request.js:22:10)
    at AcceptorStateMachine.runTo (C:\Users\Yevgen\AppData\Roaming\npm\node_modules\aws-sdk\lib\state_machine.js:14:12)
    at C:\Users\Yevgen\AppData\Roaming\npm\node_modules\aws-sdk\lib\state_machine.js:26:10
    at Request.<anonymous> (C:\Users\Yevgen\AppData\Roaming\npm\node_modules\aws-sdk\lib\request.js:38:9)
    at Request.<anonymous> (C:\Users\Yevgen\AppData\Roaming\npm\node_modules\aws-sdk\lib\request.js:688:12)
    at Request.callListeners (C:\Users\Yevgen\AppData\Roaming\npm\node_modules\aws-sdk\lib\sequential_executor.js:116:18) {
  code: 'ValidationError',
  time: 2022-08-08T10:51:34.543Z,
  requestId: 'ef63e968-fd5b-4848-ab66-1c43ff646193',
  statusCode: 400,
  retryable: false,
  retryDelay: 790.27434638688
}

Template error: instance of Fn::GetAtt references undefined resource testBucketDF4D7D1A

Reproduction Steps

stack1:

@Getter
@ToString
public class Stack1 extends Stack {

  private final Bucket testBucket;

  @SneakyThrows
  @lombok.Builder
  Stack1(
    @NonNull Construct scope,
    @NonNull StackProps props
  ) {
    super(scope, "Stack1", props);
    testBucket = Bucket.Builder.create(this, "testBucket").build();
  }

}

Stack2:

@Getter
@ToString
public class Stack2 extends Stack {

  private final BucketDeployment dwcWebDeployment;

  @SneakyThrows
  @lombok.Builder
  Stack2(
    @NonNull Construct scope,
    @NonNull StackProps props,
    @NonNull Stack1 stack1
  ) {
    super(scope, "Stack2", props);

    Bucket testBucket = stack1.getTestBucket();

    WebConfig webConfig = WebConfig.builder()
                                   .hostUrl(testBucket.getBucketDomainName())
                                   .s3HostUrl(testBucket.getBucketRegionalDomainName())
                                   .build();

    dwcWebDeployment = BucketDeployment.Builder.create(this, "deployment")
                                               .destinationBucket(testBucket)
                                               .logRetention(RetentionDays.ONE_MONTH)
                                               .sources(asList(
                                                 Source.jsonData("config.json", webConfig)
                                               ))
                                               .build();
  }

  @lombok.Builder
  @Data
  @AllArgsConstructor
  @NoArgsConstructor
  public static class WebConfig {

    @NonNull String hostUrl;
    @NonNull String s3HostUrl;
  }

}

Possible Solution

workaround: define resources in Stack2. for example create ssm parameters and reference them:

...
    Bucket testBucket = stack1.getTestBucket();

    StringParameter hostUrl = StringParameter.Builder.create(this, "hostUrl")
                                                     .stringValue(testBucket.getBucketDomainName())
                                                     .build();
    StringParameter s3HostUrl = StringParameter.Builder.create(this, "s3HostUrl")
                                                       .stringValue(testBucket.getBucketRegionalDomainName())
                                                       .build();

    WebConfig webConfig = WebConfig.builder()
                                   .hostUrl(hostUrl.getStringValue())
                                   .s3HostUrl(s3HostUrl.getStringValue())
                                   .build();
...

Additional Information/Context

No response

CDK CLI Version

2.35.0 (build 5c23578)

Framework Version

No response

Node.js Version

v18.7.0

OS

Windows 10

Language

Java

Language Version

No response

Other information

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions