Как я могу включить развертывание отдельных лямбда-функций с помощью Terraform?

#aws-lambda #terraform

#aws-lambda #terraform

Вопрос:

Я работаю над автоматизацией развертывания лямбда-функций с использованием Terraform. Цель состоит в том, чтобы иметь возможность развертывать либо одну лямбда-функцию, либо все функции в репозитории. Я могу развернуть ряд функций из структуры, которая выглядит как:

 ├── README.md
├── js
│   ├── README.md
│   ├── jsFunction1/
│   │   └── main.tf
│   └── jsFunction2/
│       └── main.tf
├── py
│   ├── README.md
│   ├── pyFunction1/
│   │   └── main.tf
│   └── pyFunction2/
│       └── main.tf
└── terraform
    ├── README.md
    ├── common/
    ├── global/
    ├── main.tf
    ├── modules/
    ├── prod/
    └── stage/
 

Цель состоит в том, чтобы иметь возможность развертывать js/jsFunction1 независимо (без создания пакетов для каких-либо других функций), а также иметь terraform/main.tf возможность развертывать все лямбда-функции в репозитории (после их сборки). Это делается для того, чтобы разработчик мог обновлять этап развертывания, внося изменения в отдельную функцию, не беспокоясь о том, что у них может быть неправильная версия функции, над которой разработчик не работает.

Что я надеялся сделать, так это создать серверную часть для каждой лямбда-функции, чтобы разработчик мог использовать terraform apply ее из исходной папки. Я не вижу, как импортировать состояние лямбда-функций, которые были развернуты из terraform/ модуля. Можете ли вы сказать мне, является ли импорт состояния ресурсов разумным подходом или рекомендовать лучший способ добиться возможности развертывания одной из многих лямбда-функций?

Вот main.tf из js/jsFunction1

 module "jsFunction1" {
  source                        = "../../terraform/modules/lambda"
  source_path                   = "${path.module}/dist"
  lambda_function_name          = "jsFunction1"
  lambda_handler                = "lambdaAdapter.handler"
}
 

main.tf В каждой из папок в разделе js и есть аналогичное py . Это main.tf из terraform папки

 module "jsFunction1" {
    source = "./../js/jsFunction1"
}

module "jsFunction2" {
    source = "./../js/jsFunction2"
}

module "pyFunction1" {
    source = "./../py/pyFunction1"
}

module "pyFunction2" {
    source = "./../py/pyFunction2"
}
 

Ответ №1:

Вы можете использовать модуль lambda package для архивирования отдельных пакетов для конкретных лямбда-функций и их развертывания.

Модуль пакета имеет возможность создавать пакет, только если в соответствующих папках произошли изменения.

Таким образом, у вас может быть один main.tf и ссылка на выходные значения из модуля пакета.

Комментарии:

1. ДА. Это то terraform/main.tf , для чего нужно. Проблема заключается, скажем, в том, что разработчики работают над определенной функцией jsFunction1 . Сборка jsFunction2 может находиться за последней развернутой версией, но она будет развернута (перезаписывая более новую версию), поскольку она изменена относительно состояния в серверной части. По крайней мере, похоже, что это происходит.