Ich bin ein SRE-Ingenieur. @ Hayaosato. Dieses Mal möchte ich AWS Lambda (im Folgenden: Lambda) von Amazon SQS (im Folgenden: SQS) anrufen, das sich hervorragend zum Erstellen einer serverlosen Architektur eignet. Der Code lautet hier
Lambda Lambda-Ressourcen können wie folgt erstellt werden. Die Anwendung ist ein Skript für Slack-Benachrichtigungen.
// 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
}
}
}
Verwenden Sie beim Erstellen einer Lambda-Funktion mit Terraform die Archivressource "archive_file". Auf diese Weise können Sie einen Reißverschluss erstellen und auf die Lambda-Funktion anwenden, was sehr einfach ist. Mit anderen Worten, Sie können diese Konfiguration einfach in CI integrieren und Terraform Apply über das CI-Tool anwenden.
SQS SQS-Ressourcen können wie folgt erstellt werden.
resource "aws_sqs_queue" "default" {
name = "${var.service_name}.fifo"
fifo_queue = true
content_based_deduplication = true
}
Terraform verfügt über eine Ressource namens lambda_event_source_mapping zum Festlegen von Lambda-Triggern. Dieses Mal werde ich dies verwenden.
resource "aws_lambda_event_source_mapping" "default" {
event_source_arn = aws_sqs_queue.default.arn
function_name = aws_lambda_function.default.arn
}
Da diese Ressource derzeit nur SQS, DynamoDB und Kinesis unterstützt, kann sie nicht über SNS verknüpft werden (das Wrack der Ressource, die zum Verknüpfen des Codes mit SNS erstellt wurde ...). Wenn Sie die ARN einer Ressource einfügen, die nicht in "event_source_arn" angegeben werden kann, wird "..." unendlich erstellt. Das Ereignis von S3 kann jedoch normal ausgeführt werden.
Stellen wir tatsächlich eine Warteschlange mit der erstellten Ressource aus und führen sie aus. Ich war in der Lage
Immerhin ist serverlos gut