Skip to content

Commit c4dd802

Browse files
authored
Merge pull request #535 from DubKF/fix_permissions_boundary
fix(permissionsBoundary): apply permissionsBoundary
2 parents 5e81304 + 0dbfecf commit c4dd802

File tree

4 files changed

+67
-2
lines changed

4 files changed

+67
-2
lines changed

lib/deploy/events/schedule/compileScheduledEvents.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ const BbPromise = require('bluebird');
55

66
module.exports = {
77
compileScheduledEvents() {
8+
const service = this.serverless.service;
9+
const permissionsBoundary = service.provider.rolePermissionsBoundary;
810
_.forEach(this.getAllStateMachines(), (stateMachineName) => {
911
const stateMachineObj = this.getStateMachine(stateMachineName);
1012
let scheduleNumberInFunction = 0;
@@ -131,7 +133,7 @@ module.exports = {
131133
}
132134
`;
133135

134-
const iamRoleTemplate = `
136+
let iamRoleTemplate = `
135137
{
136138
"Type": "AWS::IAM::Role",
137139
"Properties": {
@@ -169,6 +171,11 @@ module.exports = {
169171
}
170172
}
171173
`;
174+
if (permissionsBoundary) {
175+
const jsonIamRole = JSON.parse(iamRoleTemplate);
176+
jsonIamRole.Properties.PermissionsBoundary = permissionsBoundary;
177+
iamRoleTemplate = JSON.stringify(jsonIamRole);
178+
}
172179

173180
const newScheduleObject = {
174181
[scheduleLogicalId]: JSON.parse(scheduleTemplate),

lib/deploy/events/schedule/compileScheduledEvents.test.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,4 +423,28 @@ describe('#httpValidate()', () => {
423423
expect(() => serverlessStepFunctions.compileScheduledEvents()).to.throw(Error);
424424
});
425425
});
426+
it('should handle permissionsBoundary', () => {
427+
serverlessStepFunctions.serverless.service.stepFunctions = {
428+
stateMachines: {
429+
first: {
430+
events: [
431+
{
432+
schedule: {
433+
rate: 'rate(10 minutes)',
434+
enabled: false,
435+
inputPath: '$.stageVariables',
436+
},
437+
},
438+
],
439+
},
440+
},
441+
};
442+
serverless.service.provider.rolePermissionsBoundary = 'arn:aws:iam::myAccount:policy/permission_boundary';
443+
serverlessStepFunctions.compileScheduledEvents();
444+
445+
expect(serverlessStepFunctions.serverless.service
446+
.provider.compiledCloudFormationTemplate.Resources
447+
.FirstScheduleToStepFunctionsRole
448+
.Properties.PermissionsBoundary).to.equal('arn:aws:iam::myAccount:policy/permission_boundary');
449+
});
426450
});

lib/deploy/stepFunctions/compileIamRole.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,8 @@ function getIamStatements(iamPermissions, stateMachineObj) {
563563
module.exports = {
564564
compileIamRole() {
565565
logger.config(this.serverless, this.v3Api);
566+
const service = this.serverless.service;
567+
const permissionsBoundary = service.provider.rolePermissionsBoundary;
566568
this.getAllStateMachines().forEach((stateMachineName) => {
567569
const stateMachineObj = this.getStateMachine(stateMachineName);
568570
if (stateMachineObj.role) {
@@ -601,10 +603,16 @@ module.exports = {
601603
'iam-role-statemachine-execution-template.txt'),
602604
);
603605

604-
const iamRoleJson = iamRoleStateMachineExecutionTemplate
606+
let iamRoleJson = iamRoleStateMachineExecutionTemplate
605607
.replace('[PolicyName]', this.getStateMachinePolicyName())
606608
.replace('[Statements]', JSON.stringify(iamStatements));
607609

610+
if (permissionsBoundary) {
611+
const jsonIamRole = JSON.parse(iamRoleJson);
612+
jsonIamRole.Properties.PermissionsBoundary = permissionsBoundary;
613+
iamRoleJson = JSON.stringify(jsonIamRole);
614+
}
615+
608616
const stateMachineLogicalId = this.getStateMachineLogicalId(
609617
stateMachineName,
610618
stateMachineObj,

lib/deploy/stepFunctions/compileIamRole.test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2647,4 +2647,30 @@ describe('#compileIamRole', () => {
26472647
},
26482648
]);
26492649
});
2650+
it('should handle permissionsBoundary', () => {
2651+
serverless.service.stepFunctions = {
2652+
stateMachines: {
2653+
myStateMachine1: {
2654+
id: 'StateMachine1',
2655+
definition: {
2656+
StartAt: 'A',
2657+
States: {
2658+
A: {
2659+
Type: 'Task',
2660+
Resource:
2661+
'arn:aws:lambda:#{AWS::Region}:#{AWS::AccountId}:function:hello',
2662+
End: true,
2663+
},
2664+
},
2665+
},
2666+
},
2667+
},
2668+
};
2669+
serverless.service.provider.rolePermissionsBoundary = 'arn:aws:iam::myAccount:policy/permission_boundary';
2670+
serverlessStepFunctions.compileIamRole();
2671+
const boundary = serverlessStepFunctions.serverless.service.provider
2672+
.compiledCloudFormationTemplate.Resources.StateMachine1Role.Properties
2673+
.PermissionsBoundary;
2674+
expect(boundary).to.equal('arn:aws:iam::myAccount:policy/permission_boundary');
2675+
});
26502676
});

0 commit comments

Comments
 (0)