Terraform拼接aws_api_gateway_integration的uri参数报错求助
问题
我有一个绑定值为dev的Lambda别名,在AWS API Gateway控制台中可以设置Lambda函数及其别名或版本,格式为function-arn:alias或function-arn:version。但尝试通过拼接方式设置Terraform的aws_api_gateway_integration的uri参数时,出现以下错误:
Error updating API Gateway Integration: BadRequestException: Integrations of type 'AWS_PROXY' currently only supports Lambda function and Firehose stream invocations.
对应的Terraform代码如下:
resource "aws_api_gateway_integration" "foo_bar" { rest_api_id = xxx resource_id = xxx http_method = xxx integration_http_method = "POST" type = "AWS_PROXY" uri = "${var.lambdaxyz_lambda_arn}:${var.environment}" }
解决方法
问题出在uri参数的格式上,直接拼接Lambda ARN和别名的写法不符合API Gateway Lambda代理集成的URI规范。正确的URI需要遵循API Gateway调用Lambda的标准格式,完整结构如下:
arn:aws:apigateway:<aws-region>:lambda:path/2015-03-31/functions/<lambda-function-arn>:<alias-or-version>/invocations
修改后的Terraform代码可以这样写:
resource "aws_api_gateway_integration" "foo_bar" { rest_api_id = xxx resource_id = xxx http_method = xxx integration_http_method = "POST" type = "AWS_PROXY" uri = "arn:aws:apigateway:${var.aws_region}:lambda:path/2015-03-31/functions/${var.lambdaxyz_lambda_arn}:${var.environment}/invocations" }
需要注意几个关键点:
- 替换
<aws-region>为你的AWS区域变量(比如var.aws_region) - 确保
var.lambdaxyz_lambda_arn是完整的Lambda函数ARN(不带别名后缀) :${var.environment}部分对应你的Lambda别名或版本号- 末尾必须加上
/invocations路径,这是API Gateway调用Lambda的必填路径
另外,也可以借助Terraform的aws_lambda_function数据源或资源的qualified_arn属性,它会直接返回包含别名/版本的完整ARN,再拼接调用路径:
# 假设已有aws_lambda_function资源或数据源 data "aws_lambda_function" "lambda_xyz" { function_name = "your-function-name" qualifier = var.environment # 别名或版本 } resource "aws_api_gateway_integration" "foo_bar" { rest_api_id = xxx resource_id = xxx http_method = xxx integration_http_method = "POST" type = "AWS_PROXY" uri = "arn:aws:apigateway:${var.aws_region}:lambda:path/2015-03-31/functions/${data.aws_lambda_function.lambda_xyz.qualified_arn}/invocations" }
这种方式更可靠,避免手动拼接ARN时出现格式错误。
内容的提问来源于stack exchange,提问作者dataviews
相关产品推荐
相关产品推荐

