From ecc3df96dddd543da0055f26c5c7a87391ce0d82 Mon Sep 17 00:00:00 2001 From: YYang30 Date: Mon, 27 Nov 2023 16:05:19 -0800 Subject: [PATCH] Add support for CFN function -- AccountIdFromAlias (fix for issue #27642) --- packages/aws-cdk-lib/core/lib/cfn-fn.ts | 27 ++++++++++++++++++- .../core/lib/helpers-internal/cfn-parse.ts | 4 +++ packages/aws-cdk-lib/core/test/fn.test.ts | 10 +++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/packages/aws-cdk-lib/core/lib/cfn-fn.ts b/packages/aws-cdk-lib/core/lib/cfn-fn.ts index 06344e90b5bd6..eab5dd93dba17 100644 --- a/packages/aws-cdk-lib/core/lib/cfn-fn.ts +++ b/packages/aws-cdk-lib/core/lib/cfn-fn.ts @@ -177,6 +177,16 @@ export class Fn { return Token.asList(new FnCidr(ipBlock, count, sizeMask)); } + /** + * The intrinsic function ``Fn::AccountIdfromAlias`` returns the AWS account ID that + * corresponds to the provided AWS account alias. + * @param alias The user-provided AWS account alias string. + * @returns a token represented as a string + */ + public static accountIdFromAlias(alias: string): string { + return Token.asString(new FnAccountIdFromAlias(alias)); + } + /** * Given an url, parse the domain name * @param url the url to parse @@ -437,7 +447,7 @@ export class Fn { /** * The intrinsic function `Fn::Length` returns the number of elements within an array - * or an intrinsic function that returns an array. + * or an intrinsic function that returns an array * * @param array The array you want to return the number of elements from */ @@ -675,6 +685,21 @@ class FnCidr extends FnBase { } } +/** + * The intrinsic function ``Fn::AccountIdFromAlias`` which resolves an AWS account + * alias to its account id. This function is typically used to to reference another + * account within your template. + */ +class FnAccountIdFromAlias extends FnBase { + /** + * Creates an ``FnAccountIdFromAlias`` function. + * @param alias The user-provided account alias string. + */ + constructor(alias: string) { + super('Fn::AccountIdFromAlias', alias); + } +} + class FnConditionBase extends Intrinsic implements ICfnRuleConditionExpression { readonly disambiguator = true; constructor(type: string, value: any) { diff --git a/packages/aws-cdk-lib/core/lib/helpers-internal/cfn-parse.ts b/packages/aws-cdk-lib/core/lib/helpers-internal/cfn-parse.ts index 4b7fd0cbb30a4..90be702e64eff 100644 --- a/packages/aws-cdk-lib/core/lib/helpers-internal/cfn-parse.ts +++ b/packages/aws-cdk-lib/core/lib/helpers-internal/cfn-parse.ts @@ -657,6 +657,10 @@ export class CfnParser { } return { Condition: condition.logicalId }; } + case 'Fn::AccountIdFromAlias': { + const value = this.parseValue(object[key]); + return Fn.accountIdFromAlias(value); + } default: if (this.options.context === CfnParsingContext.RULES) { return this.handleRulesIntrinsic(key, object); diff --git a/packages/aws-cdk-lib/core/test/fn.test.ts b/packages/aws-cdk-lib/core/test/fn.test.ts index a69b71f27a4fc..876a51b85eaa0 100644 --- a/packages/aws-cdk-lib/core/test/fn.test.ts +++ b/packages/aws-cdk-lib/core/test/fn.test.ts @@ -303,6 +303,16 @@ test('Fn.len with resolved value', () => { expect(Fn.len(Fn.split('|', 'a|b|c'))).toBe(3); }); +test('Fn.AccountIdFromAlias', () => { + const stack = new Stack(); + const token = Fn.accountIdFromAlias('test-aws-account-alias'); + + expect(stack.resolve(token)).toEqual({ + 'Fn::AccountIdFromAlias': + 'test-aws-account-alias', + }); +}); + function stringListToken(o: any): string[] { return Token.asList(new Intrinsic(o)); }