如何在“AWS Step Functions”中共享数据而不在步骤之间传递数据

Mar*_* K. 8 python amazon-web-services aws-step-functions

我使用AWS Step Functions并拥有以下工作流程

AWS Step Functions 工作流程

initStep - 这是一个 lambda 函数处理程序,它获取一些数据并将其发送给SQS外部服务。

activity = os.getenv('ACTIVITY')
queue_name = os.getenv('QUEUE_NAME')

def lambda_handler(event, context):
  event['my_activity'] = activity
  data = json.dumps(event)

  # Retrieving a queue by its name
  sqs = boto3.resource('sqs')
  queue = sqs.get_queue_by_name(QueueName=queue_name)

  queue.send_message(MessageBody=data, MessageGroupId='messageGroup1' + str(datetime.time(datetime.now())))

  return event
Run Code Online (Sandbox Code Playgroud)

validationWaiting - 它activity等待来自包含数据的外部服务的答案。

complete - 它是一个 lambda 函数处理程序,它使用initStep.

def lambda_handler(event, context):
  email = event['email'] if 'email' in event else None
  data = event['data'] if 'data' in event else None

  client = boto3.client(service_name='ses')
  to = email.split(', ')
  message_conrainer = {'Subject': {'Data': 'Email from step functions'},
           'Body': {'Html': {
               'Charset': "UTF-8",
               'Data': """<html><body>
                            <p>""" + data """</p>
                            </body> </html> """
           }}}

  destination = {'ToAddresses': to,
               'CcAddresses': [],
               'BccAddresses': []}

  return client.send_email(Source=from_addresses,
                         Destination=destination,
                         Message=message_container)
Run Code Online (Sandbox Code Playgroud)

它确实有效,但问题是我将完整数据从initStep外部服务发送到外部服务,只是为了稍后将其传递给complete. 可能会添加更多步骤。

我相信最好将其作为某种全局数据(当前步骤函数的)共享,这样我就可以添加或删除步骤,并且数据仍然可供所有人使用。

Mar*_* K. 3

根据Marcin Sucharski的回答,我想出了自己的解决方案。

我需要使用Type: TasksinceinitStep是一个lambda,它发送SQS。

我不需要InputPathin ValidationWaiting,而只需要ResultPath,它存储在活动中收到的数据。

我使用无服务器框架,这是我的最终解决方案:

StartAt: initStep
States: 
  initStep:
    Type: Task
    Resource: arn:aws:lambda:#{AWS::Region}:#{AWS::AccountId}:function:init-step
    Next: ValidationWaiting
  ValidationWaiting:
    Type: Task
    ResultPath: $.validationOutput
    Resource: arn:aws:states:#{AWS::Region}:#{AWS::AccountId}:activity:validationActivity
    Next: Complete
    Catch:
      - ErrorEquals:
        - States.ALL
      ResultPath: $.validationOutput
      Next: Complete
  Complete:
    Type: Task
    Resource: arn:aws:lambda:#{AWS::Region}:#{AWS::AccountId}:function:complete-step
    End: true
Run Code Online (Sandbox Code Playgroud)