#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]
...
}
Вы можете прочитать больше о пространстве имен вывода модуля в документации.