所以根据文档 https://docs.aws.amazon.com/step-functions/latest/dg/sample-train-model.html#sample-train-model-code-examples,我们应该按以下格式传递参数
"Parameters": {
"ModelName.$": "$$.Execution.Name",
....
},
如果您仔细查看,您的定义中缺少一些内容,因此您的步骤函数定义应该如下所示:
either
"TransformJobName.$": "$$.Execution.Id",
OR
"TransformJobName.$: "States.Format('mytransformjob{}', $$.Execution.Id)"
完整的状态机定义:
{
"Comment": "Defines the statemachine.",
"StartAt": "Generate Random String",
"States": {
"Generate Random String": {
"Type": "Task",
"Resource": "arn:aws:lambda:eu-central-1:1234567890:function:randomstring",
"ResultPath": "$.executionid",
"Parameters": {
"executionId.$": "$$.Execution.Id"
},
"Next": "SageMaker CreateTransformJob"
},
"SageMaker CreateTransformJob": {
"Type": "Task",
"Resource": "arn:aws:states:::sagemaker:createTransformJob.sync",
"Parameters": {
"BatchStrategy": "SingleRecord",
"DataProcessing": {
"InputFilter": "$",
"JoinSource": "Input",
"OutputFilter": "xxx"
},
"Environment": {
"SAGEMAKER_MODEL_SERVER_TIMEOUT": "300"
},
"MaxConcurrentTransforms": 100,
"MaxPayloadInMB": 1,
"ModelName": "${model_name}",
"TransformInput": {
"DataSource": {
"S3DataSource": {
"S3DataType": "S3Prefix",
"S3Uri": "${s3_input_path}"
}
},
"ContentType": "application/jsonlines",
"CompressionType": "Gzip",
"SplitType": "Line"
},
"TransformJobName.$": "$.executionid",
"TransformOutput": {
"S3OutputPath": "${s3_output_path}",
"Accept": "application/jsonlines",
"AssembleWith": "Line"
},
"TransformResources": {
"InstanceType": "xxx",
"InstanceCount": 1
}
},
"End": true
}
}
}
在上面的定义中,lambda 可以是一个解析我通过参数部分传递的执行 id arn 的函数:
def lambda_handler(event, context):
return(event.get('executionId').split(':')[-1])
或者,如果您不想通过执行 if ,它可以简单地返回随机字符串,例如
import string
def lambda_handler(event, context):
return(string.ascii_uppercase + string.digits)
您可以生成各种随机字符串,或者在 lambda 中生成任何内容并将其传递给转换作业名称。