[PYTHON] Terraform configuré pour lancer AWS Lambda à partir d'Amazon SQS

introduction

Je suis ingénieur SRE. @hayaosato. Cette fois, j'aimerais appeler AWS Lambda (ci-après, Lambda), qui est très pratique pour créer une architecture sans serveur, à partir d'Amazon SQS (ci-après, SQS). Le code est ici

architecture

Lambda Les ressources Lambda peuvent être créées comme suit. L'application est un script pour les notifications slack.

// IAM Role for Lambda Function
resource "aws_iam_role" "default" {
  name               = var.service_name
  description        = "IAM Rolw for ${var.service_name}"
  assume_role_policy = file("${var.service_name}_role.json")
}

resource "aws_iam_policy" "default" {
  name        = var.service_name
  description = "IAM Policy for ${var.service_name}"
  policy      = file("${var.service_name}_policy.json")
}

resource "aws_iam_role_policy_attachment" "default" {
  role       = aws_iam_role.default.name
  policy_arn = aws_iam_policy.default.arn
}

// Lambda Function Resources
resource "aws_cloudwatch_log_group" "default" {
  name              = "/aws/lambda/${var.service_name}"
  retention_in_days = 7
}

data archive_file "default" {
  type        = "zip"
  source_dir  = "src"
  output_path = var.output_path
}

resource "aws_lambda_function" "default" {
  filename         = var.output_path
  function_name    = var.service_name
  role             = aws_iam_role.default.arn
  handler          = "lambda_function.lambda_handler"
  source_code_hash = data.archive_file.default.output_base64sha256
  runtime          = "python3.6"
  environment {
    variables = {
      SLACK_API_KEY = var.SLACK_API_KEY
    }
  }
}

Lors de la création d'une fonction Lambda avec Terraform, veuillez utiliser la ressource d'archive ʻarchive_file. En utilisant cela, vous pouvez générer un zip et l'appliquer à la fonction Lambda tel quel, ce qui est très simple. En d'autres termes, vous pouvez simplement incorporer cette configuration dans CI et terraform apply` à partir de l'outil CI.

SQS Les ressources SQS peuvent être créées comme suit.

resource "aws_sqs_queue" "default" {
  name                        = "${var.service_name}.fifo"
  fifo_queue                  = true
  content_based_deduplication = true
}

Coopération entre SQS et Lambda

Terraform dispose d'une ressource appelée lambda_event_source_mapping pour définir les déclencheurs Lambda. Cette fois, je vais l'utiliser.

resource "aws_lambda_event_source_mapping" "default" {
  event_source_arn = aws_sqs_queue.default.arn
  function_name    = aws_lambda_function.default.arn
}

De plus, comme cette ressource ne prend actuellement en charge que SQS, DynamoDB et Kinesis, elle ne peut pas être liée à partir de SNS (l'épave de la ressource créée pour lier le code avec SNS ...). Si vous mettez l'ARN d'une ressource qui ne peut pas être spécifiée dans ʻevent_source_arn`, elle créera ... ʻinfiniment. Cependant, l'événement de S3 peut être exécuté normalement.

résultat

Lançons en fait une file d'attente avec la ressource créée et exécutons-la. スクリーンショット 2019-12-02 23.08.34.png J'étais capable de スクリーンショット 2019-12-02 23.08.55.png

finalement

Après tout, c'est bien sans serveur

référence

Recommended Posts

Terraform configuré pour lancer AWS Lambda à partir d'Amazon SQS
Envoyer une demande d'AWS Lambda à Amazon Elasticsearch Service
Tweet d'AWS Lambda
Créez des paramètres dans terraform pour envoyer des messages depuis AWS Lambda Python3.8 vers Slack
Amazon SNS → AWS Lambda → Slack → Exécuter des commandes AWS sur AWS Chatbot
Comment lancer AWS Batch à partir de l'application cliente Python
Remarques sur l'accès à SQS depuis AWS VPC Lambda via un point de terminaison
Couches AWS Lambda Une explication rapide de la création à la liaison
[Lambda] [Python] Publier sur Twitter depuis Lambda!
Précautions lors de l'exécution de Python sur EC2 à partir d'AWS Lambda (Exécuter la commande)
Comment lancer Explorer à partir de WSL
Changer l'instance AWS EC2 de t2 à t3
Publiez régulièrement sur Twitter en utilisant AWS lambda!
Comment accéder à RDS depuis Lambda (python)
Connectez-vous à s3 avec AWS Lambda Python
[Amazon Linux] Passage de la série Python 2 à la série Python 3
Résumé de l'écriture d'AWS Lambda
[AWS; Introduction à Lambda] 2ème; Extraire des phrases du fichier json et enregistrer S3 ♬
[Introduction à AWS] Le premier Lambda est Transcribe ♪
[AWS / Lambda] Comment charger une bibliothèque externe Python
Résumé de l'étude de Python pour utiliser AWS Lambda
Version Amazon API Gateway et AWS Lambda Python
[AWS] Migrer les données de DynamoDB vers Aurora MySQL