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
相关产品推荐
相关产品推荐

