diff --git a/packages/aws-cdk/lib/util/asset-publishing.ts b/packages/aws-cdk/lib/util/asset-publishing.ts index 4d5ef96362ddc..eb929bf03b4f3 100644 --- a/packages/aws-cdk/lib/util/asset-publishing.ts +++ b/packages/aws-cdk/lib/util/asset-publishing.ts @@ -39,6 +39,10 @@ class PublishingAws implements cdk_assets.IAws { private readonly targetEnv: cxapi.Environment) { } + public async discoverPartition(): Promise { + return (await this.aws.baseCredentialsPartition(this.targetEnv, Mode.ForWriting)) ?? 'aws'; + } + public async discoverDefaultRegion(): Promise { return this.targetEnv.region; } diff --git a/packages/cdk-assets/bin/publish.ts b/packages/cdk-assets/bin/publish.ts index 20b7a609bfdd0..e8d251cf82b97 100644 --- a/packages/cdk-assets/bin/publish.ts +++ b/packages/cdk-assets/bin/publish.ts @@ -86,6 +86,10 @@ class DefaultAwsClient implements IAws { return new this.AWS.ECR(await this.awsOptions(options)); } + public async discoverPartition(): Promise { + return (await this.discoverCurrentAccount()).partition; + } + public async discoverDefaultRegion(): Promise { return this.AWS.config.region || 'us-east-1'; } diff --git a/packages/cdk-assets/lib/aws.ts b/packages/cdk-assets/lib/aws.ts index 62c886885137f..40609eb155af7 100644 --- a/packages/cdk-assets/lib/aws.ts +++ b/packages/cdk-assets/lib/aws.ts @@ -4,6 +4,7 @@ import * as AWS from 'aws-sdk'; * AWS SDK operations required by Asset Publishing */ export interface IAws { + discoverPartition(): Promise; discoverDefaultRegion(): Promise; discoverCurrentAccount(): Promise; diff --git a/packages/cdk-assets/lib/private/placeholders.ts b/packages/cdk-assets/lib/private/placeholders.ts index 44ac4b80c36c3..50f76dfd3a7a6 100644 --- a/packages/cdk-assets/lib/private/placeholders.ts +++ b/packages/cdk-assets/lib/private/placeholders.ts @@ -8,6 +8,12 @@ import { IAws } from '../aws'; * (they're nominally independent tools). */ export async function replaceAwsPlaceholders(object: A, aws: IAws): Promise { + let partition = async () => { + const p = await aws.discoverPartition(); + partition = () => Promise.resolve(p); + return p; + }; + let account = async () => { const a = await aws.discoverCurrentAccount(); account = () => Promise.resolve(a); @@ -22,7 +28,7 @@ export async function replaceAwsPlaceholders(obje return (await account()).accountId; }, async partition() { - return (await account()).partition; + return partition(); }, }); } \ No newline at end of file diff --git a/packages/cdk-assets/test/mock-aws.ts b/packages/cdk-assets/test/mock-aws.ts index e331f40179cc6..262ab495bd430 100644 --- a/packages/cdk-assets/test/mock-aws.ts +++ b/packages/cdk-assets/test/mock-aws.ts @@ -18,6 +18,7 @@ export function mockAws() { return { mockEcr, mockS3, + discoverPartition: jest.fn(() => Promise.resolve('swa')), discoverCurrentAccount: jest.fn(() => Promise.resolve({ accountId: 'current_account', partition: 'swa' })), discoverDefaultRegion: jest.fn(() => Promise.resolve('current_region')), ecrClient: jest.fn(() => Promise.resolve(mockEcr)),