【问题标题】:How to pass mixed parameters for an AWS Step Functions state machine如何为 AWS Step Functions 状态机传递混合参数
【发布时间】:2021-08-30 12:52:42
【问题描述】:

我在 json 文件中定义了一个 AWS Step Functions 状态机,在 step1(一个 lambda 任务)中,我在 ResultPath 中保存了三个参数:

   "NeededParameters": {
      "year": "2021",
      "month": "04",
      "day": "27"
    },

step2(也是一个 lambda 任务)中,我明白如果我执行以下操作:

"Step 2" : {
         "Type": "Task",
         "Resource": "arn:aws:states:::lambda:invoke",
         "Parameters": {
             "FunctionName":"${lambda_name}",
             "Payload":{
               "year.$": "$.NeededParameters.year"
             }
         },
         "ResultPath": "$.Step2",

"year.$": "$.NeededParameters.year" 会将2021 传递给有效载荷Year

但我想要实现的是定义一个包含三个参数的 Amazon S3 路径,例如:

 "Step 2" : {
          "Type": "Task",
          "Resource": "arn:aws:states:::lambda:invoke",
          "Parameters": {
              "FunctionName":"${lambda_name}",
              "Payload":{
                "s3path.$":"${s3_bucket_name}/$.NeededParameters.year/$.NeededParameters.month/$.NeededParameters.day"
              }
          },
          "ResultPath": "$.Step2",

s3_bucket_name 在 Terraform resource "aws_sfn_state_machine" "sfn_state_machine" 中定义并传递给上面的状态机定义 json 文件,但是当我应用 terraform 时它会抱怨:

InvalidDefinition: Invalid State Machine Definition: 'SCHEMA_VALIDATION_FAILED: The value for the field 's3path.$' must be a valid JSONPath at /States/Process Scores/Parameters'

如果我将s3path.$ 更改为s3path 它仍然无法正常工作,有谁知道如何解决这个问题?谢谢。

【问题讨论】:

  • 您能否编辑您的问题,使其形成minimal reproducible example?这使得能够提供可能依赖于其他部分的答案变得更加容易,也让人们更容易准确地看到您尝试过的内容。

标签: json amazon-web-services terraform terraform-provider-aws aws-step-functions


【解决方案1】:
  1. 正如错误消息所暗示的,您传递给 s3path.$ 的字符串不是有效的 JSONPath。如果您想传递一些静态值,则需要在末尾不带.$ 命名它(简称为s3path),否则,就像您的情况一样,它将被视为JSONPath 并进行验证。

  2. 据我所知,静态参数不支持任何类型的字符串扩展,尤其是涉及 JSONPath。我建议除了年、月和日之外还传递名为s3BucketName 的参数,然后在 lambda 函数本身内简单地构造 S3 URL。

【讨论】:

  • 您好,感谢第二点,“在 lambda 函数中构造 S3 URL”我想我可以这样做,但这可能行不通,因为我想要一个动态 s3 url(通过当前每天约会)。对于第一点,如果我定义为s3path 而没有$,那么我无法传递来自$.NeededParameters.xxx 的值,我对此有点卡住了,或者我的方向完全错误。 ..
  • @Cecilia 为什么你会通过当前日期?为什么不使用您使用的任何语言的日期时间库并确定函数内部的日期?每个调用的 JSONPath 参数也是本地的,而静态参数总是相同的
【解决方案2】:

你可以这样做:

{
   "Step 2" : {
          "Type": "Task",
          "Resource": "arn:aws:states:::lambda:invoke",
          "InputPath": "$.NeededParameters",
          "Parameters": {
              "FunctionName":"${lambda_name}",
              "Payload":{
                "s3path.$": "States.Format('{}/{}/{}/{}', ${s3_bucket_name}, $.year, $.month, $.day)"
              }
          },
          "ResultPath": "$.Step2"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2020-09-05
    • 2023-02-03
    相关资源
    最近更新 更多