【问题标题】:How to create stages for AWS state machine?如何为 AWS 状态机创建阶段?
【发布时间】:2019-11-13 06:27:08
【问题描述】:

我创建了一个带有 lambda 函数的简单 AWS 状态机。如下所示

{
  "Comment":"Validates data",
  "StartAt": "ChooseDocumentType",
  "States": {
    "ChooseDocumentType": {      
      "Type": "Choice",
      "Choices":[
        {
          "Variable":"$.documentType",
          "StringEquals":"RETURN",
          "Next":"ValidateReturn"
        },
        {
          "Variable":"$.documentType",
          "StringEquals":"ASSESSMENT",
          "Next":"ValidateAssessment"
        }        
      ],
      "Default":"DefaultState"
    },
    "ValidateReturn":{
      "Type":"Task",
      "Resource":"arn:aws:lambda:us-west-2:111111111:function:ValidateReturn",
      "Next":"DefaultState"
    },
     "ValidateAssessment":{
      "Type":"Task",
      "Resource":"arn:aws:lambda:us-west-2:111111111:function:ValidateAssessment",
      "Next":"DefaultState"
    },
    "DefaultState":{
      "Type":"Pass",      
      "End":true
    }
  }
}

问题
1> 我如何为这个状态机创建阶段。 (如生产、开发等)?

2>每个 lambda 函数都有 alias 指向不同的版本。所以development 别名总是指向$latest 版本,而production 别名指向,比如说,版本2。我如何将状态机的阶段与这些 lambda 别名动态关联?所以development阶段的状态机应该使用lambda函数,别名development等等。

我正在使用 AWS 控制台来管理状态机和 lambda,但我没有看到任何为状态机创建阶段的操作

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-step-functions


    【解决方案1】:

    您可以在 Lambda ARN 中声明别名和版本:

    # default, $LATEST
    arn:aws:lambda:us-west-2:111111111:function:ValidateAssessment
    
    # using alias
    arn:aws:lambda:us-west-2:111111111:function:ValidateAssessment:development
    
    # using version
    arn:aws:lambda:us-west-2:111111111:function:ValidateAssessment:2
    

    根据您的需要在 Step Function 定义中使用这些。

    【讨论】:

    • 是的,但是别名或版本在这里是硬编码的。你如何使用变量作为别名?因此,例如在 AWS API Gateway 中,您可以使用变量 arn:aws:lambda:us-west-2:111111111:function:ValidateAssessment:${stageVariables.lambdaAlias} 调用 lambda,其中 lambdaAlias 是在 api 阶段定义的变量。 lambdaAlias 的值在每个阶段都会不同。如何在阶跃函数中应用相同的概念?
    • 我认为 Step Functions 不可能做到这一点。我会创建两个(或更多)独立的 Step Functions,一个用于开发阶段,一个用于生产阶段。或者,如果您想将所有内容都放在一个 SF 中,您可以在启动 SF 的有效负载中包含标志,并使用两个分支构建状态机。在开头添加一个选择状态,它查看有效负载并根据执行哪个分支来决定;类似于您的 SF 中的 documentType 选择。
    【解决方案2】:

    回复:# 2,如果您主要关心的是控制调用哪个 Lambda 别名,有一种方法可以通过单步函数来实现。

    您的阶跃函数状态定义类似于:

    {  
       "Type": "Task",
       "Resource": "arn:aws:states:::lambda:invoke",
       "Parameters": {  
          "InvocationType": "RequestResponse",
          "FunctionName": "someFunction",
          "Qualifier.$": "$.lambdaAlias",
          "Payload": {}
       },
    }
    

    因此,如果您执行 step 函数并指定阶段(如果有这样的事情),您将传递一个 lambdaAlias 参数。 (这个名字没有什么神奇之处,你可以从任何你想要的步进函数输入参数中提取它。)

    发送到您的 Lambda 的请求负载将进入 Parameters.Payload

    https://docs.aws.amazon.com/step-functions/latest/dg/connect-lambda.html

    【讨论】:

      猜你喜欢
      • 2020-05-30
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 2023-03-30
      • 1970-01-01
      • 2021-04-25
      • 2012-06-19
      相关资源
      最近更新 更多