Skip to content

Commit e26a36c

Browse files
Elad Ben-Israelmergify[bot]
authored andcommitted
fix(ssm): invalid parameter arn (#4685)
* fix(ssm): invalid parameter arn We were missing a "/" as a prefix to the parameter name when rendering parameter ARNs. Fixes #4672 * fix test
1 parent 012eeed commit e26a36c

File tree

5 files changed

+87
-12
lines changed

5 files changed

+87
-12
lines changed

packages/@aws-cdk/aws-ec2/test/test.instance.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export = {
8787
{
8888
Ref: "AWS::AccountId"
8989
},
90-
":parameter",
90+
":parameter/",
9191
{
9292
Ref: "Param165332EC"
9393
}

packages/@aws-cdk/aws-ssm/lib/parameter.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,10 +444,18 @@ function makeIdentityForImportedValue(parameterName: string) {
444444
}
445445

446446
function arnForParameterName(scope: IConstruct, parameterName: string): string {
447+
448+
// remove trailing "/" if we can resolve parameter name.
449+
if (!Token.isUnresolved(parameterName)) {
450+
if (parameterName.startsWith('/')) {
451+
parameterName = parameterName.substr(1);
452+
}
453+
}
454+
447455
return Stack.of(scope).formatArn({
448456
service: 'ssm',
449457
resource: 'parameter',
450-
sep: '', // Sep is empty because this.parameterName starts with a / already!
458+
sep: '/', // Sep is empty because this.parameterName starts with a / already!
451459
resourceName: parameterName,
452460
});
453461
}

packages/@aws-cdk/aws-ssm/test/integ.parameter.lit.expected.json

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
{
6262
"Ref": "AWS::AccountId"
6363
},
64-
":parameter",
64+
":parameter/",
6565
{
6666
"Ref": "StringParameter472EED0E"
6767
}
@@ -113,6 +113,31 @@
113113
}
114114
]
115115
}
116+
},
117+
"ParamArn": {
118+
"Value": {
119+
"Fn::Join": [
120+
"",
121+
[
122+
"arn:",
123+
{
124+
"Ref": "AWS::Partition"
125+
},
126+
":ssm:",
127+
{
128+
"Ref": "AWS::Region"
129+
},
130+
":",
131+
{
132+
"Ref": "AWS::AccountId"
133+
},
134+
":parameter/",
135+
{
136+
"Ref": "StringParameter472EED0E"
137+
}
138+
]
139+
]
140+
}
116141
}
117142
}
118-
}
143+
}

packages/@aws-cdk/aws-ssm/test/integ.parameter.lit.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,8 @@ new cdk.CfnOutput(stack, 'StringListOutput', {
3434
value: cdk.Fn.join('+', listParameter.stringListValue),
3535
});
3636

37+
new cdk.CfnOutput(stack, 'ParamArn', {
38+
value: param.parameterArn
39+
});
40+
3741
app.synth();

packages/@aws-cdk/aws-ssm/test/test.parameter.ts

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { expect, haveResource } from '@aws-cdk/assert';
22
import iam = require('@aws-cdk/aws-iam');
33
import kms = require('@aws-cdk/aws-kms');
44
import cdk = require('@aws-cdk/core');
5-
import { App, Stack } from '@aws-cdk/core';
5+
import { App, CfnParameter, Stack } from '@aws-cdk/core';
66
import { Test } from 'nodeunit';
77
import ssm = require('../lib');
88

@@ -123,7 +123,7 @@ export = {
123123
{ Ref: 'AWS::Region' },
124124
':',
125125
{ Ref: 'AWS::AccountId' },
126-
':parameter',
126+
':parameter/',
127127
{ Ref: 'Parameter9E1B4FBA' }
128128
]]
129129
});
@@ -146,7 +146,7 @@ export = {
146146
{ Ref: 'AWS::Region' },
147147
':',
148148
{ Ref: 'AWS::AccountId' },
149-
':parameterMyParamName' ] ]
149+
':parameter/MyParamName' ] ]
150150
});
151151
test.deepEqual(stack.resolve(param.parameterName), 'MyParamName');
152152
test.deepEqual(stack.resolve(param.parameterType), 'String');
@@ -181,7 +181,7 @@ export = {
181181
{ Ref: 'AWS::Region' },
182182
':',
183183
{ Ref: 'AWS::AccountId' },
184-
':parameterMyParamName' ] ]
184+
':parameter/MyParamName' ] ]
185185
});
186186
test.deepEqual(stack.resolve(param.parameterName), 'MyParamName');
187187
test.deepEqual(stack.resolve(param.parameterType), 'String');
@@ -208,7 +208,7 @@ export = {
208208
{ Ref: 'AWS::Region' },
209209
':',
210210
{ Ref: 'AWS::AccountId' },
211-
':parameterMyParamName' ] ]
211+
':parameter/MyParamName' ] ]
212212
});
213213
test.deepEqual(stack.resolve(param.parameterName), 'MyParamName');
214214
test.deepEqual(stack.resolve(param.parameterType), 'SecureString');
@@ -265,7 +265,7 @@ export = {
265265
{
266266
Ref: 'AWS::AccountId'
267267
},
268-
':parameterMyParamName'
268+
':parameter/MyParamName'
269269
]
270270
]
271271
}
@@ -326,7 +326,7 @@ export = {
326326
{
327327
Ref: 'AWS::AccountId'
328328
},
329-
':parameterMyParamName'
329+
':parameter/MyParamName'
330330
]
331331
]
332332
}
@@ -355,7 +355,7 @@ export = {
355355
{ Ref: 'AWS::Region' },
356356
':',
357357
{ Ref: 'AWS::AccountId' },
358-
':parameterMyParamName' ] ]
358+
':parameter/MyParamName' ] ]
359359
});
360360
test.deepEqual(stack.resolve(param.parameterName), 'MyParamName');
361361
test.deepEqual(stack.resolve(param.parameterType), 'StringList');
@@ -445,5 +445,43 @@ export = {
445445

446446
test.done();
447447
},
448+
},
449+
450+
'rendering of parameter arns'(test: Test) {
451+
const stack = new Stack();
452+
const param = new CfnParameter(stack, 'param');
453+
const expectedA = { 'Fn::Join': [ '', [ 'arn:', { Ref: 'AWS::Partition' }, ':ssm:', { Ref: 'AWS::Region' }, ':', { Ref: 'AWS::AccountId' }, ':parameter/bam' ] ] };
454+
const expectedB = { 'Fn::Join': [ '', [ 'arn:', { Ref: 'AWS::Partition' }, ':ssm:', { Ref: 'AWS::Region' }, ':', { Ref: 'AWS::AccountId' }, ':parameter/', { Ref: 'param' } ] ] };
455+
let i = 0;
456+
457+
// WHEN
458+
const case1 = ssm.StringParameter.fromStringParameterName(stack, `p${i++}`, 'bam');
459+
const case2 = ssm.StringParameter.fromStringParameterName(stack, `p${i++}`, '/bam');
460+
const case3 = ssm.StringParameter.fromStringParameterName(stack, `p${i++}`, param.valueAsString);
461+
const case4 = ssm.StringParameter.fromStringParameterAttributes(stack, `p${i++}`, { parameterName: 'bam' });
462+
const case5 = ssm.StringParameter.fromStringParameterAttributes(stack, `p${i++}`, { parameterName: '/bam' });
463+
const case6 = ssm.StringParameter.fromStringParameterAttributes(stack, `p${i++}`, { parameterName: param.valueAsString });
464+
const case7 = ssm.StringParameter.fromSecureStringParameterAttributes(stack, `p${i++}`, { parameterName: 'bam', version: 10 });
465+
const case8 = ssm.StringParameter.fromSecureStringParameterAttributes(stack, `p${i++}`, { parameterName: '/bam', version: 10 });
466+
const case9 = ssm.StringParameter.fromSecureStringParameterAttributes(stack, `p${i++}`, { parameterName: param.valueAsString, version: 10 });
467+
const case10 = new ssm.StringParameter(stack, `p${i++}`, { stringValue: 'value' });
468+
469+
// THEN
470+
test.deepEqual(stack.resolve(case1.parameterArn), expectedA);
471+
test.deepEqual(stack.resolve(case2.parameterArn), expectedA);
472+
test.deepEqual(stack.resolve(case3.parameterArn), expectedB);
473+
test.deepEqual(stack.resolve(case4.parameterArn), expectedA);
474+
test.deepEqual(stack.resolve(case5.parameterArn), expectedA);
475+
test.deepEqual(stack.resolve(case6.parameterArn), expectedB);
476+
test.deepEqual(stack.resolve(case7.parameterArn), expectedA);
477+
test.deepEqual(stack.resolve(case8.parameterArn), expectedA);
478+
test.deepEqual(stack.resolve(case9.parameterArn), expectedB);
479+
test.deepEqual(stack.resolve(case10.parameterArn), {
480+
'Fn::Join': [ '', [
481+
'arn:', { Ref: 'AWS::Partition' }, ':ssm:', { Ref: 'AWS::Region' }, ':', { Ref: 'AWS::AccountId' }, ':parameter/', { Ref: 'p97A508212' }
482+
]
483+
] });
484+
485+
test.done();
448486
}
449487
};

0 commit comments

Comments
 (0)