AWS Lambda VPC на Terraform

При создании функции AWS Lambda с terraform 0.9.3 мне не удалось подключить ее к выбранному мной VPC.

Вот как выглядит моя функция:

resource "aws_lambda_function" "lambda_function" {
   s3_bucket        = "${var.s3_bucket}"
   s3_key           = "${var.s3_key}"
   function_name    = "${var.function_name}"
   role             = "${var.role_arn}"
   handler          = "${var.handler}"

   runtime          = "${var.runtime}"
   timeout          = "30"
   memory_size      = 256
   publish          = true

   vpc_config {
       subnet_ids = ["${var.subnet_ids}"]
       security_group_ids = ["${var.security_group_ids}"]
   }
 }

Политика, которую я использую для этой роли,

 data "aws_iam_policy_document" "lambda-policy_policy_document" {
       statement {
            effect = "Allow"
            actions = [
            "ec2:DescribeSecurityGroups",
            "ec2:DescribeSubnets",
            "ec2:DescribeVpcs",
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents",
            "ec2:CreateNetworkInterface",
            "ec2:DescribeNetworkInterfaces",
            "ec2:DeleteNetworkInterface"
        ]
        resources = ["*"]
     }
 }

Ресурсы создаются просто отлично, если я попытаюсь добавить VPC и подсети через консоль AWS, все получится.

Обновление (план создания):

module.******.aws_lambda_function.lambda_function
arn:                                 "<computed>"
environment.#:                       "1"
environment.0.variables.%:           "1"
environment.0.variables.environment: "******"
function_name:                       "******"
handler:                             "******"
last_modified:                       "<computed>"
memory_size:                         "256"
publish:                             "true"
qualified_arn:                       "<computed>"
role:                                "******"
runtime:                             "******"
s3_bucket:                           "******"
s3_key:                              "******"
source_code_hash:                    "<computed>"
timeout:                             "30"
version:                             "<computed>"
vpc_config.#:                        "1"
vpc_config.0.vpc_id:                 "<computed>"

Хотя, если я снова запущу terraform plan, конфигурация VPC всегда будет изменена.

vpc_config.#: "0" => "1" (forces new resource)

person joaofs    schedule 24.04.2017    source источник
comment
Можете ли вы показать результат плана, если у вас нет функции Lambda?   -  person ydaetskcoR    schedule 24.04.2017
comment
@ydaetskcoR только что обновил план создания   -  person joaofs    schedule 24.04.2017
comment
Мне это кажется неправильным. Я только что запланировал одну из моих собственных функций Lambda, которая находится внутри VPC, и я вижу дополнительные строки в плане для идентификаторов групп безопасности и идентификаторов подсети, которые не отображаются в вашем плане. Что-то вроде: vpc_config.0.subnet_ids.1220732747: "subnet-12345678". Вы проверили, правильно ли передаются идентификаторы подсети и группы безопасности?   -  person ydaetskcoR    schedule 24.04.2017
comment
Для справки, модуль, который я использую, является общедоступным (github.com/tomelliff/s3-web-service-proxy/blob/master/terraform/), но ваша конфигурация для вашего модуля выглядит нормально по сравнению с этой, поэтому я ' Думаю, дело в том, как вы вызываете модуль.   -  person ydaetskcoR    schedule 24.04.2017
comment
@ydaetskcoR вы были правы, мне не хватало сопоставления.   -  person joaofs    schedule 25.04.2017


Ответы (2)


Я думаю, что значение subnet_ids выглядит так: "subnet-xxxxx,subnet-yyyyy,subnet-zzzzz", и оно воспринимается как отдельная подсеть, а не как список. Вы можете решить эту проблему так:

vpc_config {
  subnet_ids = ["${split(",", var.subnet_ids)}"]
  security_group_ids = ["${var.security_group_ids}"]
}
person Arbab Nazar    schedule 25.01.2019
comment
У меня это не сработало. Я решил это, изменив определение var.subnet_ids на список. `` `variable subnet_ids {default = [subnet-0xxxc, subnet-0xxxa, subnet-0xxx1, subnet-0xxxc]}` `Тогда в моем vpc_config просто используйте:` `` subnet_ids = $ {var.subnet_ids} `` ` - person Craig Fisher; 11.09.2019
comment
какую версию terraform вы используете? - person Arbab Nazar; 12.09.2019
comment
Я использую Terraform V0.12.9 - person Craig Fisher; 27.09.2019
comment
вы можете попробовать его с terraform v0.11.x, для v0.12.x я работаю над своим кодом - person Arbab Nazar; 27.09.2019
comment
`` vpc_config {subnet_ids = split (,, var.subnets) security_group_ids = split (,, var.security_groups)} `` У меня это сработало. - person Manoj Acharya; 24.01.2020

Отсутствует сопоставление с лямбда-модулем. После исправления так должен был выглядеть план конфигурации VPC:

vpc_config.#:                              "1"
vpc_config.0.security_group_ids.#:         "1"
vpc_config.0.security_group_ids.571116572: "******"
vpc_config.0.subnet_ids.#:                 "3"
vpc_config.0.subnet_ids.1396457994:        "****"
vpc_config.0.subnet_ids.1722519307:        "****"
vpc_config.0.subnet_ids.830820656:         "****"
vpc_config.0.vpc_id:                       "<computed>"
person joaofs    schedule 25.04.2017