如何为 AWS Step Functions 状态机传递混合参数
How to pass mixed parameters for an AWS Step Functions state machine
我在 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
它仍然无法正常工作,有人知道如何解决这个问题吗?谢谢。
如错误消息所示,您传递给 s3path.$
的字符串不是有效的 JSONPath。如果你想传递一些静态值,你需要在末尾不带 .$
的情况下命名它(只需 s3path
),否则,就像你的情况一样,它将被视为和验证为 JSONPath。
据我所知,静态参数不支持任何类型的字符串扩展,尤其是涉及 JSONPath 时。我建议除了年、月和日之外还传递名为 s3BucketName
的参数,然后在 lambda 函数本身内部简单地构造 S3 URL。
你可以这样做:
{
"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"
}
我在 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
它仍然无法正常工作,有人知道如何解决这个问题吗?谢谢。
如错误消息所示,您传递给
s3path.$
的字符串不是有效的 JSONPath。如果你想传递一些静态值,你需要在末尾不带.$
的情况下命名它(只需s3path
),否则,就像你的情况一样,它将被视为和验证为 JSONPath。据我所知,静态参数不支持任何类型的字符串扩展,尤其是涉及 JSONPath 时。我建议除了年、月和日之外还传递名为
s3BucketName
的参数,然后在 lambda 函数本身内部简单地构造 S3 URL。
你可以这样做:
{
"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"
}