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

如何在被调用的Step Function内部获取其别名?附API Gateway调用问题

解决方案

一、修复API Gateway VTL输入修改问题

你之前的VTL代码失效是因为$input.json('$')返回的是不可变对象,直接修改属性不会生效。需要先将其转换为可修改的Map,再进行调整:

正确的VTL代码示例

#set($newInput = $util.parseJson($input.json('$')))
#set($newInput.Environment = "Development")
#set($escapedInput = $util.escapeJavaScript($util.toJson($newInput)))
{
  "input": "$escapedInput",
  "stateMachineArn": "arn:aws:states:us-west-2:**********:stateMachine:UpdateLocation:Development"
}

关键说明

  1. 使用$util.parseJson()将原始输入转换为可修改的Map对象
  2. 修改Map后,用$util.toJson()重新序列化为JSON字符串
  3. 最后用$util.escapeJavaScript()处理转义,避免JSON格式错误

更灵活的版本(利用API Gateway阶段变量)

如果你的API Gateway分阶段(如dev/prod),可以用阶段变量存储Step Function别名,避免硬编码:

#set($newInput = $util.parseJson($input.json('$')))
#set($newInput.Environment = "${stageVariables.stepFunctionAlias}")
#set($escapedInput = $util.escapeJavaScript($util.toJson($newInput)))
{
  "input": "$escapedInput",
  "stateMachineArn": "arn:aws:states:us-west-2:**********:stateMachine:UpdateLocation:${stageVariables.stepFunctionAlias}"
}

配置阶段变量时,只需给不同阶段设置对应的stepFunctionAlias值(如Development或Prod)即可。

二、Step Function内部获取别名的其他方式

目前AWS Step Function的上下文对象确实不包含状态机别名信息,除了通过输入传入外,还可以通过以下方式实现:

通过Lambda调用AWS API查询别名

在Step Function中添加一个Lambda任务,调用DescribeExecution API获取执行关联的状态机ARN,再调用ListStateMachineAliases API匹配对应的别名:

  1. Lambda代码示例(Python):
import boto3

client = boto3.client('stepfunctions')

def lambda_handler(event, context):
    # 获取当前执行ARN
    execution_arn = event['Execution.Id']
    # 查询执行详情,获取状态机ARN
    execution_details = client.describe_execution(executionArn=execution_arn)
    state_machine_arn = execution_details['stateMachineArn']
    
    # 查询该状态机的所有别名
    aliases = client.list_state_machine_aliases(stateMachineArn=state_machine_arn)
    # 根据业务逻辑匹配目标别名(示例取第一个,实际可根据版本或名称筛选)
    if aliases['stateMachineAliases']:
        alias_name = aliases['stateMachineAliases'][0]['name']
        return {"Environment": alias_name}
    return {"Environment": "Default"}
  1. 在Step Function中添加该Lambda任务,将结果合并到后续执行上下文即可。

不过这种方式需要额外的Lambda调用和API权限,相比输入传入的方式更复杂,推荐优先使用第一种方案。


内容的提问来源于stack exchange,提问作者DBtake3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:47:48