Как ссылаться на динамический c лямбда-ARN в AWS Step-функциях, написанных в бессерверной платформе? - PullRequest
1 голос
/ 28 мая 2020

EDIT: только что нашел это https://github.com/serverless-operations/serverless-step-functions/issues/209 В основном этот пример, но вместо жесткого кодирования ARN я хочу использовать входную переменную, если это имеет смысл.

Вот контекст:

Используя бессерверные места назначения ошибок, полезные данные об ошибке отправляются в SQS, который запускает лямбда-выражение, которое запускает конечный автомат для выполнения повторной попытки.

Например, если Lambda A дает сбой, сбой отправляется в SQS -> Lambda B, который запускает конечный автомат, чтобы повторить попытку Lambda A.

Я определяю свой конечный автомат в Serverless. yml вот так (это то, что я пробовал до сих пор):

stepFunctions:
  stateMachines:
    MyStateMachine:
      name: RetryLambdaMachine
      definition:
        Comment: Example to test retries
        StartAt: StepOne
        States:
          StepOne:
            Type: Task
            Resource: arn:aws:states:::lambda:invoke
            Parameters:
            - FunctionName.$: $$.lambdaArn 
            #### ^^ This is where I need Lambda A to be referenced ####
            Retry:
            - ErrorEquals: 
              - States.ALL
              MaxAttempts: 2
            Catch:
            - ErrorEquals: ["States.ALL"]
              Next: CatchAllFallback
            End: true
          CatchAllFallback:
            Type: Task
            Resource: 
              Fn::GetAtt: [lambda_c, Arn]
            End: true

Вот ошибка, которую я получаю при запуске serverless deploy:

Error: The CloudFormation template is invalid: [/Resources/RetryLambdasMachineRole/Type/Policies/0/PolicyDocument/Statement/0/Resource/0] 'null' values are not allowed in templates

Как мне ссылаться на Lambda A как на переменную? Я знаю, что атрибуты ошибки будут содержать ARN лямбда A, но как передать это в конечный автомат для шага повтора?

Примечание. Лямбда A НЕ определена в этом Serverless.yml, она может исходить из везде. Как указано выше, ARN будет передан как часть события ошибки, поступающей от SQS.

1 Ответ

1 голос
/ 29 мая 2020

Я обнаружил, что мой исходный код на самом деле был довольно близок. Единственная проблема заключалась в том, что перед ключом FunctionName был дефис и дополнительный символ '$' в lambdaArn.

    States:
      StepOne:
        Type: Task
        Resource: arn:aws:states:::lambda:invoke
        Parameters:
          FunctionName.$: $.lambdaArn

Это позволяет передавать лямбду как ресурс c * * * * *.

...