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é:
null_resource
Et il ne met pas à jour ... Pourquoi est-ce?
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.
Il y a 2 choses dont vous devez vous occuper:
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.
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.
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.