如何用Terraform配置AWS APIGateway实现多路径绑定对应Lambda函数
缺失的Terraform配置补充说明
你原有配置中仅定义了根路径下的/demo资源节点,需要补充嵌套路径资源、对应HTTP方法、Lambda集成、调用权限以及API部署配置,完整补充代码如下:
# -------------------------- # 第一部分:GET /demo/user 相关配置 # -------------------------- # 创建 /demo/user 层级资源 resource "aws_api_gateway_resource" "demo_user" { rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id parent_id = aws_api_gateway_resource.MyDemoResource.id path_part = "user" } # 定义GET /demo/user 方法 resource "aws_api_gateway_method" "get_demo_user" { rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id resource_id = aws_api_gateway_resource.demo_user.id http_method = "GET" authorization = "NONE" } # 绑定GET /demo/user到hello Lambda resource "aws_api_gateway_integration" "get_demo_user_lambda" { rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id resource_id = aws_api_gateway_resource.demo_user.id http_method = aws_api_gateway_method.get_demo_user.http_method type = "AWS_PROXY" uri = "${aws_lambda_function.hello.invoke_arn}/invocations" integration_http_method = "POST" } # 授予API Gateway调用hello Lambda的权限 resource "aws_lambda_permission" "allow_apigw_call_hello" { statement_id = "AllowAPIGatewayInvokeHello" action = "lambda:InvokeFunction" function_name = aws_lambda_function.hello.function_name principal = "apigateway.amazonaws.com" source_arn = "${aws_api_gateway_rest_api.MyDemoAPI.execution_arn}/*/GET/demo/user" } # -------------------------- # 第二部分:PUT /demo/user/{id} 相关配置 # -------------------------- # 创建 /demo/user/{id} 路径参数资源 resource "aws_api_gateway_resource" "demo_user_id" { rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id parent_id = aws_api_gateway_resource.demo_user.id path_part = "{id}" } # 定义PUT /demo/user/{id} 方法 resource "aws_api_gateway_method" "put_demo_user_id" { rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id resource_id = aws_api_gateway_resource.demo_user_id.id http_method = "PUT" authorization = "NONE" request_parameters = { "method.request.path.id" = true } } # 绑定PUT /demo/user/{id}到test Lambda resource "aws_api_gateway_integration" "put_demo_user_id_lambda" { rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id resource_id = aws_api_gateway_resource.demo_user_id.id http_method = aws_api_gateway_method.put_demo_user_id.http_method type = "AWS_PROXY" uri = "${aws_lambda_function.test.invoke_arn}/invocations" integration_http_method = "POST" request_parameters = { "integration.request.path.id" = "method.request.path.id" } } # 授予API Gateway调用test Lambda的权限 resource "aws_lambda_permission" "allow_apigw_call_test" { statement_id = "AllowAPIGatewayInvokeTest" action = "lambda:InvokeFunction" function_name = aws_lambda_function.test.function_name principal = "apigateway.amazonaws.com" source_arn = "${aws_api_gateway_rest_api.MyDemoAPI.execution_arn}/*/PUT/demo/user/*" } # -------------------------- # 第三部分:API部署配置(必须配置否则无法对外提供服务) # -------------------------- resource "aws_api_gateway_deployment" "demo_deploy" { rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id triggers = { redeployment = sha1(jsonencode([ aws_api_gateway_resource.demo_user, aws_api_gateway_resource.demo_user_id, aws_api_gateway_method.get_demo_user, aws_api_gateway_method.put_demo_user_id ])) } lifecycle { create_before_destroy = true } } resource "aws_api_gateway_stage" "demo_stage" { deployment_id = aws_api_gateway_deployment.demo_deploy.id rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id stage_name = "v1" }
注意事项
- 如果Lambda资源未在当前Terraform配置中定义,直接将代码中的
aws_lambda_function.hello.invoke_arn和aws_lambda_function.test.invoke_arn替换为实际的Lambda调用ARN即可 - 你原有配置中针对/demo路径的
aws_api_gateway_integration.MyDemoIntegration和未显式定义的aws_api_gateway_method.MyDemoMethod如果不需要可以直接删除
内容的提问来源于stack exchange,提问作者SAN
相关产品推荐
相关产品推荐

