为什么我的aws step函数的执行不是从我输入的ARN开始的?

时间:2019-10-28 16:17:23

标签: javascript node.js amazon-web-services aws-sdk aws-step-functions

我正在我正在处理的项目中使用AWS Step函数创建一个新的状态机。但是,当我尝试使用aws-sdk开始执行step函数时,出现“ StateMachineDoesNotExist”错误。看来我作为输入传递的stateMachineArn与startExecution函数使用的输入不同。

这是我尝试开始执行的方式:

const AWS = require('aws-sdk') 
const stepfunctions = new AWS.StepFunctions()

  const params = {
    stateMachineArn: process.env.ORDER_ACCEPTED_MACHINE_ARN,
    name: `${orderId}-${moment().unix()}`,
    input: JSON.stringify({
      orderAcceptedTimestamp: moment(createdAt).add(1, 'minutes').toISOString(),
      orderId,
    }),
  }

  const success = await stepfunctions.startExecution(params).promise()
  return success.executionArn

我的stateMachineArn是这样定义的:

process.env.ORDER_ACCEPTED_MACHINE_ARN = 'arn:aws:states:eu-central-1:935080471983:stateMachine:orderAcceptedMachine-dev'

这是我在运行代码时收到的错误消息:

State Machine Does Not Exist: 'arn:aws:states:us-east-1:935080471983:stateMachine:orderAcceptedMachine-dev'

我在这里不明白的是,来自输入的Arn和来自错误的Arn不相同。在我看来,似乎startExecution修改了输入stateMachineArn并以某种方式更改了其区域(即使Arn作为字符串传递了!!)。

我已经以相同的方式启动了项目中的类似步骤功能:

const params = {
    stateMachineArn: process.env.ORDER_TIMEOUT_MACHINE_ARN,
    name: `${orderId}-${moment().unix()}`,
    input: JSON.stringify({
      orderTimeoutTimestamp: timeout.toISOString(),
      orderId,
    }),
  }

    const success = await stepfunctions.startExecution(params).promise()
    return success.executionArn

Arn定义与另一个定义在同一文件中,并且定义如下:

process.env.ORDER_TIMEOUT_MACHINE_ARN = 'arn:aws:states:eu-central-1:935080471983:stateMachine:orderTimeoutMachine-dev'

此步骤功能可以正常启动,并正确返回执行的Arn。

通过调试,我发现AWS.config.region在我称为startExecution的两个文件中都返回us-east-1。由于我现有的状态机已经在使用此配置,因此我认为它与该错误无关,但是无论如何,我还是试图在这样的调用之前将“ AWS Region”强制“ eu-central-1”:

    AWS.config.update({ region: 'eu-central-1' })
    const success = await stepfunctions.startExecution(params).promise()

但这不能解决问题。我对AWS相当陌生,因此这里可能遗漏了一些东西(让我知道是否忘记输入任何重要的代码/信息),但是我对错误消息中的Arn的事实感到非常困惑与输入中的不匹配,并且几乎相同的状态机运行良好,而我新创建的状态机不想启动。

那么我该如何解决此问题?

1 个答案:

答案 0 :(得分:0)

经过进一步调查,我发现该步骤功能的区域和端点可能与AWS不同。添加以下代码即可解决该问题:

const stepfunctions = new AWS.StepFunctions({
  endpoint: 'https://states.eu-central-1.amazonaws.com',
  region: 'eu-central-1',
})