如何设置 AWS lambda 以访问两个独立 VPC 中的资源?
How can I setup an AWS lambda to access resources in two, separate VPCs?
我正在使用 Terraform 构建一个 API + 相应的 lambda 函数。
我还有其他一些基础设施,我认为它设置得很好(也许我错了?):
- 2 个 VPC(我们称它们为
test
和 prod
)
- 每个 VPC 中的私有和 public 个子网
- 在私有子网中启动的 RDS 数据库
两个 VPC 上的所有资源都相同;例如有一个 test-private-subnet
和一个 prod-private-subnet
具有完全相同的规格,相同的数据库等
现在,我正在研究 API 和将为 API 提供动力的 lambda 表达式。
我觉得我不需要 test
& prod
API 网关和 test
& prod
lambdas:
- lambda 代码将相同,只是作用于不同的 DB
- 您可以使用 API
stage_variables
和不同的 ip,为 API 实现 test
与 prod
环境
但是当我尝试使用 vpc_config
块设置 lambda 时(因为我需要它与允许进入数据库的 安全组 相关联) ,我收到以下错误:
Error applying plan:
1 error(s) occurred:
* module.lambdas.aws_lambda_function.api-lambda-users: 1 error(s) occurred:
* aws_lambda_function.api-lambda-users: Error creating Lambda function: InvalidParameterValueException: Security Groups are required to be in the same VPC.
status code: 400, request id: xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx
我的 lambda 配置如下所示:
resource "aws_lambda_function" "api-lambda-users" {
provider = "PROVIDER"
function_name = "users"
s3_key = "users/${var.lambda-package-name}"
s3_bucket = "${var.api-lambdas-bucket}"
role = "${aws_iam_role.lambda-role.arn}"
handler = "${var.handler-name}"
runtime = "${var.lambda-runtime}"
vpc_config {
security_group_ids = [
//"${data.aws_security_group.prod-lambda.id}",
"${data.aws_security_group.test-lambda.id}"
]
subnet_ids = [
//"${data.aws_subnet.prod-primary.id}",
"${data.aws_subnet.test-primary.id}"
]
}
}
请注意,理想情况下,我只想在相应的列表中一起指定它们。
我是不是漏掉了什么?
建议?
非常感谢任何相关或无关的帮助。
VPC 中的 Lambda 运行ning 受制于与 ec2 实例相同的网络 "rules"。所以它不能在两个 VPC 中 "exist"。如果 lambda 函数需要在两个单独的 VPC 中讨论 vpc 资源,您可以使用 VPC peering 之类的东西,或者只是 运行 在两个不同的 vpc 中使用函数的两个副本。
When you add VPC configuration to a Lambda function, it can only access resources in that VPC. If a Lambda function needs to access both VPC resources and the public Internet, the VPC needs to have a Network Address Translation (NAT) instance inside the VPC and a VPC Peering connection.
我正在使用 Terraform 构建一个 API + 相应的 lambda 函数。
我还有其他一些基础设施,我认为它设置得很好(也许我错了?):
- 2 个 VPC(我们称它们为
test
和prod
) - 每个 VPC 中的私有和 public 个子网
- 在私有子网中启动的 RDS 数据库
两个 VPC 上的所有资源都相同;例如有一个 test-private-subnet
和一个 prod-private-subnet
具有完全相同的规格,相同的数据库等
现在,我正在研究 API 和将为 API 提供动力的 lambda 表达式。
我觉得我不需要 test
& prod
API 网关和 test
& prod
lambdas:
- lambda 代码将相同,只是作用于不同的 DB
- 您可以使用 API
stage_variables
和不同的 ip,为 API 实现
test
与 prod
环境
但是当我尝试使用 vpc_config
块设置 lambda 时(因为我需要它与允许进入数据库的 安全组 相关联) ,我收到以下错误:
Error applying plan:
1 error(s) occurred:
* module.lambdas.aws_lambda_function.api-lambda-users: 1 error(s) occurred:
* aws_lambda_function.api-lambda-users: Error creating Lambda function: InvalidParameterValueException: Security Groups are required to be in the same VPC.
status code: 400, request id: xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx
我的 lambda 配置如下所示:
resource "aws_lambda_function" "api-lambda-users" {
provider = "PROVIDER"
function_name = "users"
s3_key = "users/${var.lambda-package-name}"
s3_bucket = "${var.api-lambdas-bucket}"
role = "${aws_iam_role.lambda-role.arn}"
handler = "${var.handler-name}"
runtime = "${var.lambda-runtime}"
vpc_config {
security_group_ids = [
//"${data.aws_security_group.prod-lambda.id}",
"${data.aws_security_group.test-lambda.id}"
]
subnet_ids = [
//"${data.aws_subnet.prod-primary.id}",
"${data.aws_subnet.test-primary.id}"
]
}
}
请注意,理想情况下,我只想在相应的列表中一起指定它们。
我是不是漏掉了什么?
建议?
非常感谢任何相关或无关的帮助。
VPC 中的 Lambda 运行ning 受制于与 ec2 实例相同的网络 "rules"。所以它不能在两个 VPC 中 "exist"。如果 lambda 函数需要在两个单独的 VPC 中讨论 vpc 资源,您可以使用 VPC peering 之类的东西,或者只是 运行 在两个不同的 vpc 中使用函数的两个副本。
When you add VPC configuration to a Lambda function, it can only access resources in that VPC. If a Lambda function needs to access both VPC resources and the public Internet, the VPC needs to have a Network Address Translation (NAT) instance inside the VPC and a VPC Peering connection.