首页 > 解决方案 > 无服务器步进函数:在 lambda 的有效负载中传递多个字段时出错

问题描述

错误:Invalid State Machine Definition: 'SCHEMA_VALIDATION_FAILED: The value for the field 'Date.$' must be a valid JSONPath at /States/Insert Data Dynamodb/Parameters' (Service: AWSStepFunctions; Status Code: 400; Error Code: InvalidDefinition;

下面是对应的 serverless.yaml 代码。

我尝试将这两个参数包装成编码的 json 字符串并将其作为单个有效负载字段传递,它导致了相同的错误,但是当有效负载中只有一个普通字段时,此代码成功部署

关于如何传递两个参数的任何建议?

service: service-name

frameworkVersion: '2'

provider:
  name: aws
  runtime: go1.x
  lambdaHashingVersion: 20201221
  stage: ${opt:stage, self:custom.defaultStage}
region: us-east-1
  tags: ${self:custom.tagsObject}
  logRetentionInDays: 1
  timeout: 10
  deploymentBucket: lambda-repository
  memorySize: 128
  tracing:
    lambda: true

plugins:
  - serverless-step-functions

configValidationMode: error

stepFunctions:
  stateMachines:
    sortData:
      name: datasorting-dev
      type: STANDARD
      role: ${self:custom.datasorting.${self:provider.stage}.iam}
      definition:
        Comment: "Data Sort"
        StartAt: Query Data
        States:
          Query Data:
            Type: Task
            Resource: arn:aws:states:::athena:startQueryExecution.sync
            Parameters:
              QueryString: >-
               select * from table.data 
              WorkGroup: primary
              ResultConfiguration:
                OutputLocation: s3://output/location
            Next: Insert Data Dynamodb
          Insert Data Dynamodb: 
            Type: Task
            Resource: arn:aws:states:::lambda:invoke
            Parameters: 
              FunctionName: arn:aws:lambda:us-east-1:${account-id}:function:name
              Payload: 
                OutputLocation.$: $.QueryExecution.ResultConfiguration.OutputLocation
                Date.$: ${self:custom.dates.year}${self:custom.dates.month}${self:custom.dates.day}
            End: true 

标签: aws-serverlessaws-step-functions

解决方案


您的Date.$财产价值为${self:custom.dates.year}${self:custom.dates.month}${self:custom.dates.day}。让我们假设:

const dates = {
  "year": "2000",
  "month": "01",
  "day": "20"
}

结果将是Date.$: "20000120"无效的 JSON 路径。

JSON Path 需要以$符号开头,每一层都以..

你想实现这样的目标吗?$.2000.01.20?

如您所见,问题不在于传递 2 个参数,而是由字符串插值创建的错误字符串 JSON 路径为Date.$.

一些有用的链接:

https://github.com/json-path/JsonPath

https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-paths.html


推荐阅读