web-dev-qa-db-fra.com

Terraform n'envoie pas de nouveau ZIP

Je souhaite utiliser Terraform pour le déploiement de mes fonctions lambda. J'ai fait quelque chose comme: 

provider "aws" {
    region = "ap-southeast-1"
}

data "archive_file" "lambda_Zip" {
    type = "Zip"
    source_dir = "src"
    output_path = "build/lambdas.Zip"
}

resource "aws_lambda_function" "test_terraform_function" {
    filename = "build/lambdas.Zip"
    function_name = "test_terraform_function"
    handler = "test.handler"
    runtime = "nodejs8.10"
    role = "arn:aws:iam::000000000:role/xxx-lambda-basic"
    memory_size = 128
    timeout = 5
    source_code_hash = "${data.archive_file.lambda_Zip.output_base64sha256}"
    tags = {
        "Cost Center" = "Consulting"
        Developer = "Jiew Meng"
    }
}

Je constate que lorsqu'il n'y a pas de changement dans test.js, terraform ne détecte correctement aucun changement 

No changes. Infrastructure is up-to-date.

Lorsque je modifie le fichier test.js, terraform détecte un changement: 

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  ~ aws_lambda_function.test_terraform_function
      last_modified:    "2018-12-20T07:47:16.888+0000" => <computed>
      source_code_hash: "KpnhsytFF0yul6iESDCXiD2jl/LI9dv56SIJnwEi/hY=" => "JWIYsT8SszUjKEe1aVDY/ZWBVfrZYhhb1GrJL26rYdI="

Il ne Zip le nouveau Zip, cependant, il ne semble pas mettre à jour la fonction avec le nouveau Zip. Il semble que cela pense puisque le nom du fichier n'a pas changé, il n'est pas téléchargé ... Comment puis-je résoudre ce problème? 

===== 

Suite à certaines des réponses ici, j'ai essayé: 

  • Utiliser null_resource
  • Utilisation du compartiment/objet S3 avec etag

Et il ne met pas à jour ... Pourquoi est-ce? 

5
Jiew Meng

J'ai rencontré le même problème et ce qui a été résolu pour moi, c'est la publication automatique des fonctions Lambda à l'aide de l'argument publish . Pour ce faire, définissez simplement publish = true dans votre ressource aws_lambda_function.

Notez que votre fonction sera versionnée après cela et que chaque changement en créera un nouveau. Par conséquent, vous devez vous assurer que vous utilisez la référence d'attribut qualified_arn si vous faites référence à la fonction dans l'un de vos autres codes Terraform.

4

Il y a 2 choses dont vous devez vous occuper:

  • télécharger un fichier Zip sur S3 si son contenu a changé
  • mettre à jour la fonction Lambda si le contenu du fichier Zip a changé

Je peux voir que vous prenez soin de ce dernier avec source_code_hash. Je ne vois pas comment vous gérez l'ancien. Cela pourrait ressembler à ça:

resource "aws_s3_bucket_object" "Zip" {
  bucket               = "${aws_s3_bucket.Zip.bucket}"
  key                  = "myzip.Zip"
  source               = "${path.module}/myzip.Zip"
  etag                 = "${md5(file("${path.module}/myzip.Zip"))}"
}

etag est l'option la plus importante ici.

2
automatictester

Il existe une solution pour déclencher l'actualisation de la ressource si les noms de fichier lambda cible sont src/main.py et src/handler.py. Si vous avez plus de fichiers à gérer, ajoutez-les un par un.

resource "null_resource" "lambda" {
  triggers {
    main    = "${base64sha256(file("src/main.py"))}"
    handler = "${base64sha256(file("src/handler.py"))}"
  }
}

data "archive_file" "lambda_Zip" {
  type        = "Zip"
  source_dir  = "src"
  output_path = "build/lambdas.Zip"

  depends_on = ["null_resource.lambda"]
}

Faites-moi savoir si cela fonctionne pour vous.

2
BMW

J'ai créé ce module pour aider à résoudre certains problèmes liés au déploiement de Lambda avec Terraform: https://registry.terraform.io/modules/rojopolis/lambda-python-archive/aws/0.1.4

Cela peut être utile dans ce scénario. Fondamentalement, il remplace la source de données "archive_file" par une source de données d'archive lambda spécialisée afin de mieux gérer le hachage de code source stable, etc.

0
Robert Jordan