Терраформирование с добавлением лямбда-слоя

#terraform #terraform-provider-aws

Вопрос:

Я пытаюсь заставить terraform создать лямбда-слой, и я получаю «Ссылку на незадекларированный ресурс» Вот main.tf код в каталоге src, где я получаю ошибку

 module "name" {
  ...
  ...
  layer_arns = [aws_lambda_layer_version.mm_layer.arn]
  ...
  ...
}
 

Вот те lambda-layer.tf файл ресурсов внутри папки лямбда-уровня, на которую я пытаюсь ссылаться

 locals {
  region = var.region
}

resource "aws_lambda_layer_version" "mm_layer" {
  layer_name = "common-layer"
  ...
  ...
  compatible_runtimes = ["nodejs12.x"]
}
 

РЕДАКТИРОВАТЬ: Вот объявленный модуль

 module "lambda-layer" {
  source = "./modules/lambda-layer"
  region = module.common.region[module.common.region]
  env = var.env
}
 

Не знаю, почему он не может найти ссылку. Я четко указываю в ресурсе, что это mm_layer, и я пытаюсь назвать его «mm_layer».

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

1. «в lambda-layer.tf файл ресурсов внутри папки лямбда-уровня» подразумевает, что ресурс находится в объявленном модуле. Если да, пожалуйста, добавьте это объявление модуля в вопрос.

2. Добавлено в правке.

3. Можно ли с уверенностью предположить, что aws_lambda_layer_version.mm_layer этого нет в объявленных выводах для lambda-layer модуля?

4. Поэтому я добавил output.tf и объявил следующее: вывод «aws_lambda_layer_version_mm_layer» { значение = aws_lambda_layer_version.mm_layer.arn } Я все еще получаю ту же ошибку, хотя. Почти уверен, что я все сделал правильно.

Ответ №1:

После определения того, что объявленный ресурс находится в объявленном модуле и что экспортированные атрибуты ресурса отсутствуют в объявленных выходных данных модуля, мы можем решить эту проблему, объявив экспортированный атрибут в качестве выходных данных для объявленного модуля. Это связано с тем, что экспортируемые атрибуты ресурсов существуют только в одном пространстве имен конфигурации и должны быть доступны с использованием номенклатуры пространства имен.

Внутри конфигурации для lambda-layer источника модуля вам необходимо добавить объявленный вывод:

 output "mm_layer_arn" {
  description = "arn for the mm lambda layer"
  value       = aws_lambda_layer_version.mm_layer.arn
}
 

Вы можете аналогичным образом вывести весь объект атрибутов экспортируемого ресурса, присвоив aws_lambda_layer_version.mm_layer ему значение, но это в основном полезно, если вам нужно получить доступ к этому объекту или иным образом выполнить итерацию.

Теперь этот вывод будет доступен из пространства имен конфигурации, в котором объявлен модуль (в данной ситуации lambda-layer ). Поскольку модуль name объявлен в той же конфигурации, lambda-layer что и объявление, это объявление модуля теперь может получить доступ к выходным данным в соответствующем пространстве имен:

 module "name" {
  ...
  layer_arns = [module.lambda-layer.mm_layer_arn]
  ...
}
 

Вы можете прочитать больше о пространстве имен вывода модуля в документации.