Terraform偶发创建API Gateway资源失败的原因及解决方法
问题原因
Terraform通过资源属性的引用关系自动推断构建顺序,你的代码存在两处依赖链断裂:
aws_api_gateway_integration资源仅引用了aws_api_gateway_resource的ID,未关联aws_api_gateway_method的任何属性,Terraform会尝试在接口方法创建完成前就创建集成,触发Invalid Method identifier specified报错aws_api_gateway_integration_response资源未关联aws_api_gateway_integration的任何属性,Terraform会尝试在集成创建完成前就创建集成响应,触发Invalid Integration identifier specified报错
两次重试才成功的逻辑是:第一次重试时接口方法已经创建完成,集成可以正常生成;第二次重试时集成已经创建完成,集成响应可以正常生成。
修复方案
修改两处资源的参数,补全隐式依赖即可:
- 将
aws_api_gateway_integration的http_method参数改为引用已创建的方法资源属性,确保方法创建完成后再执行集成创建 - 在
aws_api_gateway_integration_response中关联集成资源属性,确保集成创建完成后再执行集成响应创建
修复后的代码示例:
resource "aws_api_gateway_integration" "proxy_integration" { for_each = local.lambda_endpoints_by_path rest_api_id = aws_api_gateway_rest_api.api_gateway.id resource_id = aws_api_gateway_resource.gateway_resource[each.key].id # 替换原有的each.value.method,补全对method资源的依赖 http_method = aws_api_gateway_method.gateway_method[each.key].http_method integration_http_method = each.value.method uri = "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/${each.value.lambda_arn}:$${stageVariables.env}/invocations" type = "AWS_PROXY" } resource "aws_api_gateway_integration_response" "integration_response" { for_each = local.lambda_endpoints_by_path rest_api_id = aws_api_gateway_rest_api.api_gateway.id resource_id = aws_api_gateway_resource.gateway_resource[each.key].id # 替换原有的method资源引用,补全对integration资源的依赖 http_method = aws_api_gateway_integration.proxy_integration[each.key].http_method status_code = aws_api_gateway_method_response.gateway_response_200[each.key].status_code }
如果不愿意修改参数,也可以给对应资源加depends_on显式声明依赖,效果完全一致。
内容的提问来源于stack exchange,提问作者Dan Monego
相关产品推荐
相关产品推荐

