如何在无服务器框架编写的 AWS Step Functions 中引用动态 lambda ARN?

Ent*_*ord 4 serverless-framework aws-step-functions

编辑:刚刚找到这个https://github.com/serverless-operations/serverless-step-functions/issues/209基本上就是这个例子,但我不想对 ARN 进行硬编码,而是想使用输入变量(如果有意义的话)。

这是上下文:

使用 Serverless 的错误目标,错误负载会发送到 SQS,SQS 会触发 lambda,启动状态机来执行重试。

例如,如果 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
Run Code Online (Sandbox Code Playgroud)

这是我运行时遇到的错误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
Run Code Online (Sandbox Code Playgroud)

如何将 Lambda A 引用为变量?我知道错误属性将包含 Lambda A 的 ARN,但如何将其传递到状态机以执行重试步骤?

注意:Lambda A 未在此 Serverless.yml 中定义,它可以来自任何地方。如上所述,ARN 将作为来自 SQS 的错误事件的一部分传入。

Ent*_*ord 5

我发现我原来的代码实际上非常接近。唯一的问题是 FunctionName 键前面有一个连字符,并且 lambdaArn 上有一个额外的“$”。

    States:
      StepOne:
        Type: Task
        Resource: arn:aws:states:::lambda:invoke
        Parameters:
          FunctionName.$: $.lambdaArn
Run Code Online (Sandbox Code Playgroud)

这允许 lambda 作为动态资源传入。