标签: aws-step-functions

无服务器:根配置错误:无法识别的属性“stepFunctions”

我有一些奇怪的错误,我无法找出原因,你能帮助我吗?

...
无服务器:警告:无法找到名为:TypeScriptPlugin
无服务器:根配置错误:无法识别的属性“stepFunctions”
...

无服务器.yml

service:
  name: service-name

plugins:
  - serverless-localstack
  - serverless-step-functions
  - serverless-pseudo-parameters
  - serverless-webpack

custom:
  webpackIncludeModules: true
  localstack:
    stages:
      - local
    host: http://localhost
    edgePort: 4566
    autostart: true
    lambda:
      mountCode: false
    debug: true
    docker:
      sudo: true

provider:
  configValidationMode: off
  deploymentBucket:
    name: local
  name: aws
  runtime: nodejs12.x
  stage: ${opt:stage, "dev"}
  region: ${env:AWS_REGION, "us-east-1"}
  logRetentionInDays: 30

functions:
  ...

stepFunctions:
  ...
Run Code Online (Sandbox Code Playgroud)

包.json

{
  "name": "service-name",
  "version": "0.119.0",
  "description": "Service decription.",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-step-functions serverless localstack

5
推荐指数
1
解决办法
8654
查看次数

在 AWS Step Function 的并行状态下,如果一个分支失败,是否有办法确保其他分支继续执行直至完成?

我有一个具有并行状态的步进函数,该函数有四个分支(A、B、C、D),每个分支都有 3 个 Glue StartJobRun 任务状态。如果分支 A 在第一个任务期间失败,我如何确保其他分支在成功后继续执行其任务?

amazon-web-services boto3 aws-step-functions

5
推荐指数
1
解决办法
5837
查看次数

AWS - StepFunctions:如何使用 CodePipeline 中上一阶段的 StepFunctions 访问工件?

我有以下管道:

AWS - Codepipeline 流程

我在将源 (GitHub) 阶段的输出工件链接到 StepFunctions 阶段的输入工件时遇到问题。

我的目标是让 StepFunctions 阶段能够访问源阶段输出到的最后一个 zip 文件名(在 S3 存储桶上)。

我已经尝试过:

  1. 在 Source 阶段定义命名空间以在 StepFunctions 阶段使用它。链接到文档:https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-variables.html

  2. 阅读此文档:https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-step-functions.html

  3. 新案例:使用 Lambda 代替 StepFunctions 进行阶段,它从源阶段接收到 S3 文件夹和其他元数据的链接,而 StepFunctions 则不会。

github amazon-web-services devops aws-codepipeline aws-step-functions

5
推荐指数
0
解决办法
342
查看次数

AWS Step 函数字符串/json 连接

我使用 AWS Step 函数编排了数据管道。在最后一个状态中,我想发送自定义通知。我正在使用内部函数 States.Format 来格式化我的消息和主题。它适用于 Context 对象元素。在这里,我在 Message 参数中测试了这一点。但它不适用于输入 JSON。这是我的输入 JSON { "job-param":{ "pipe-line-name":"我的管道名称", "other-keys":"其他值" } }

 "Success State": {
  "Type": "Task",     
  "Resource": "arn:aws:states:::sns:publish",
  "Parameters": {    

  "Message.$": "States.Format('Execution Id:{}, completed successfully!', $$.Execution.Id)",
  "Subject.$": "States.Format('[INFO] {} completed successfully!', $.job-param.pipe-line-name)",

  "TopicArn": "arn:aws:sns:us-east-1:************:sns-topic"
  },
  "End": true
}
Run Code Online (Sandbox Code Playgroud)

保存此状态机时,它给出以下错误消息:

“Subject.$”字段的值必须是有效的 JSON 路径

我检查了输入和结果路径。他们有这个价值。我可以直接使用这个值作为参数。这工作正常。但我无法使用其他字符串进行格式化。

"Subject.$": "$.job-param.pipe-line-name"
Run Code Online (Sandbox Code Playgroud)

另一种方法是调用 lambda 来自定义并触发 SNS。但我想避免这种情况。

我可以请求一些建议来修复此错误吗?

提前致谢!

json amazon-web-services aws-step-functions

5
推荐指数
1
解决办法
2万
查看次数

重试并捕获 AWS Step Function 任务

对于 StepFunctions,我们是否可以两者兼而有之Retry,并Catch在穷尽的情况下共同努力?

这是我的用例

  1. 作业失败
  2. 重试
  3. 重试耗尽,转至 Catch
  4. 捕获所有错误,移至下一个作业,并更新数据库表以标记此作业失败(另一项任务)
  5. 或者在第一次运行或重试成功后,转移到下一个作业
    "ExecuteMyJob": {
            "Type": "Task",
            "Resource": "arn:aws:states:::glue:startJobRun.sync",
            "Parameters": {
                "JobName.$": "$.jobName",
                "Arguments.$": "$.jobArguments"
            },
            "Retry" : [{
                "ErrorEquals": [ "States.TaskFailed", "States.Runtime" ],
                "MaxAttempts": 3,
                "IntervalSeconds": 60,
                "BackoffRate": 2
            }],
            "Catch": [{
                "ErrorEquals": [ "States.ALL" ],
                "Next": "MarkJobFailOnDbTable"
            }],
            "Next": "NextJobOnPreviousSuccess"
        }
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-step-functions

5
推荐指数
1
解决办法
4409
查看次数

如何使用Terraform定义cloundwatch事件规则来触发StepFunction状态机

我已经在 Terraform 中定义了 StepFunction 状态机的创建,现在我想设置一个计时器来每天触发状态机,我认为使用 cloudwatch 事件规则可能是一个不错的选择,我知道如何设置事件规则来触发 Lambda :

resource "aws_cloudwatch_event_rule" "lambda_event_rule" {
  name                = xxx
  schedule_expression = xxx
  description         = xxx
}

resource "aws_cloudwatch_event_target" "lambda_event_target" {
  target_id = xxx
  rule      = aws_cloudwatch_event_rule.lambda_event_rule.name
  arn       = xxx
}

#I must setup the right permissions using 'aws_lambda_permission' 
#see: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_event_target

resource "aws_lambda_permission" "lambda_event_permission" {
  statement_id  = xxx
  action        = "lambda:InvokeFunction"
  function_name = xxx
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.lambda_event_rule.name
}
Run Code Online (Sandbox Code Playgroud)

但如何设置触发状态机的权限部分?我找不到任何关于它的例子,我错过了什么吗?是因为我们不需要状态机的权限配置吗?有人可以帮忙吗?

以下是到目前为止我使用 cloudwatch 事件规则触发状态机的内容:

resource "aws_cloudwatch_event_rule" "step_function_event_rule" {
  name                = xxx
  schedule_expression = …
Run Code Online (Sandbox Code Playgroud)

state-machine amazon-web-services terraform aws-step-functions amazon-cloudwatch-events

5
推荐指数
1
解决办法
8464
查看次数

如何在AWS Step Functions中实现手动审批?SWF 和 Step Functions 之间推荐的工作流引擎是什么?

Step Functions 现在支持回调功能以支持手动批准。我想知道任务令牌是如何生成的,以及我们是否可以传递自己的任务令牌字符串,以便我们不需要存储它来标记任务通过/失败。

此外,对于需要多个客户端交互才能进入下一个状态的工作流程,建议使用 Step Functions 或 SWF(及其信号)。

用例:我在工作流程中有多个步骤,如果计时器达到 6 个月,或者如果在这 6 个月内用户实际批准,则我们需要执行失败场景,那么工作流程需要执行到通过的场景。

workflow amazon-web-services amazon-swf aws-step-functions

5
推荐指数
1
解决办法
4210
查看次数

如何等待 AWS ECS 任务处于 RUNNING 状态,然后再转到 AWS Step Function 中的下一步?

我有一个对象数组,我想将其迭代传递给 Lambda 函数。但是,我还需要为我启动的每个 Lambda 函数运行一个 ECS 任务。

我发现我需要一个 AWS Step Function,用于迭代 JSON 输入数组。对于每个输入,我必须启动一个 ECS 任务,等待它处于 RUNNING 状态,然后转到下一步,调用 Lambda 函数。就我而言,ECS 任务本身不返回任何内容。它应该保持运行,因为 Lambda 函数使用它。

目前,我拥有它,以便 ECS 任务启动,但它停留在启动 ECS 任务步骤,因为它不返回任何内容。在进入下一步之前,我如何才能等待它处于 RUNNING 状态?

当前阶跃函数定义:

{
  "StartAt": "Iterate",
  "States": {
    "Iterate": {
      "Type": "Map",
      "Iterator": {
        "StartAt": "Start ECS Task",
        "States": {
          "Start ECS Task": {
            "Type": "Task",
            "Resource": "arn:aws:states:::ecs:runTask",
            "Parameters": {
              "LaunchType": "FARGATE",
              "Cluster": "<cluster-arn>",
              "TaskDefinition": "<task-definition-arn>",
              "NetworkConfiguration": {
                "AwsvpcConfiguration": {
                  "Subnets": [
                    "<subnet-id>"
                  ],
                  "AssignPublicIp": "ENABLED"
                }
              }
            },
            "Next": "Invoke Lambda function" …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-ecs aws-lambda aws-step-functions

5
推荐指数
1
解决办法
5509
查看次数

具有动态环境变量的 AWS CDK StateMachine BatchSubmitJob

我正在尝试在 AWS CDK 中创建一个带有 BatchSubmitJob 的状态机,并在 BatchContainerOverrides 中使用动态环境变量。我在想这样的事情:

container_overrides = sfn_tasks.BatchContainerOverrides(
    environment={
        "TEST.$": "$.dynamic_from_payload"
    }
)

return sfn_tasks.BatchSubmitJob(self.scope,
                                id="id",
                                job_name="name",
                                job_definition_arn="arn",
                                job_queue_arn="arn",
                                container_overrides=container_overrides,
                                payload=sfn.TaskInput.from_object({
                                    "dynamic_from_payload.$": "$.input.some_variable"
                                }))
Run Code Online (Sandbox Code Playgroud)

但是,在部署时,CDK 会将“名称”和“值”添加到状态机定义中,但值现在是静态的。这是状态机定义的一部分,如控制台中所示:

"Environment": [
    {
        "Name": "TEST.$",
        "Value": "$.dynamic_from_payload"
    }
]
Run Code Online (Sandbox Code Playgroud)

但我需要这样:

"Environment": [
    {
        "Name": "TEST",
        "Value.$": "$.dynamic_from_payload"
    }
]
Run Code Online (Sandbox Code Playgroud)

我还尝试使用“Ref::”,如此处对命令参数所做的那样:AWS Step 和 Batch Dynamic Command。但这也行不通。

我还研究了逃生舱口,覆盖了 CloudFormation 模板。但我认为这不适用于此处,因为生成的状态机定义字符串基本上是一个大字符串。

我可以想到两种解决方案,但这两种解决方案都不让我高兴:用转义舱口覆盖状态机定义字符串,并使用其中“值”在某些条件下被替换的副本(可能使用正则表达式)或将 lambda 放入状态机中这将创建并触发批处理作业以及一个将轮询作业是否完成的 lambda。

长话短说:有人知道如何在 CDK 中将动态环境变量与 BatchSubmitJob 一起使用吗?

aws-step-functions aws-batch aws-cdk

5
推荐指数
1
解决办法
918
查看次数

AWS HTTP API 与 AWS Step Functions 集成 -&gt; 在输入中发送多个值

我有一个Type: AWS::Serverless::HttpApi正在尝试连接到 aType: AWS::Serverless::StateMachine作为触发器。这意味着 HTTP API 将触发 Step Function 状态机。

我只需指定一个输入就可以让它工作。例如,DefinitionBody当它工作时,看起来像这样:

      DefinitionBody:
        info:
          version: '1.0'
          title:
            Ref: AWS::StackName
        paths:
          "/github/secret":
            post:
              responses: 
                default:
                  description: "Default response for POST /"
              x-amazon-apigateway-integration:
                integrationSubtype: "StepFunctions-StartExecution"
                credentials:
                  Fn::GetAtt: [StepFunctionsApiRole, Arn]
                requestParameters:
                  Input: $request.body
                  StateMachineArn: !Ref SecretScannerStateMachine
                payloadFormatVersion: "1.0"
                type: "aws_proxy"
                connectionType: "INTERNET"
                timeoutInMillis: 30000
        openapi: 3.0.1
        x-amazon-apigateway-importexport-version: "1.0"
Run Code Online (Sandbox Code Playgroud)

请注意以下行:Input: $request.body。我只是指定$request.body.

但是,我需要能够发送$request.body$request.header.X-Hub-Signature-256。我需要将这两个值作为输入发送到我的状态机。

我尝试过很多不同的方法。例如:

Input: " { body: $request.body, header: $request.header.X-Hub-Signature-256 }" …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-lambda aws-api-gateway aws-step-functions aws-http-api

5
推荐指数
1
解决办法
720
查看次数