Skip to content

Commit c722abc

Browse files
Merge pull request #364 from eoinsha/master
feat(codebuild): add IAM policy statement generation for codebuild
2 parents 03c2012 + cff73ed commit c722abc

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

lib/deploy/stepFunctions/compileIamRole.js

+26
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,28 @@ function getStepFunctionsPermissions(state) {
264264
}];
265265
}
266266

267+
function getCodeBuildPermissions(state) {
268+
const projectName = state.Parameters.ProjectName;
269+
270+
return [{
271+
action: 'codebuild:StartBuild,codebuild:StopBuild,codebuild:BatchGetBuilds',
272+
resource: {
273+
'Fn::Sub': [
274+
`arn:aws:codebuild:$\{AWS::Region}:$\{AWS::AccountId}:project/${projectName}`,
275+
{},
276+
],
277+
},
278+
}, {
279+
action: 'events:PutTargets,events:PutRule,events:DescribeRule',
280+
resource: {
281+
'Fn::Sub': [
282+
'arn:aws:events:${AWS::Region}:${AWS::AccountId}:rule/StepFunctionsGetEventForCodeBuildStartBuildRule',
283+
{},
284+
],
285+
},
286+
}];
287+
}
288+
267289
// if there are multiple permissions with the same action, then collapsed them into one
268290
// permission instead, and collect the resources into an array
269291
function consolidatePermissionsByAction(permissions) {
@@ -344,6 +366,10 @@ function getIamPermissions(taskStates) {
344366
case 'arn:aws:states:::states:startExecution.waitForTaskToken':
345367
return getStepFunctionsPermissions(state);
346368

369+
case 'arn:aws:states:::codebuild:startBuild':
370+
case 'arn:aws:states:::codebuild:startBuild.sync':
371+
return getCodeBuildPermissions(state);
372+
347373
default:
348374
if (isIntrinsic(state.Resource) || state.Resource.startsWith('arn:aws:lambda')) {
349375
const trimmedArn = trimAliasFromLambdaArn(state.Resource);

lib/deploy/stepFunctions/compileIamRole.test.js

+57-1
Original file line numberDiff line numberDiff line change
@@ -1560,6 +1560,63 @@ describe('#compileIamRole', () => {
15601560
expectation(policy2, lambdaArns[2], lambdaArns[3]);
15611561
});
15621562

1563+
it('should give CodeBuild permissions', () => {
1564+
const projectName = 'HelloProject';
1565+
const genStateMachine = id => ({
1566+
id,
1567+
definition: {
1568+
StartAt: 'A',
1569+
States: {
1570+
A: {
1571+
Type: 'Task',
1572+
Resource: 'arn:aws:states:::codebuild:startBuild',
1573+
Parameters: {
1574+
ProjectName: projectName,
1575+
},
1576+
Next: 'B',
1577+
},
1578+
B: {
1579+
Type: 'Task',
1580+
Resource: 'arn:aws:states:::codebuild:startBuild.sync',
1581+
Parameters: {
1582+
ProjectName: projectName,
1583+
},
1584+
End: true,
1585+
},
1586+
},
1587+
},
1588+
});
1589+
serverless.service.stepFunctions = {
1590+
stateMachines: {
1591+
myStateMachine1: genStateMachine('StateMachine1'),
1592+
},
1593+
};
1594+
1595+
serverlessStepFunctions.compileIamRole();
1596+
const statements = serverlessStepFunctions.serverless.service
1597+
.provider.compiledCloudFormationTemplate.Resources.StateMachine1Role
1598+
.Properties.Policies[0].PolicyDocument.Statement;
1599+
1600+
const codeBuildPermissions = statements.filter(s => _.isEqual(s.Action, ['codebuild:StartBuild', 'codebuild:StopBuild', 'codebuild:BatchGetBuilds']));
1601+
expect(codeBuildPermissions).to.have.lengthOf(1);
1602+
expect(codeBuildPermissions[0].Resource).to.deep.eq([{
1603+
'Fn::Sub': [
1604+
`arn:aws:codebuild:$\{AWS::Region}:$\{AWS::AccountId}:project/${projectName}`,
1605+
{},
1606+
],
1607+
}]);
1608+
1609+
1610+
const eventPermissions = statements.filter(s => _.isEqual(s.Action, ['events:PutTargets', 'events:PutRule', 'events:DescribeRule']));
1611+
expect(eventPermissions).to.have.lengthOf(1);
1612+
expect(eventPermissions[0].Resource).to.deep.eq([{
1613+
'Fn::Sub': [
1614+
'arn:aws:events:${AWS::Region}:${AWS::AccountId}:rule/StepFunctionsGetEventForCodeBuildStartBuildRule',
1615+
{},
1616+
],
1617+
}]);
1618+
});
1619+
15631620
it('should give step functions permissions (too permissive, but mirrors console behaviour)', () => {
15641621
const stateMachineArn = 'arn:aws:states:us-east-1:123456789:stateMachine:HelloStateMachine';
15651622
const genStateMachine = id => ({
@@ -1935,7 +1992,6 @@ describe('#compileIamRole', () => {
19351992
.Properties.Policies[0].PolicyDocument.Statement;
19361993
const lambdaPermissions2 = statements2.filter(s => _.isEqual(s.Action, ['lambda:InvokeFunction']));
19371994
expect(lambdaPermissions2).to.have.lengthOf(1);
1938-
console.log(lambdaPermissions2);
19391995
expect(lambdaPermissions2[0].Resource).to.deep.equal([
19401996
'arn:aws:lambda:us-west-2:1234567890:function:foo',
19411997
'*limited*',

0 commit comments

Comments
 (0)