私が使う AWS Step Functions
そして次のワークフローがあります
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
から外部サービスに完全なデータを送信していることです。潜在的に、より多くのステップを追加できます。
(現在のステップ関数の)ある種のグローバルデータとして共有する方がよいと思います。そうすれば、ステップを追加または削除でき、データは引き続きすべてのユーザーが利用できます。
Marcin Sucharski の答えに基づいて、私は独自の解決策を考え出しました。
initStep
はSQSを送信するラムダであるため、Type: Task
を使用する必要がありました。
InputPath
にValidationWaiting
は必要ありませんでしたが、アクティビティで受信したデータを格納する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