You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:47:11