Step Functions Map State访问Item属性时EC2请求报错问题
问题排查与解决方案
核心问题
错误来自两个路径引用问题:
- 误用上下文对象符号
$$,应使用状态输入引用$ - 在Map的ItemProcessor内部,无需通过
.Map前缀访问当前迭代Item的属性
原因解析
当Map State通过ItemsPath: "$.Items"获取迭代列表后,每个Item会被单独传入ItemProcessor的子状态机中。此时子状态机的输入就是单个Item(即你提供的{"snapshot_id": {"S": "snap-..."}}结构),因此直接用$即可访问当前Item的属性,不需要额外的.Map层级。
你之前使用的$$.Map.snapshot_id.S会被Step Functions当作无效引用传递给EC2,导致EC2收到不符合格式要求的snapshotId值。
修正方案
修改CreateVolume任务的SnapshotId参数为正确路径:
"CreateVolume": { "Type": "Task", "Parameters": { "AvailabilityZone": "us-east-2b", "SnapshotId": "$.snapshot_id.S" }, "Resource": "arn:aws:states:::aws-sdk:ec2:createVolume", "Next": "AttachVolume" }
完整修正后的Map State片段
"Map": { "Type": "Map", "ItemProcessor": { "ProcessorConfig": { "Mode": "INLINE" }, "StartAt": "Parallel State", "States": { "Parallel State": { "Comment": "A Parallel state can be used to create parallel branches of execution in your state machine.", "Type": "Parallel", "Branches": [ { "StartAt": "CreateVolume", "States": { "CreateVolume": { "Type": "Task", "Parameters": { "AvailabilityZone": "us-east-2b", "SnapshotId": "$.snapshot_id.S" }, "Resource": "arn:aws:states:::aws-sdk:ec2:createVolume", "Next": "AttachVolume" }, "AttachVolume": { "Type": "Task", "Parameters": { "Device": "MyData", "InstanceId": "MyData", "VolumeId": "MyData" }, "Resource": "arn:aws:states:::aws-sdk:ec2:attachVolume", "End": true } } } ], "End": true } } }, "Next": "Final Result", "ItemsPath": "$.Items", "MaxConcurrency": 40 }
修正后,Step Functions会正确提取每个Item中的snapshot_id.S值,传递给EC2的createVolume接口,满足snap-xxx格式要求。
内容的提问来源于stack exchange,提问作者Atif Shafi
相关产品推荐
相关产品推荐

