web-dev-qa-db-fra.com

Comment partager des données dans `AWS Step Fonctions» sans le transmettre entre les étapes

J'utilise AWS Step Functions et avoir le flux de travail suivant

AWS Step Functions workflow

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.

8
Marina

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