1
votes

Logique de rétention de Terraform Cloudwatch

J'essaie d'ajouter une logique à mon script terraform de sorte que lorsqu'un lambda est créé, une logique de rétention CW soit ajoutée, afin que nos journaux soient effacés après 30 jours. Ce que je vois, c'est que lorsque terraform est exécuté pour mettre à jour un lambda existant (qui a été déployé avant l'ajout de ma nouvelle logique de rétention), mon travail échoue avec l'erreur ci-dessous.

  • aws_cloudwatch_log_group.lambda-deploy: 1 erreur (s) s'est produite:

  • aws_cloudwatch_log_group.lambda-deploy: la création du groupe de journaux CloudWatch a échoué: ResourceAlreadyExistsException: le groupe de journaux spécifié existe déjà code d'état: 400, ID de demande: e500eb50-4a81-11e9-9c08-7152b4a0ad31: le groupe de journaux CloudWatch '/ aws / lambda / {lambda-name} 'existe déjà.

Voici comment configurer mon code terraform:

resource "aws_lambda_function" "lambda-deploy" {
  filename      = "${var.filename}"
  function_name = "${var.functionname}"
  role          = "${var.role}"
  handler       = "${var.handler}"
  runtime       = "${var.runtime}"
  publish       = "${var.publish}"
  memory_size   = "${var.memory_size}"
  timeout       = "${var.timeout}"
  description   = "${var.description}"

  layers = "${var.layers}"

  environment {
    variables = "${var.envVars}"
  }

  tags {
    PLATFORM        = "${var.tag_PLATFORM}"
    BUSINESS_UNIT   = "${var.tag_BUSINESS_UNIT}"
    CLIENT          = "${var.tag_CLIENT}"
    BUSINESS_REGION = "${var.tag_BUSINESS_REGION}"
  }

  vpc_config {
    subnet_ids         = "${var.subnet_ids}"
    security_group_ids = "${var.security_group_ids}"
  }
}

#Below logic will add cloud watch retention logic so logs rotate after 30 days.
resource "aws_cloudwatch_log_group" "lambda-deploy" {
  name              = "/aws/lambda/${aws_lambda_function.lambda-deploy.function_name}"
  retention_in_days = "30"
}

Ma question est la suivante: est-ce possible pour le aws_cloudwatch_log_group ressource pour vérifier si un groupe cloudwatch a été créé et simplement mettre à jour la politique de rétention au lieu d'essayer de créer le groupe de journaux?


0 commentaires

3 Réponses :


0
votes

Puisque vous ne nous montrez pas la politique de rôle iam pour la fonction lambda, je dois deviner.

Mon sentiment est le rôle iam et la politique pour lambda a l'autorisation logs: CreateLogGroup . La fonction lambda s'occupera donc de créer un groupe de journaux s'il n'existe pas .

Lorsque vous mettez à jour, ce groupe de journaux n'est pas géré par terraform, il signalera le problème.

Pourriez-vous supprimer l'autorisation logs: CreateLogGroup et supprimer le groupe de journaux, puis réessayer?


1 commentaires

Vous pouvez également importer le groupe de journaux existant au lieu de le supprimer et de laisser Terraform le recréer.



1
votes
  1. Commentez l'argument de nom
  2. L'exemple ci-dessus, par exemple:

    resource "aws_cloudwatch_log_group" "lambda-deploy" {
      #name = "/aws/lambda/${aws_lambda_function.lambda-deploy.function_name}"
      retention_in_days = "30"
    }
    

    Devient:

    resource "aws_cloudwatch_log_group" "lambda-deploy" {
      name = "/aws/lambda/${aws_lambda_function.lambda-deploy.function_name}"
      retention_in_days = "30"
    }  
    
    1. Importez la ressource

      terraform import aws_cloudwatch_log_group.lambda-deploy /aws/lambda/${aws_lambda_function.lambda-deploy.function_name}

    $ {aws_lambda_function.lambda-deploy.function_name} est ce que vous avez dans AWS.

    1. Décommentez votre argument 'nom' et exécutez terraform plan , votre groupe de journaux est maintenant géré par terraform ... ouf!

2 commentaires

Ce que vous entendez par "Où $ {aws_lambda_function.lambda-deploy.function_name} est ce qu'il y a dans AWS" n'est pas clair. Pourriez-vous élaborer?


Je ne comprends pas pourquoi vous avez commenté le nom et que vous ne l'avez pas commenté. Ce n'est pas nécessaire (et serait un problème SERIEUX si votre groupe de journaux est un ou plusieurs modules à chargement profond à partir de dépôts git étiquetés). Créez simplement le groupe de journaux avec le nom / aws / lambda / nom_fonction, importez-le comme dans # 2, puis appliquez-le pour synchroniser les choses.



0
votes

Il lui est TECHNIQUEMENT possible de détecter s'il existe et éventuellement de ne pas le créer. En théorie, vous pouvez créer un bloc de données pour importer un groupe de journaux préexistant, puis une ressource avec un décompte dynamique pour activer ou désactiver la création. Mais vous ne voudriez pas le faire de cette façon, ce piratage étrange serait dans votre code infra pour toujours. Vous voulez garder votre terraform propre et orientée vers la recréation de votre infrastructure à partir de zéro.

En supposant que vous ayez déjà un lambda, ce lambda avec AWSLambdaBasicExecutionRole a créé son propre groupe de journaux en dehors de terraform sans paramètres de rétention, et maintenant vous voulez ajouter des paramètres de rétention contrôle pour terraformer, vous avez un peu de cornichon sur les mains. Terraform voudra créer ce groupe de journaux car il ne sait pas qu'il existe, mais ne peut pas car le nom est en cours d'utilisation.

Vous devez donc importer le groupe de journaux existant pour le mapper à la déclaration de ressource vous avez fait en terraform. Ensuite, lorsque vous postulez, terraform ajustera le groupe de journaux existant à votre configuration TF.

Ce matin, j'étais dans cette situation exacte, mes lambdas (et d'autres choses) sont créés dans un module qui est chargé dans environ 10 piles différentes (dans 3 environnements) et je ne voulais pas le faire entièrement à la main, je vais donc partager ce petit ensemble de commandes bash que j'ai assemblées pour vous faciliter la tâche. Ceci est piraté et dépend de la sortie de la console terraform (en constante évolution), mais pour moi aujourd'hui sur Terraform v0.14.4, la sortie d'une application échouerait comme ceci:

Voulez-vous effectuer ces actions? Terraform effectuera le actions décrites ci-dessus. Seul "oui" sera accepté pour approbation.

Saisissez une valeur: oui

module.api_gateway.aws_cloudwatch_log_group.this: Création ...

Erreur: la création du groupe de journaux CloudWatch a échoué: ResourceAlreadyExistsException: le groupe de journaux spécifié déjà existe: le groupe de journaux CloudWatch 'API-Gateway-Execution-Logs_7pnv677kwa / 0' existe déjà.

Les commandes suivantes captureraient cette sortie, analysaient l'espace de noms de la ressource et le nom aws sur les deux dernières lignes, puis effectueraient une importation. Ce n’est pas un script optimisé, juste quelque chose que j’ai mis ensemble pour faire un travail.

terraform apply 2>&1 | tee out.txt
resource=$(cat out.txt | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g" | grep Creating | grep cloudwatch | cut -f 1 -d:)
name=$(cat out.txt | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g" | grep Creating | grep exists | cut -f 2 -d\')
terraform import $resource $name
terraform apply
rm out.txt


0 commentaires