Skip to content

Commit

Permalink
fix(core): SecretValue.secretsManager fails for tokenized secret-id (#…
Browse files Browse the repository at this point in the history
…16230)

`SecretValue.secretsManager` fails if a token is used for `secret-id`. This is caused by a validation which should be skipped for tokenized values.

Solved by skipping the validation if token is unresolved.

Fixes #16166.

----

*By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
  • Loading branch information
jumic committed Oct 27, 2021
1 parent dbb3f25 commit 5831456
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 2 deletions.
3 changes: 2 additions & 1 deletion packages/@aws-cdk/core/lib/secret-value.ts
@@ -1,6 +1,7 @@
import { CfnDynamicReference, CfnDynamicReferenceService } from './cfn-dynamic-reference';
import { CfnParameter } from './cfn-parameter';
import { Intrinsic } from './private/intrinsic';
import { Token } from './token';

/**
* Work with secret values in the CDK
Expand Down Expand Up @@ -39,7 +40,7 @@ export class SecretValue extends Intrinsic {
throw new Error('secretId cannot be empty');
}

if (!secretId.startsWith('arn:') && secretId.includes(':')) {
if (!Token.isUnresolved(secretId) && !secretId.startsWith('arn:') && secretId.includes(':')) {
throw new Error(`secret id "${secretId}" is not an ARN but contains ":"`);
}

Expand Down
47 changes: 46 additions & 1 deletion packages/@aws-cdk/core/test/secret-value.test.ts
@@ -1,4 +1,4 @@
import { CfnDynamicReference, CfnDynamicReferenceService, CfnParameter, SecretValue, Stack } from '../lib';
import { CfnDynamicReference, CfnDynamicReferenceService, CfnParameter, SecretValue, Stack, Token } from '../lib';

describe('secret value', () => {
test('plainText', () => {
Expand Down Expand Up @@ -28,6 +28,30 @@ describe('secret value', () => {

});

test('secretsManager with secret-id from token', () => {
// GIVEN
const stack = new Stack();

// WHEN
const v = SecretValue.secretsManager(Token.asString({ Ref: 'secret-id' }), {
jsonField: 'json-key',
versionStage: 'version-stage',
});

// THEN
expect(stack.resolve(v)).toEqual({
'Fn::Join': [
'',
[
'{{resolve:secretsmanager:',
{ Ref: 'secret-id' },
':SecretString:json-key:version-stage:}}',
],
],
});

});

test('secretsManager with defaults', () => {
// GIVEN
const stack = new Stack();
Expand All @@ -40,6 +64,27 @@ describe('secret value', () => {

});

test('secretsManager with defaults, secret-id from token', () => {
// GIVEN
const stack = new Stack();

// WHEN
const v = SecretValue.secretsManager(Token.asString({ Ref: 'secret-id' }));

// THEN
expect(stack.resolve(v)).toEqual({
'Fn::Join': [
'',
[
'{{resolve:secretsmanager:',
{ Ref: 'secret-id' },
':SecretString:::}}',
],
],
});

});

test('secretsManager with an empty ID', () => {
expect(() => SecretValue.secretsManager('')).toThrow(/secretId cannot be empty/);

Expand Down

0 comments on commit 5831456

Please sign in to comment.