J'utilise AWS Step Functions
et avoir le flux de travail suivant
initStep - C'est un gestionnaire de fonctions Lambda, qui reçoit des données et l'envoie à SQS
pour un service externe.
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 - c'est un activity
qui attend une réponse du service externe qui incluent les données.
Complete - C'est un gestionnaire de fonctions Lambda qui utilise les données du 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)
Cela fonctionne, mais le problème est que j'envoie des données complètes du service initStep
au service externe, juste pour le transmettre ultérieurement à complete
. Des étapes potentiellement plus peuvent être ajoutées.
Je crois qu'il serait préférable de le partager comme une sorte de données globales (de la fonction de pas en cours), de cette façon, je pourrais ajouter ou supprimer des étapes et des données seraient toujours disponibles pour tous.
Basé sur la réponse de Marcin Sublarski J'ai proposé ma propre solution.
J'avais besoin d'utiliser Type: Task
Depuis initStep
est une Lambda, qui envoie des SQS.
Je n'ai pas eu besoin de InputPath
in ValidationWaiting
, mais seulement ResultPath
, qui stockent les données reçues dans l'activité.
Je travaille avec Server Server Cadre, voici ma solution finale:
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