Skip to content

Commit b1669d7

Browse files
Merge pull request #211 from horike37/feature/lambda_invoke_resource
feat: support lambda:invoke resource type
2 parents e1511ab + 39aa3e1 commit b1669d7

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

lib/deploy/stepFunctions/compileIamRole.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ function getIamPermissions(serverless, taskStates) {
242242
case 'arn:aws:states:::ecs:runTask':
243243
return getEcsPermissions();
244244

245+
case 'arn:aws:states:::lambda:invoke':
245246
case 'arn:aws:states:::lambda:invoke.waitForTaskToken':
246247
return getLambdaPermissions(state);
247248

lib/deploy/stepFunctions/compileIamRole.test.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,4 +1151,58 @@ describe('#compileIamRole', () => {
11511151
];
11521152
expect(lambdaPermissions[0].Resource).to.deep.eq(lambdaArns);
11531153
});
1154+
1155+
it('should support lambda::invoke resource type', () => {
1156+
const getStateMachine = (name, functionName) => ({
1157+
name,
1158+
definition: {
1159+
StartAt: 'A',
1160+
States: {
1161+
A: {
1162+
Type: 'Task',
1163+
Resource: 'arn:aws:states:::lambda:invoke',
1164+
Parameters: {
1165+
FunctionName: functionName,
1166+
Payload: {
1167+
'ExecutionName.$': '$$.Execution.Name',
1168+
},
1169+
},
1170+
End: true,
1171+
},
1172+
},
1173+
},
1174+
});
1175+
1176+
// function name can be...
1177+
const lambda1 = 'a'; // name-only
1178+
const lambda2 = 'b:v1'; // name-only with alias
1179+
const lambda3 = 'arn:aws:lambda:us-west-2:1234567890:function:c'; // full arn
1180+
const lambda4 = '1234567890:function:d'; // partial arn
1181+
1182+
serverless.service.stepFunctions = {
1183+
stateMachines: {
1184+
myStateMachine1: getStateMachine('sm1', lambda1),
1185+
myStateMachine2: getStateMachine('sm2', lambda2),
1186+
myStateMachine3: getStateMachine('sm3', lambda3),
1187+
myStateMachine4: getStateMachine('sm4', lambda4),
1188+
},
1189+
};
1190+
1191+
serverlessStepFunctions.compileIamRole();
1192+
const statements = serverlessStepFunctions.serverless.service
1193+
.provider.compiledCloudFormationTemplate.Resources.IamRoleStateMachineExecution
1194+
.Properties.Policies[0].PolicyDocument.Statement;
1195+
1196+
const lambdaPermissions = statements.filter(s =>
1197+
_.isEqual(s.Action, ['lambda:InvokeFunction']));
1198+
expect(lambdaPermissions).to.have.lengthOf(1);
1199+
1200+
const lambdaArns = [
1201+
{ 'Fn::Sub': 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:a' },
1202+
{ 'Fn::Sub': 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:b:v1' },
1203+
'arn:aws:lambda:us-west-2:1234567890:function:c',
1204+
{ 'Fn::Sub': 'arn:aws:lambda:${AWS::Region}:1234567890:function:d' },
1205+
];
1206+
expect(lambdaPermissions[0].Resource).to.deep.eq(lambdaArns);
1207+
});
11541208
});

0 commit comments

Comments
 (0)