Skip to content

Commit a41fcb6

Browse files
chore(pr): address second round of review comments
- Fix malformed sed quoting in AWS_REGION derivation (ec2-strategy.ts) - Remove unused blueprintConfig destructuring (ec2-strategy.ts) - Scope EC2/SSM IAM permissions: condition ec2:CreateTags on fleet tag, scope ssm:SendCommand to fleet-tagged instances and AWS-RunShellScript document, separate DescribeInstances (requires resource '*')
1 parent 42566d0 commit a41fcb6

2 files changed

Lines changed: 35 additions & 7 deletions

File tree

cdk/src/constructs/task-orchestrator.ts

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -281,17 +281,45 @@ export class TaskOrchestrator extends Construct {
281281

282282
// EC2 fleet compute strategy permissions (only when EC2 is configured)
283283
if (props.ec2Config) {
284+
// DescribeInstances does not support resource-level permissions
284285
this.fn.addToRolePolicy(new iam.PolicyStatement({
285-
actions: [
286-
'ec2:DescribeInstances',
287-
'ec2:CreateTags',
288-
],
286+
actions: ['ec2:DescribeInstances'],
287+
resources: ['*'],
288+
}));
289+
290+
// CreateTags/DeleteTags scoped to fleet instances only
291+
this.fn.addToRolePolicy(new iam.PolicyStatement({
292+
actions: ['ec2:CreateTags', 'ec2:DeleteTags'],
289293
resources: ['*'],
294+
conditions: {
295+
StringEquals: {
296+
[`ec2:ResourceTag/${props.ec2Config.fleetTagKey}`]: props.ec2Config.fleetTagValue,
297+
},
298+
},
299+
}));
300+
301+
// SSM SendCommand scoped to fleet-tagged instances; Get/Cancel scoped to all commands
302+
this.fn.addToRolePolicy(new iam.PolicyStatement({
303+
actions: ['ssm:SendCommand'],
304+
resources: [
305+
`arn:${Aws.PARTITION}:ec2:*:*:instance/*`,
306+
],
307+
conditions: {
308+
StringEquals: {
309+
[`ssm:resourceTag/${props.ec2Config.fleetTagKey}`]: props.ec2Config.fleetTagValue,
310+
},
311+
},
312+
}));
313+
314+
this.fn.addToRolePolicy(new iam.PolicyStatement({
315+
actions: ['ssm:SendCommand'],
316+
resources: [
317+
`arn:${Aws.PARTITION}:ssm:*::document/AWS-RunShellScript`,
318+
],
290319
}));
291320

292321
this.fn.addToRolePolicy(new iam.PolicyStatement({
293322
actions: [
294-
'ssm:SendCommand',
295323
'ssm:GetCommandInvocation',
296324
'ssm:CancelCommand',
297325
],

cdk/src/handlers/shared/strategies/ec2-strategy.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export class Ec2ComputeStrategy implements ComputeStrategy {
6868
);
6969
}
7070

71-
const { taskId, payload, blueprintConfig } = input;
71+
const { taskId, payload } = input;
7272
const payloadJson = JSON.stringify(payload);
7373

7474
// 1. Upload payload to S3
@@ -114,7 +114,7 @@ export class Ec2ComputeStrategy implements ComputeStrategy {
114114
'set -euo pipefail',
115115
'',
116116
'# Derive region from IMDS (SSM does not always set AWS_REGION)',
117-
'export AWS_REGION=$(ec2-metadata --availability-zone | cut -d" " -f2 | sed \'s/.$/\'\'/)\'',
117+
"export AWS_REGION=$(ec2-metadata --availability-zone | cut -d' ' -f2 | sed 's/.$//')",
118118
'export AWS_DEFAULT_REGION="$AWS_REGION"',
119119
'',
120120
'# Resolve instance ID for tag cleanup',

0 commit comments

Comments
 (0)