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

时间:2017-06-03 23:24:21

标签: amazon-web-services aws-lambda amazon-vpc terraform

我使用Terraform构建API +相应的lambda函数。

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

  • 2个VPC(只需拨打电话' em testprod
  • 私人&每个VPC中的公共子网
  • 在私有子网中启动的RDS数据库

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

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

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

  • lambda代码将是相同的,只是作用于不同的数据库
  • 您可以使用不同ips的API stage_variables来实现API的test vs 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}"
    ]
  }
}

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

我错过了什么吗?

建议?

非常感谢任何相关或不相关的帮助。

1 个答案:

答案 0 :(得分:5)

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

  

将VPC配置添加到Lambda函数时,它只能访问该VPC中的资源。如果Lambda函数需要访问VPC资源和公共Internet,则VPC需要在VPC内部具有Network Address Translation (NAT)实例并且VPC Peering连接。