如何在AWS Step Functions的EC2 run-instances调用中传递$$.Task.Token
如何在AWS Step Functions与EC2实例间传递任务令牌($$.Task.Token)
关于User-Data的处理方式
直接在user-data中写入$$.Task.Token确实会被当成字符串传递,而非实际的令牌值。解决这个问题的关键是利用Step Functions的内置函数先完成变量替换再进行Base64编码:
- 在Step Functions的任务定义中,使用
States.Base64Encode()函数包裹令牌变量,确保Step Functions先解析$$.Task.Token为实际值,再编码为符合要求的Base64字符串。 - 示例配置:
"RunEC2Instance": { "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:ec2:runInstances", "Parameters": { "ImageId": "ami-xxxxxx", "InstanceType": "t2.micro", "UserData.$": "States.Base64Encode($$.Task.Token)" }, "End": false } - 如果需要在user-data中传递包含令牌的脚本(比如启动时写入环境变量),可以拼接字符串后再编码:
"UserData.$": "States.Base64Encode('export TASK_TOKEN=' + $$.Task.Token)"
EC2实例启动后,可通过解码user-data获取令牌:执行curl http://169.254.169.254/latest/user-data | base64 --decode即可拿到实际值。
其他传递令牌的替代方案
除了user-data,还有几种更灵活的方式:
1. 利用EC2实例标签
在调用run-instances时直接为实例添加包含令牌的标签,无需处理Base64:
"Parameters": { "ImageId": "ami-xxxxxx", "InstanceType": "t2.micro", "Tags": [ { "Key": "StepFunctionsTaskToken", "Value.$": "$$.Task.Token" } ] }
EC2实例内部可通过AWS CLI获取自身标签:
aws ec2 describe-tags --filters "Name=resource-id,Values=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)" "Name=key,Values=StepFunctionsTaskToken" --query "Tags[0].Value" --output text
这种方式适合不需要在启动脚本中立即使用令牌的场景,配置更简单。
2. 使用AWS Systems Manager Parameter Store
- Step Functions中先将令牌存入Parameter Store(需生成唯一键,比如结合实例ID或UUID):
"StoreTaskToken": { "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:ssm:putParameter", "Parameters": { "Name.$": "concat('/step-functions/tokens/', $$.Execution.Id)", "Value.$": "$$.Task.Token", "Type": "String" }, "Next": "RunEC2Instance" } - 在
run-instances时,将Parameter Store的键通过标签或user-data传给EC2实例,实例再读取该参数获取令牌:aws ssm get-parameter --name "/step-functions/tokens/<execution-id>" --query "Parameter.Value" --output text
注意要给EC2实例的IAM角色添加ssm:GetParameter权限。
3. 使用Amazon S3
- Step Functions将令牌写入S3对象:
"WriteTokenToS3": { "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:s3:putObject", "Parameters": { "Bucket": "your-bucket", "Key.$": "concat('task-tokens/', $$.Execution.Id)", "Body.$": "$$.Task.Token" }, "Next": "RunEC2Instance" } - EC2实例通过S3 SDK或CLI下载对象获取令牌:
aws s3 cp s3://your-bucket/task-tokens/<execution-id> -
需为EC2实例配置S3读取权限。
方案选择建议
- 若启动时需立即使用令牌:优先选择Base64编码的user-data方案。
- 若启动后按需获取令牌:EC2标签配置最简单,无需额外存储服务。
- 若令牌需长期留存或跨实例共享:选择Parameter Store或S3。
内容的提问来源于stack exchange,提问作者Shanthi
相关产品推荐
相关产品推荐

