#aws-lambda #terraform #terraform-provider-aws
#aws-lambda #terraform #terraform-provider-aws
Вопрос:
У меня есть лямбда-код, который я хочу вызвать один раз во время применения terraform, поскольку он обновляет базу данных и должен запускаться только один раз на этапе применения.
Моя проблема в том, что terraform также вызывает его на этапе планирования.
Есть ли способ запустить его только на этапе применения?
Пример:
data "aws_lambda_invocation" "run_lambda" {
function_name = "test"
input = <<JSON
{}
JSON
}
Комментарии:
1. Интересная проблема. Я подозреваю, что вы не можете запретить этому конкретному ресурсу вызывать лямбда-код при планировании — он настроен как источник данных, поэтому Terraform «прочитает» его на этапе планирования. Поскольку вы записываете данные с помощью этого лямбда-кода, вам понадобится что-то еще. Вот модуль, который я никогда не использовал, но, возможно, стоит попробовать: registry.terraform.io/modules/crisboarna/lambda-invoke/aws /…
Ответ №1:
Вам нужно использовать aws_lambda_invocation
ресурс, а не источник данных (это также сбило меня с толку). Из документации:
Этот ресурс вызывает функцию только тогда, когда аргументы вызывают create или update . Другими словами, после первоначального вызова apply, если аргументы не изменяются, последующее apply не вызывает функцию снова. Для динамического вызова функции см. Пример триггеров ниже. Чтобы всегда вызывать функцию при каждом применении, см. Источник данных aws_lambda_invocation .
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function
Ответ №2:
поздно для запрашивающего, но ответьте на будущее: попробуйте использовать depends_on: [some_resource]
construct в aws_lamdbda_invocation. пусть вызов зависит от любого другого ресурса. Если нет зависимости (во что я с трудом верю), введите искусственную, например time_sleep
. Пусть выполнение ожидает 1 секунду и делает лямбда-код зависимым от него. Этот способ terraform plan
не будет жаловаться.
Комментарии:
1. Я попробовал ‘depends_on = [aws_lambda_function.name ]’ и ‘depends_on = [time_sleep.wait_30_seconds]’, и оба по-прежнему приводят к дополнительным вызовам. Есть ли требования, которые вы не перечислили? По общему признанию, я нахожу это немного трудным для чтения.