Как я могу получить согласованные пути при использовании зависимости_on от archive_file? - PullRequest
1 голос
/ 19 июня 2020

У меня есть этот файл terraform

provider "aws" {
  region = "us-east-1"
}

resource "null_resource" "snapshot_pip_receiver" {
  provisioner "local-exec" {
    command = "cd ${path.module}/lambdas; make lint-snapshot collect-snapshot"
  }
}

data "archive_file" "lambda-zip" {
  depends_on = [
    null_resource.snapshot_pip_receiver
  ]

  source_dir  = "${path.module}/lambda/"
  output_path = "${path.module}/es-snapshot.zip"
  type        = "zip"
}

resource "aws_lambda_function" "es_snapshot_lambda" {
  depends_on       = [data.archive_file.lambda-zip]
  filename         = data.archive_file.lambda-zip.output_path
  function_name    = "test-lambda"
  role             = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
  source_code_hash = filebase64sha256(data.archive_file.lambda-zip.output_path)
  handler          = "es-snapshot.lambda_handler"
  runtime          = "python2.7"
  timeout          = 10

}

terraform plan дает это на выходе

Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

Error: Error in function call

  on main.tf line 26, in resource "aws_lambda_function" "es_snapshot_lambda":
  26:   source_code_hash = filebase64sha256(data.archive_file.lambda-zip.output_path)
    |----------------
    | data.archive_file.lambda-zip.output_path is "./es-snapshot.zip"

Call to function "filebase64sha256" failed: no file exists at es-snapshot.zip.

То, что я сделал до сих пор: -

  1. Если я удалю depends_on из archive_file, он будет успешно запущен, но мне нужно, чтобы для создания приложения сначала должен был выполняться null_resource.
  2. Я попытался явно указать depends_on в aws_lambda_function, но нет используйте.
  3. Я заменил aws_lambda_function другим null_resource вызовом output_path, и он работал успешно.

Как я могу получить согласованные пути при использовании зависимости_on от archive_file?

Ответы [ 2 ]

1 голос
/ 24 июня 2020

Различные функции Terraform, которые читают файлы с диска, предназначены исключительно для чтения файлов, которые статически существуют на диске как часть конфигурации. Они не подходят для чтения файлов , созданных конфигурацией, потому что оценка конфигурации происходит перед выполнением.

К счастью, здесь вам вообще не нужна функция, потому что archive_file автоматически экспортирует SHA256 ha sh созданного архива, закодированного с помощью base64:

resource "aws_lambda_function" "es_snapshot_lambda" {
  filename         = data.archive_file.lambda-zip.output_path
  function_name    = "test-lambda"
  role             = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
  source_code_hash = data.archive_file.lambda-zip.output_base64sha256
  handler          = "es-snapshot.lambda_handler"
  runtime          = "python2.7"
  timeout          = 10
}
0 голосов
/ 21 июня 2020

Я подозреваю, что в файле_архива есть некоторая внутренняя «хитрость», искажающая output_path между тем, когда он установлен в качестве аргумента, и когда вы его читаете. Технически это аргумент, а не атрибут ресурса archive_file , поэтому может не быть никаких гарантий относительно его значения, если вы его прочитаете.

Учитывая, что пути используются несколько раз, вычисление их один раз в локальном блоке следует избегать этой проблемы несовместимых значений:

provider "aws" {
  region = "us-east-1"
}

locals {
  lambda_dir = "${path.module}/lambdas/"
  lambda_zip_path = "${path.module}/es-snapshot.zip"
}

resource "null_resource" "snapshot_pip_receiver" {
  provisioner "local-exec" {
    command = "cd \"${local.lambda_dir}\" ; make lint-snapshot collect-snapshot"
  }
}

data "archive_file" "lambda-zip" {
  depends_on = [
    null_resource.snapshot_pip_receiver
  ]

  source_dir  =  local.lambda_dir
  output_path = local.lambda_zip_path
  type        = "zip"
}

resource "aws_lambda_function" "es_snapshot_lambda" {
  depends_on       = [data.archive_file.lambda-zip]
  filename         = data.archive_file.lambda-zip.output_path
  function_name    = "test-lambda"
  role             = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
  source_code_hash = filebase64sha256(local.lambda_zip_path)
  handler          = "es-snapshot.lambda_handler"
  runtime          = "python2.7"
  timeout          = 10
}
...