Как настроить лямбда-выражение AWS для доступа к ресурсам в двух отдельных VPC?

Я использую Terraform для создания API + соответствующих лямбда-функций.

У меня есть другая инфраструктура, которая, как мне кажется, хорошо настроена (может я ошибаюсь?):

  • 2 VPC (давайте просто назовем их test и prod)
  • Частные и общедоступные подсети в каждом VPC
  • БД RDS запущены в частных подсетях

Все ресурсы идентичны на обоих VPC; например есть test-private-subnet и prod-private-subnet с точно такими же характеристиками, одинаковыми для БД и т. д.

Теперь я работаю над API и лямбдами, которые будут использовать этот API.

Мне не нужен test & prod API-шлюз и test & prod лямбды:

  • лямбда-код будет таким же, просто действует на разные БД
  • вы можете использовать API stage_variables с разными IP-адресами для достижения среды test против prod для API

Но когда я пытаюсь настроить лямбду с блоком vpc_config (потому что мне нужно, чтобы он был связан с группой безопасности, которой разрешен вход в базы данных), я получаю следующую ошибку:

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

Моя лямбда-конфигурация выглядит так:

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}"
    ]
  }
}

Обратите внимание, что в идеале я хотел бы просто указать их вместе в соответствующих списках.

Я что-то упускаю?

Предложения?

Любая помощь, связанная или нет, очень ценится.


person cintron    schedule 03.06.2017    source источник
comment
В общем, хорошо иметь полностью дублированную среду для Test. Таким образом, вы можете экспериментировать с изменениями (например, с улучшенным лямбда-кодом), не влияя на производственную среду. Учитывая, что Lambda и API Gateway ничего не стоят, когда они не используются (за исключением кэширования API Gateway, если оно активировано), нет реальной причины избегать создания полной тестовой среды.   -  person John Rotenstein    schedule 04.06.2017
comment
Спасибо. Считал и это тоже, но подумал, что это перебор. Рад слышать, что это не так; вероятно, что я собираюсь делать!   -  person cintron    schedule 04.06.2017


Ответы (1)


Лямбда, работающая внутри vpc, подчиняется тем же сетевым «правилам», что и экземпляры ec2. Таким образом, он не может «существовать» в двух VPC. Если лямбда-функция должна передавать ресурсы vpc в двух отдельных VPC, вы можете использовать что-то вроде пиринга VPC или просто запустить две копии функции в двух разных vpc.

Когда вы добавляете конфигурацию VPC в функцию Lambda, она может получить доступ только к ресурсам в этом VPC. Если лямбда-функции требуется доступ как к ресурсам VPC, так и к общедоступному Интернету, VPC должен иметь экземпляр трансляции сетевых адресов (NAT) внутри VPC и соединение VPC Peering.

person strongjz    schedule 03.06.2017
comment
Спасибо. Вероятно, пойдет с лямбда-функцией / VPC, как в комментарии Джона Ротенштейна! - person cintron; 04.06.2017
comment
Причина создания двух VPC (тестового и производственного) - изолировать среду, пиринг vpc - не лучший вариант для этого случая. - person BMW; 04.06.2017
comment
Я согласен, это то, что амазонка дает вам достаточно веревки - person strongjz; 04.06.2017