如何设置 AWS lambda 以访问两个独立 VPC 中的资源?

How can I setup an AWS lambda to access resources in two, separate VPCs?

我正在使用 Terraform 构建一个 API + 相应的 lambda 函数。

我还有其他一些基础设施,我认为它设置得很好(也许我错了?):

两个 VPC 上的所有资源都相同;例如有一个 test-private-subnet 和一个 prod-private-subnet 具有完全相同的规格,相同的数据库等

现在,我正在研究 API 和将为 API 提供动力的 lambda 表达式。

我觉得我不需要 test & prod API 网关和 test & prod lambdas:

但是当我尝试使用 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.