Skip to content

Commit 3cd8076

Browse files
authored
Merge branch 'master' into distributed_map_support
2 parents 1246f0d + b1cb3b6 commit 3cd8076

File tree

4 files changed

+110
-33
lines changed

4 files changed

+110
-33
lines changed

lib/deploy/stepFunctions/compileIamRole.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ function getTaskStates(states, stateMachineName) {
2727
Mode: 'DISTRIBUTED',
2828
StateMachineName: stateMachineName,
2929
});
30+
if (state.ItemReader) {
31+
taskStates.push(state.ItemReader);
3032
}
3133
return taskStates;
3234
}
@@ -410,10 +412,21 @@ function getEventBridgePermissions(state) {
410412
}
411413

412414
function getS3GetObjectPermissions(state) {
415+
const bucket = state.Parameters['Bucket.$'] ? state.Parameters['Bucket.$'] : state.Parameters.Bucket;
416+
const key = state.Parameters['Key.$'] ? state.Parameters['Key.$'] : state.Parameters.Key;
417+
418+
if (bucket.startsWith('$') && key.startsWith('$')) {
419+
return [{
420+
action: 's3:GetObject',
421+
resource: [
422+
'*',
423+
],
424+
}];
425+
}
413426
return [{
414427
action: 's3:GetObject',
415428
resource: [
416-
`arn:aws:s3:::${state.Parameters.Bucket}/${state.Parameters.Key}`,
429+
`arn:aws:s3:::${bucket}/${key}`,
417430
],
418431
}];
419432
}
@@ -529,6 +542,7 @@ function getIamPermissions(taskStates) {
529542
case 'arn:aws:states:::events:putEvents.waitForTaskToken':
530543
return getEventBridgePermissions(state);
531544

545+
case 'arn:aws:states:::s3:getObject':
532546
case 'arn:aws:states:::aws-sdk:s3:getObject':
533547
return getS3GetObjectPermissions(state);
534548

lib/deploy/stepFunctions/compileIamRole.test.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,6 +1363,60 @@ describe('#compileIamRole', () => {
13631363
.to.be.deep.equal([`arn:aws:s3:::${testBucket}/${world}`]);
13641364
});
13651365

1366+
it('should give s3:GetObject permission for only objects referenced by state machine with ItemReader', () => {
1367+
const testBucket = 'test-bucket';
1368+
const testKey = 'test-key';
1369+
1370+
const genStateMachine = (id, lambdaArn, bucket, key) => ({
1371+
id,
1372+
definition: {
1373+
StartAt: 'A',
1374+
States: {
1375+
A: {
1376+
Type: 'Map',
1377+
ItemProcessor: {
1378+
StartAt: 'B',
1379+
States: {
1380+
B: {
1381+
Type: 'Task',
1382+
Resource: lambdaArn,
1383+
End: true,
1384+
},
1385+
},
1386+
},
1387+
ItemReader: {
1388+
Resource: 'arn:aws:states:::s3:getObject',
1389+
Parameters: {
1390+
'Bucket.$': bucket,
1391+
'Key.$': key,
1392+
},
1393+
},
1394+
End: true,
1395+
},
1396+
},
1397+
},
1398+
});
1399+
1400+
serverless.service.stepFunctions = {
1401+
stateMachines: {
1402+
myStateMachine1: genStateMachine('StateMachine1',
1403+
'arn:aws:lambda:us-west-2:1234567890:function:foo', '$.testBucket', '$.testKey'),
1404+
myStateMachine2: genStateMachine('StateMachine2',
1405+
'arn:aws:lambda:us-west-2:1234567890:function:foo', testBucket, testKey),
1406+
},
1407+
};
1408+
1409+
serverlessStepFunctions.compileIamRole();
1410+
const resources = serverlessStepFunctions.serverless.service
1411+
.provider.compiledCloudFormationTemplate.Resources;
1412+
const policy1 = resources.StateMachine1Role.Properties.Policies[0];
1413+
const policy2 = resources.StateMachine2Role.Properties.Policies[0];
1414+
expect(policy1.PolicyDocument.Statement[1].Resource)
1415+
.to.be.deep.equal('*');
1416+
expect(policy2.PolicyDocument.Statement[1].Resource)
1417+
.to.be.deep.equal([`arn:aws:s3:::${testBucket}/${testKey}`]);
1418+
});
1419+
13661420
it('should not generate any permissions for Task states not yet supported', () => {
13671421
const genStateMachine = id => ({
13681422
id,

package-lock.json

Lines changed: 40 additions & 31 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
"dependencies": {
4747
"@hapi/joi": "^15.0.2",
4848
"@serverless/utils": "^6.7.0",
49-
"asl-validator": "^3.0.8",
49+
"asl-validator": "^3.1.0",
5050
"bluebird": "^3.4.0",
5151
"chalk": "^4.1.2",
5252
"lodash": "^4.17.11"

0 commit comments

Comments
 (0)