Как ссылаться на локально упакованный исходный файл с помощью модуля terraform aws-lambda
Я пытаюсь сослаться на существующий исходный файл, который я создал с помощью пакета npm и построил для модуля лямбда. Когда я пытаюсь использовать
local_existing_package
Я получаю сообщение об ошибке от модуля лямбда, как будто он пытается найти файл source.zip из контейнера s3, а не локально. Эта ошибка генерируется самим лямбда-модулем.
ошибка:
│ 12: s3_key = var.s3_existing_package != null ? lookup(var.s3_existing_package, "key", null) : (var.store_on_s3 ? var.s3_prefix != null ? format("%s%s", var.s3_prefix, replace(local.archive_filename, "/^.*//", "")) : replace(local.archive_filename, "/^\\.//", "") : null)
│ ├────────────────
│ │ local.archive_filename is null
код из сгенерированного модуля лямбда:
locals {
archive_filename = element(concat(data.external.archive_prepare.*.result.filename, [null]), 0)
archive_was_missing = element(concat(data.external.archive_prepare.*.result.was_missing, [false]), 0)
# Use a generated filename to determine when the source code has changed.
# filename - to get package from local
filename = var.local_existing_package != null ? var.local_existing_package : (var.store_on_s3 ? null : local.archive_filename)
was_missing = var.local_existing_package != null ? !fileexists(var.local_existing_package) : local.archive_was_missing
# s3_* - to get package from S3
s3_bucket = var.s3_existing_package != null ? lookup(var.s3_existing_package, "bucket", null) : (var.store_on_s3 ? var.s3_bucket : null)
s3_key = var.s3_existing_package != null ? lookup(var.s3_existing_package, "key", null) : (var.store_on_s3 ? var.s3_prefix != null ? format("%s%s", var.s3_prefix, replace(local.archive_filename, "/^.*//", "")) : replace(local.archive_filename, "/^\\.//", "") : null)
s3_object_version = var.s3_existing_package != null ? lookup(var.s3_existing_package, "version_id", null) : (var.store_on_s3 ? element(concat(aws_s3_bucket_object.lambda_package.*.version_id, [null]), 0) : null)
мой модуль, который ссылается на ^^, определяется как:
module "my_lambda_fn" {
source = "terraform-aws-modules/lambda/aws"
version = "~>2.17.0"
function_name = "my-api-fn"
description = "Function for example"
handler = "src/index.handler"
runtime = "nodejs14.x"
timeout = 10
memory_size = 512
publish = true
cloudwatch_logs_retention_in_days = 60
attach_tracing_policy = true
tracing_mode = "Active"
# using prepackaged zip vs source
#https://registry.terraform.io/modules/terraform-aws-modules/lambda/aws/latest#lambda-functions-with-existing-package-prebuilt-stored-locally
# prebuilt packaging
create_package = false
local_existing_package = "${path.module}/../source.zip"
store_on_s3 = true
s3_bucket = module.s3_bucket.s3_bucket_id
Я просмотрел примеры из github по этому модулю, и, похоже, он соответствует тому, что рекомендуется.
Может ли кто-нибудь привести пример того, как связать исходный файл или указать, что мне не хватает? Это строится с использованием terraform 0.13.4.
1 ответ
После копания в лямбда-ресурсе и документации проблема заключалась в том, что я ссылался на контейнер s3 для загрузки упакованного кода в
store_on_s3 = true
s3_bucket = module.s3_bucket.s3_bucket_id
При развертывании кода лямбда-выражения с использованием локального источника aws загружает код в частный каталог, который недоступен для просмотра, но доступен для лямбда-выражения. Технически это естественное применение лямбда-выражений. Я использовал модуль неправильно, думая, что мне нужно загрузить source.zip, который не нужен. Удаление ссылки s3 решило проблему. Единственное изменение, которое я заметил, - это публикация таким образом маршрута к обработчику теперь требует имени пакета, поэтому теперь путь обработчика
source/src/index.handler