Как структурировать шаблоны терраформирования для бессерверных приложений

#terraform

#terraform

Вопрос:

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

Каждый из этих компонентов размещается в соответствующих репозиториях, но все вместе они являются частью одной и той же архитектуры. Я пытаюсь структурировать свои шаблоны terraform, но меня беспокоил тот факт, что некоторые из этих лямбд имеют общие ресурсы, например, таблицы хранения или сегменты s3, поэтому мне было интересно, было бы неплохо иметь только main.tf файл в каждом репозитории лямбды, которыйсоздает только саму лямбду, а не какие-либо другие ее зависимости, таким образом, я мог бы повторно развернуть лямбду через ci / cd, не беспокоясь о других компонентах, и я бы разместил все остальные части архитектуры, которые более или менее долговечны, в центральном репозитории и запускал бы их только при необходимости через ci / cd.это репозиторий, выделенный конвейер ci / cd. Я также думал о создании файла tfvar, в котором есть все имена общих ресурсов.

Является ли это допустимым подходом? Каковы недостатки? Каковы альтернативы?

Ответ №1:

Вы на правильном пути. У вас может быть модуль для лямбд, который принимает эти общие ресурсы в качестве переменных. Вы можете либо жестко запрограммировать ресурсы, которые вы terraform import используете, и передать их в свой лямбда-код:

В modules/lambda папке

 resource "aws_lambda_function" "this" {
    """
    My lambda stuff
    """
}
 

В вашей основной папке main.tf

 module "lambda1"{
   s3_bucket = "${var.common_bucket}"
   iam_role = "${var.common_role}"
   subnets = "${var.private_subnets}"
   ....
}

module "lambda2"{
   s3_bucket = "${var.common_bucket}"
   iam_role = "${var.common_role}"
   subnets = "${var.private_subnets}"
   ....
}

module "lambda3"{
   s3_bucket = "${var.common_bucket}"
   iam_role = "${var.common_role}"
   subnets = "${var.private_subnets}"
   ....
}
 

Если вы хотите импортировать общие ресурсы, например, использовать политику iam для правила, просто сделайте что-то вроде этого

 resource "aws_iam_policy" "my_policy" {

}
 

Затем выполните команду terraform import aws_iam_policy.my_policy <policy arn>

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

1. Если каждый из лямбд предназначен для разных приложений, то они, вероятно, будут сильно отличаться в зависимости от того, как они настроены, до такой степени, что, вероятно, не стоит включать их в какой-то общий модуль. Я не уверен, что этот ответ действительно помогает вообще, и идея импорта общих ресурсов для ссылки на них бессмысленна и опасна (вам не нужно управлять ресурсом из нескольких мест, и вы можете ссылаться на политику с помощью ARN, которая в любом случае в значительной степени определяется именем политики.

2. Я не уверен, что понял вашу озабоченность. Независимо от того, как настроены лямбды, тип зависимостей практически одинаков. И это именно то, для чего предназначены модули. Если зависимость является общей, просто передайте ее всем функциям, которые в ней нуждаются. Если требуется эксклюзив, просто передайте его таким же образом этой единственной функции.