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

yoa*_*uim 1 amazon-web-services amazon-vpc aws-lambda terraform

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

我有一些其他的基础设施,我想它很好地设置(也许我错了?):

  • 2个室性早搏(让我们只是看见他们testprod)
  • 每个VPC中的私有和公共子网
  • RDS DB在私有子网中启动

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

现在,我正在研究将为API提供动力的API和lambdas.

我不觉得我需要一个test&prodAPI网关和test&prodlambdas:

  • lambda代码将是相同的,只是作用于不同的DB
  • 您可以使用stage_variables具有不同ips 的API 来实现API 的testvs prod环境

但是当我尝试使用vpc_config块设置lambda时(因为我需要将它与允许在DB上进行的安全组关联),我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

我的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}"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我最好只在相应的列表中指定它们.

我错过了什么吗?

建议?

任何帮助,无论是否相关,都非常感谢.

str*_*gjz 5

在vpc中运行的Lambda受到与ec2实例相同的网络"规则"的约束.所以它不能在两个VPC中"存在".如果lambda函数需要在两个单独的VPC中讨论vpc资源,你可以使用像VPC对等的东西,或者只在两个不同的vpc中运行两个函数副本.

将VPC配置添加到Lambda函数时,它只能访问该VPC中的资源.如果Lambda函数需要访问VPC资源和公共Internet,则VPC需要在VPC内部具有网络地址转换(NAT)实例和VPC对等连接.