Skip to content

Commit e0a391d

Browse files
authored
Merge pull request #413 from janyk/master
feat: add IAM Role support for createTransformJob.sync
2 parents 348cb89 + 4062814 commit e0a391d

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed

lib/deploy/stepFunctions/compileIamRole.js

+32
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,35 @@ function getCodeBuildPermissions(state) {
286286
}];
287287
}
288288

289+
function getSageMakerPermissions(state) {
290+
const transformJobName = state.Parameters.TransformJobName ? `${state.Parameters.TransformJobName}` : '';
291+
292+
return [
293+
{
294+
action: 'sagemaker:CreateTransformJob,sagemaker:DescribeTransformJob,sagemaker:StopTransformJob',
295+
resource: {
296+
'Fn::Sub': [
297+
`arn:aws:sagemaker:$\{AWS::Region}:$\{AWS::AccountId}:transform-job/${transformJobName}*`,
298+
{},
299+
],
300+
},
301+
},
302+
{
303+
action: 'sagemaker:ListTags',
304+
resource: '*',
305+
},
306+
{
307+
action: 'events:PutTargets,events:PutRule,events:DescribeRule',
308+
resource: {
309+
'Fn::Sub': [
310+
'arn:aws:events:${AWS::Region}:${AWS::AccountId}:rule/StepFunctionsGetEventsForSageMakerTransformJobsRule',
311+
{},
312+
],
313+
},
314+
},
315+
];
316+
}
317+
289318
// if there are multiple permissions with the same action, then collapsed them into one
290319
// permission instead, and collect the resources into an array
291320
function consolidatePermissionsByAction(permissions) {
@@ -370,6 +399,9 @@ function getIamPermissions(taskStates) {
370399
case 'arn:aws:states:::codebuild:startBuild.sync':
371400
return getCodeBuildPermissions(state);
372401

402+
case 'arn:aws:states:::sagemaker:createTransformJob.sync':
403+
return getSageMakerPermissions(state);
404+
373405
default:
374406
if (isIntrinsic(state.Resource) || state.Resource.startsWith('arn:aws:lambda')) {
375407
const trimmedArn = trimAliasFromLambdaArn(state.Resource);

lib/deploy/stepFunctions/compileIamRole.test.js

+72
Original file line numberDiff line numberDiff line change
@@ -2035,4 +2035,76 @@ describe('#compileIamRole', () => {
20352035
'*limited*',
20362036
]);
20372037
});
2038+
2039+
it('should give sagemaker batch transform permissions', () => {
2040+
const genStateMachine = id => ({
2041+
id,
2042+
definition: {
2043+
StartAt: 'A',
2044+
States: {
2045+
A: {
2046+
Type: 'Task',
2047+
Resource: 'arn:aws:states:::sagemaker:createTransformJob.sync',
2048+
Parameters: {
2049+
ModelName: 'a-model-name',
2050+
TransformInput: {
2051+
CompressionType: 'None',
2052+
ContentType: 'text/csv',
2053+
DataSource: {
2054+
S3DataSource: {
2055+
S3DataType: 'S3Prefix',
2056+
S3Uri: 's3://your-bucket',
2057+
},
2058+
},
2059+
},
2060+
TransformOutput: {
2061+
S3OutputPath: 's3://your-bucket/TrasformOutputPath',
2062+
},
2063+
TransformResources: {
2064+
InstanceCount: 1,
2065+
InstanceType: 'ml.m4.xlarge',
2066+
},
2067+
TransformJobName: 'your-job-name',
2068+
},
2069+
End: true,
2070+
},
2071+
},
2072+
},
2073+
});
2074+
2075+
serverless.service.stepFunctions = {
2076+
stateMachines: {
2077+
myStateMachine1: genStateMachine('StateMachine1'),
2078+
},
2079+
};
2080+
2081+
serverlessStepFunctions.compileIamRole();
2082+
const statements = serverlessStepFunctions.serverless.service
2083+
.provider.compiledCloudFormationTemplate.Resources.StateMachine1Role
2084+
.Properties.Policies[0].PolicyDocument.Statement;
2085+
2086+
const transformPermissions = statements.filter(s => _.isEqual(s.Action, ['sagemaker:CreateTransformJob', 'sagemaker:DescribeTransformJob', 'sagemaker:StopTransformJob']));
2087+
expect(transformPermissions).to.have.lengthOf(1);
2088+
expect(transformPermissions[0].Resource).to.deep.eq([
2089+
{
2090+
'Fn::Sub': [
2091+
'arn:aws:sagemaker:${AWS::Region}:${AWS::AccountId}:transform-job/your-job-name*',
2092+
{},
2093+
],
2094+
},
2095+
]);
2096+
2097+
const listTagPermission = statements.filter(s => _.isEqual(s.Action, ['sagemaker:ListTags']));
2098+
expect(listTagPermission).to.have.lengthOf(1);
2099+
expect(listTagPermission[0].Resource).to.equal('*');
2100+
2101+
const eventPermissions = statements.filter(s => _.isEqual(s.Action, ['events:PutTargets', 'events:PutRule', 'events:DescribeRule']));
2102+
expect(eventPermissions).to.has.lengthOf(1);
2103+
expect(eventPermissions[0].Resource).to.deep.eq([{
2104+
'Fn::Sub': [
2105+
'arn:aws:events:${AWS::Region}:${AWS::AccountId}:rule/StepFunctionsGetEventsForSageMakerTransformJobsRule',
2106+
{},
2107+
],
2108+
}]);
2109+
});
20382110
});

0 commit comments

Comments
 (0)