Как преобразовать stepfunction executionId в имя задания пакетного преобразования SageMaker?

#amazon-web-services #terraform #state-machine #amazon-sagemaker #aws-step-functions

#amazon-web-services #terraform #конечный автомат #amazon-sagemaker #aws-step-функции

Вопрос:

Я создал пошаговую функцию, определение для этой statemachine ниже ( step-function.json ) используется в terraform (используя синтаксис в этом page:https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html )

В первый раз, если я выполню эту statemachine, она создаст задание пакетного преобразования SageMaker с именем example-jobname , но мне нужно каждый день запускать эту statemachine, тогда это выдаст мне ошибку "error": "SageMaker.ResourceInUseException", "cause": "Job name must be unique within an AWS account and region, and a job with this name already exists .

Причина в том, что имя задания жестко запрограммировано, example-jobname поэтому, если конечный автомат запускается после первого раза, поскольку имя задания должно быть уникальным, задача завершится неудачей, просто интересно, как я могу добавить строку (что-то вроде executionId в конце имени задания). Вот что я пробовал:

  1. Я добавил "executionId.$": "States.Format('somestring {}', $$.Execution.Id)" Parameters раздел в файл json, но при выполнении задачи я получил сообщение об ошибке "error": "States.Runtime", "cause": "An error occurred while executing the state 'SageMaker CreateTransformJob' (entered at the event id #2). The Parameters '{"BatchStrategy":"SingleRecord",.............."executionId":"somestring arn:aws:states:us-east-1:xxxxx:execution:xxxxx-state-machine:xxxxxxxx72950"}' could not be used to start the Task: [The field "executionId" is not supported by Step Functions]"}
  2. Я изменил имя задания в файле json, чтобы "TransformJobName": "example-jobname-States.Format('somestring {}', $$.Execution.Id)", при запуске statemachine он выдавал ошибку: "error": "SageMaker.AmazonSageMakerException", "cause": "2 validation errors detected: Value 'example-jobname-States.Format('somestring {}', $$.Execution.Id)' at 'transformJobName' failed to satisfy constraint: Member must satisfy regular expression pattern: ^[a-zA-Z0-9](-*[a-zA-Z0-9]){0,62}; Value 'example-jobname-States.Format('somestring {}', $$.Execution.Id)' at 'transformJobName' failed to satisfy constraint: Member must have length less than or equal to 63

У меня действительно закончились идеи, может кто-нибудь помочь, пожалуйста? Большое спасибо.

Ответ №1:


Итак, согласно документации, мы должны передавать параметры в следующем формате

         "Parameters": {
            "ModelName.$": "$.Execution.Name",  
            ....
        },
 

Если вы внимательно посмотрите, в вашем определении чего-то не хватает, поэтому ваше определение пошаговой функции должно быть примерно таким, как показано ниже:

либо

       "TransformJobName.$": "$.Execution.Id",
 

или

       "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
        }
        }
    }
 

В приведенном выше определении лямбда-символом может быть функция, которая анализирует идентификатор выполнения arn, который я передаю через раздел параметров:

  def lambda_handler(event, context):
    return(event.get('executionId').split(':')[-1])
 

Или, если вы не хотите передавать идентификатор выполнения, он может просто вернуть случайную строку, например

  import string
 def lambda_handler(event, context):
    return(string.ascii_uppercase   string.digits)
 

вы можете генерировать все виды случайных строк или генерировать что-либо в лямбда-выражении и передавать это в имя задания преобразования.

Комментарии:

1. Привет, я использовал "TransformJobName.$": "$$.Execution.Id", , но когда я запускаю statemachine, он выдает мне ошибку: « «ошибка»: «SageMaker. AmazonSageMakerException», «причина»: «Обнаружено 2 ошибки проверки: значение ‘arn:aws:states:us-east-1:xxx:execution:xxx-state-machine:070xxx3-xxxx-xxx-xxxx-xxxxxxxxx_xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx ‘ в ‘transformJobName’ произошел сбойчтобы удовлетворить ограничению: элемент должен удовлетворять шаблону регулярного выражения: ^[a-zA-Z0-9] (-* [a-zA-Z0-9]) {0,62}; Значение ‘arn: xxxxxx’ в ‘transformJobName’ не удалось выполнить ограничение: элемент должен иметь длину меньше илиравно 63«

2. как мы уже говорили ранее в теме, и я пытался описать в этой статье, вы получите arn с идентификатором выполнения, поэтому вам нужно извлечь идентификатор из arn.

3. @Cecilia в ответ на нее я добавил код для обоих способов <синтаксический анализ идентификатора выполнения arn и генерация случайной строки> пожалуйста, взгляните

4. @Сесилия рада, что это сработало. У вас впереди хороший день!!

5. @Cecilia вы можете использовать moto для написания модульных тестов.

Ответ №2:

Я хотел бы подкинуть еще одну идею. Вы можете использовать, если это применимо, также другой executionId или другой уникальный идентификатор из предыдущей задачи.

Я запускаю задание BatchTransform после успешного выполнения GlueJob. Поэтому я могу взять выходные переменные и объединить их в задании BatchTransform для использования нового TransformJobName.

"TransformJobName.$": "States.Format('scoring-titanic-{}', $.CompletedOn)"