web-dev-qa-db-ja.com

ステップ間でデータを渡さずに `AWSステップ関数`でデータを共有する方法

私が使う AWS Step Functionsそして次のワークフローがあります

AWS Step Functions workflow

initStep-これはラムダ関数ハンドラーであり、データを取得して外部サービスのために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

validationWaiting-データを含む外部サービスからの応答を待つのはactivityです。

complete-これはラムダ関数ハンドラーであり、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)

それは機能しますが、問題は、後でinitStepに渡すために、completeから外部サービスに完全なデータを送信していることです。潜在的に、より多くのステップを追加できます。

(現在のステップ関数の)ある種のグローバルデータとして共有する方がよいと思います。そうすれば、ステップを追加または削除でき、データは引き続きすべてのユーザーが利用できます。

4
Marina K.

Marcin Sucharski の答えに基づいて、私は独自の解決策を考え出しました。

initStepはSQSを送信するラムダであるため、Type: Taskを使用する必要がありました。

InputPathValidationWaitingは必要ありませんでしたが、アクティビティで受信したデータを格納するResultPathだけが必要でした。

私は Serverless フレームワークで作業しています。これが私の最終的な解決策です:

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
1
Marina K.