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

Terraform创建AWS API Gateway集成报错:ARN需包含路径或操作求助

解决API Gateway集成Step Functions SendTaskSuccess的ARN格式错误问题

这个错误的核心原因是你使用的集成URI格式不符合API Gateway调用AWS服务的规范。API Gateway调用AWS原生服务时,需要遵循特定的ARN结构,不能直接把Step Function的ARN拼在动作名称后面。

问题分析

你当前的URI写法是:

arn:aws:apigateway:ap-southeast-1:states:SendTaskSuccess/${var.step-function-arn}

这不符合API Gateway调用AWS服务的标准格式。正确的格式应该是通过action/动作名称来指定要调用的AWS API,而Step Function的权限控制则通过IAM角色来实现,不是直接写在URI里。

修正方案

1. 修正集成URI格式

正确的URI应该遵循:arn:aws:apigateway:<区域>:<服务>:action/<动作名称>,针对SendTaskSuccess的写法是:

uri = "arn:aws:apigateway:ap-southeast-1:states:action/SendTaskSuccess"

2. 添加必要的IAM权限

API Gateway需要有调用states:SendTaskSuccess的权限,你需要创建一个IAM角色并附加相应的权限策略:

# 创建API Gateway可假设的IAM角色
resource "aws_iam_role" "api_gateway_step_functions_role" {
  name = "api-gateway-step-functions-role"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
}

# 创建允许调用SendTaskSuccess的权限策略
resource "aws_iam_policy" "api_gateway_step_functions_policy" {
  name        = "api-gateway-step-functions-policy"
  description = "允许API Gateway调用Step Functions的SendTaskSuccess动作"

  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "states:SendTaskSuccess",
      "Resource": "${var.step-function-arn}"
    }
  ]
}
EOF
}

# 为角色附加权限策略
resource "aws_iam_role_policy_attachment" "api_gateway_step_functions_attach" {
  role       = aws_iam_role.api_gateway_step_functions_role.name
  policy_arn = aws_iam_policy.api_gateway_step_functions_policy.arn
}

3. 配置请求模板映射

SendTaskSuccess需要两个必填参数:taskToken(活动任务的令牌)和output(返回给Step Function的结果),你需要通过API Gateway的请求模板把前端传入的参数映射成Step Functions要求的格式:

最终修正后的集成代码

resource "aws_api_gateway_integration" "approve_get_integration" {
  rest_api_id             = aws_api_gateway_rest_api.approval_api.id
  resource_id             = aws_api_gateway_resource.approve_resource.id
  http_method             = aws_api_gateway_method.approve_get_Method.http_method
  type                    = "AWS"
  integration_http_method = "POST"
  # 修正后的标准URI
  uri                     = "arn:aws:apigateway:ap-southeast-1:states:action/SendTaskSuccess"
  timeout_milliseconds    = 29000
  # 指定有权限调用Step Functions的IAM角色
  credentials             = aws_iam_role.api_gateway_step_functions_role.arn
  # 映射请求体到SendTaskSuccess要求的格式
  request_templates = {
    "application/json" = <<EOF
{
  "taskToken": "$input.path('$.taskToken')",
  "output": "$input.path('$.output')"
}
EOF
  }
}

关键说明

  • URI格式:API Gateway调用AWS服务时,通过action/动作名指定要触发的API,而不是直接关联资源ARN,资源权限通过IAM角色控制。
  • 请求模板:确保API Gateway收到的请求参数能正确映射到Step Functions API要求的结构,否则会导致调用失败。
  • IAM权限:必须给API Gateway的角色授予针对目标Step Function的states:SendTaskSuccess权限,否则会出现权限错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:32:12