使用 Terraform 将 AWS API 网关方法与多个 Lambda 集成
Integrate AWS API Gateway methods with multiple Lambdas using Terraform
我必须将 50 多个 Lambda 函数与相关 api 网关方法集成。这样我就创建了一个带有 Lambda 函数名称和 api 网关资源路径的地形图,如下所示。
variable "lambdas" {
description = "Map of Lambda function names and API gateway resource paths."
type = map
default = {
user = {
name = "user-lambda-function"
path = "user"
},
products= {
name = "products-lambda-function"
path = "products"
},
orders= {
name = "orders-lambda-function"
path = "orders"
},
然后我使用 for_each
通过此映射迭代创建 lambda 函数,如下所示。
resource "aws_lambda_function" "lambda_functions" {
for_each = var.lambdas
filename = "lambda_function_code.zip"
function_name = each.value.name
role = data.aws_iam_role.lambda_execution_role.arn
handler = "index.handler"
source_code_hash = filebase64sha256("lambda_function_code.zip")
runtime = "nodejs14.x"
}
之后我开始创建 API 网关、资源和方法如下,
resource "aws_api_gateway_rest_api" "api_gateway" {
name = var.api-gateway-name
}
resource "aws_api_gateway_resource" "resources" {
for_each = var.lambdas
rest_api_id = aws_api_gateway_rest_api.api_gateway.id
parent_id = aws_api_gateway_rest_api.api_gateway.root_resource_id
path_part = each.value.path
}
resource "aws_api_gateway_method" "methods" {
for_each = aws_api_gateway_resource.resources
rest_api_id = aws_api_gateway_rest_api.api_gateway.id
resource_id = each.value.id
http_method = "POST"
authorization = "NONE"
api_key_required = false
}
然后我尝试通过迭代上述方法将上述 API 网关方法与相关的 Lambda 函数集成。但是这里我必须输入相关的lambda函数调用uri。
resource "aws_api_gateway_integration" "integration" {
for_each = aws_api_gateway_method.methods
rest_api_id = each.value.rest_api_id
resource_id = each.value.resource_id
http_method = each.value.http_method
integration_http_method = "POST"
type = "AWS_PROXY"
uri = ""
}
我正在努力输入这个相关的 lambda 函数 uri 以与相关方法集成。
我的问题是,如何通过此迭代获取相关的 lambda 函数 uri 以在此处输入?或无需为每个 lambda、资源和方法编写代码即可实现此目的的任何解决方案。
aws_lambda_function 有 invoke_arn
即:
ARN to be used for invoking Lambda Function from API Gateway - to be used in aws_api_gateway_integration's uri
所以你必须在 aws_api_gateway_integration
中使用它。
我必须将 50 多个 Lambda 函数与相关 api 网关方法集成。这样我就创建了一个带有 Lambda 函数名称和 api 网关资源路径的地形图,如下所示。
variable "lambdas" {
description = "Map of Lambda function names and API gateway resource paths."
type = map
default = {
user = {
name = "user-lambda-function"
path = "user"
},
products= {
name = "products-lambda-function"
path = "products"
},
orders= {
name = "orders-lambda-function"
path = "orders"
},
然后我使用 for_each
通过此映射迭代创建 lambda 函数,如下所示。
resource "aws_lambda_function" "lambda_functions" {
for_each = var.lambdas
filename = "lambda_function_code.zip"
function_name = each.value.name
role = data.aws_iam_role.lambda_execution_role.arn
handler = "index.handler"
source_code_hash = filebase64sha256("lambda_function_code.zip")
runtime = "nodejs14.x"
}
之后我开始创建 API 网关、资源和方法如下,
resource "aws_api_gateway_rest_api" "api_gateway" {
name = var.api-gateway-name
}
resource "aws_api_gateway_resource" "resources" {
for_each = var.lambdas
rest_api_id = aws_api_gateway_rest_api.api_gateway.id
parent_id = aws_api_gateway_rest_api.api_gateway.root_resource_id
path_part = each.value.path
}
resource "aws_api_gateway_method" "methods" {
for_each = aws_api_gateway_resource.resources
rest_api_id = aws_api_gateway_rest_api.api_gateway.id
resource_id = each.value.id
http_method = "POST"
authorization = "NONE"
api_key_required = false
}
然后我尝试通过迭代上述方法将上述 API 网关方法与相关的 Lambda 函数集成。但是这里我必须输入相关的lambda函数调用uri。
resource "aws_api_gateway_integration" "integration" {
for_each = aws_api_gateway_method.methods
rest_api_id = each.value.rest_api_id
resource_id = each.value.resource_id
http_method = each.value.http_method
integration_http_method = "POST"
type = "AWS_PROXY"
uri = ""
}
我正在努力输入这个相关的 lambda 函数 uri 以与相关方法集成。
我的问题是,如何通过此迭代获取相关的 lambda 函数 uri 以在此处输入?或无需为每个 lambda、资源和方法编写代码即可实现此目的的任何解决方案。
aws_lambda_function 有 invoke_arn
即:
ARN to be used for invoking Lambda Function from API Gateway - to be used in aws_api_gateway_integration's uri
所以你必须在 aws_api_gateway_integration
中使用它。