Terraform ile Serverless Apps için işleyicisi

Serverless hesaplama, takımların ölçeklenebilirlik, ödeme amaçlı fiyatlamaları ve operasyonel yükü nasıl artırdığını değiştirdi. ancak, üretimdeki sunucusuz uygulamaları yazılı fonksiyon kodundan çok daha fazla içerir.You need to specify and manage düzinelerce bulut resources - API Gateways, kuyruklar, databases, IAM rolleri, log yapılandırmalar ve ağ bileşenleri - tüm bunlar sürekli olarak gelişim boyunca çoğaltılmalıdır, stilize ve üretim ortamları.

Terraform Nedir?

Terraform, adım adım adım adım komutları yürüten açık kaynak IaC aracıdır, altyapınızı istediğiniz kaynakları beyan eder ve yönetebilirsiniz, diğerleriyle nasıl ilişkili olurlar - ve Terraform, bu duruma ulaşmak için gerekli işlemleri belirler.

Terraform'un kalbinde, herhangi bir değişiklik yapmadan önce, Terraform, altyapının mevcut durumuna karşı yapılandırmanızı karşılaştırır ve haritaların gerçek dünya bulut nesnelerine ait olduğunu ayrıntılı bir plan üretir.Bu plan, Terraform'da nelerin yönetildiğini ve tespit edilmesi için önemlidir.

Terraform, tüm büyük bulut platformları (AWS, Azure, Google Cloud), Bulutflare, Datadog ve GitHub gibi SaaS hizmetleri de dahil olmak üzere yüzlerce sağlayıcıyı destekler ve genellikle onları bir araya getiren Cognito kullanıcı havuzları ve her IAM politikası kullanır.

Neden Serverless Apps Kod olarak Altyapıya ihtiyaç duyuyor

Serverless uygulamalar, birkaç tane küçük, amaçlı bir şekilde veya senkronizasyonlu bir şekilde iletişim kurmak için bir API Gateway içerir.A tipik bir etkinlik odaklı mimari, HTTP istekleri alan bir API Gateway içerebilir, bir Lambda işlevi onları işlemek için, bir DynamoDB masasını depolamak için: ikinci bir Lambda işlevi için bu kaynakları elle oluşturmak için bir SQS kuyruğu.

IaC bu sorunları yazılımlara dönüştürerek çözer. Her değişiklik bir çekme isteğidir. Her çevre tekrarlanabilir bir dağıtımdır. Ve tüm mimarlık birkaç dakika içinde yıkılabilir ve yeniden inşa edilebilir. sunucusuz uygulamalar için, değer önermesi hız ve çeviktir, IaC güvenilir bir üretim akışının temelidir.

Terraform'u Serverless için kullanmanın Anahtar Faydaları

Herhangi bir IaC aracı sunucusuz altyapıyı yönetmek için kullanılabilirken, Terraform sunucusuz takımların ihtiyaçlarına iyi uyum sağlayan farklı avantajlar sunar.

Full Lifecycle Otomasyon

Terraform sadece geçici değil, aynı zamanda kaynakları da güncelletirir. Bir Lambda işlevinin hafıza boyutunu değiştirmek veya bir DynamoDB tablosunun TTL özelliklerini değiştirmek için, sadece sunucusuz bir yığına güncelleştirmek ve çalıştırmak gerekir:0.Bir kaynakla yapıldığında, onu temizleyecek aynı kod.Bu özellikle ephemeral ortamlarda değerlidir - her çekme isteği için önyükleme işlemleri gibi - her yer tam bir sunucusuz bir yığına geri döndürebilir ve sonra otomatik olarak yok edebilirsiniz.

Declarative Dependency Management

Serverless mimarlıklar karmaşık bağımlılıklara sahiptir. A Lambda işlevi, başvuru yapmadan önce kaynakları otomatik olarak belirler ve size hata senaryolarına bağlı olarak, ARN. Terraform, bildirimlerinizin bir kaynak grafiği inşa eder ve otomatik olarak doğru işlem siparişlerini belirler.

Çok-Environment Consistency

Terraform iş alanları veya dizileri kullanarak, farklı değişken değerlere sahip birden çok ortamda aynı konfigürasyonu yeniden kullanabilirsiniz. A Lambda işlevinin yapılandırması, masa isimleri, log seviyeleri veya VPC ayarları gibi çevreye özgü değişkenler dışında aynı şekilde kullanılabilir.Bu, üretim altyapısının tam olarak ne test edildiğini garanti eder.

Granular State Control

Devlet yönetimi kritik bir endişedir. Terraform, S3 gibi geri dönüşümlü olarak devlet idaresini depolamanızı sağlar ( DynamoDB kilitleme ile), Terraform Cloud veya HashiCorp Konsolosluk. Uzak devlet işbirliğine izin verir: Birden çok mühendis çatışmadan aynı altyapıya güvenle başvurabilir.

Serverless Deployment için Terraform ile başlayın

AWS'de Terraform kullanarak tam bir sunucusuz uygulama kurmakla birlikte yürüyoruz. Örnekümüz, bir Lambda işlevi tetikleyen API Gateway aracılığıyla basit bir REST API'yi ortaya koyacağız, bu da gerekli IAM izinlerini kaplayacağız.

Önlemler Önlemler

Project Structure Structure

serverless-terraform/
├── main.tf
├── variables.tf
├── outputs.tf
├── lambda/
│ └── index.js
└── terraform.tfvars

1. Terraform Sağlayıcıyı Tanımlayın

[FONTD:3], AWS sağlayıcısını yapılandırın ve bölgeyi belirtin:

terraform {
 required_providers {
 aws = {
 source = "hashicorp/aws"
 version = "~> 5.0"
 }
 }
 backend "s3" {
 bucket = "my-terraform-state-bucket"
 key = "serverless-app/terraform.tfstate"
 region = "us-east-1"
 dynamodb_table = "terraform-locks"
 }
}

provider "aws" {
 region = var.aws_region
}

2. Lambdada için IAM Rol Oluştur

data "aws_iam_policy_document" "lambda_assume_role" {
 statement {
 actions = ["sts:AssumeRole"]
 principals {
 type = "Service"
 identifiers = ["lambda.amazonaws.com"]
 }
 }
}

resource "aws_iam_role" "lambda_exec" {
 name = "serverless-lambda-role"
 assume_role_policy = data.aws_iam_policy_document.lambda_assume_role.json
}

resource "aws_iam_policy" "lambda_dynamodb_policy" {
 name = "lambda-dynamodb-policy"
 policy = jsonencode({
 Version = "2012-10-17"
 Statement = [
 {
 Action = ["dynamodb:PutItem", "dynamodb:GetItem", "dynamodb:UpdateItem"]
 Effect = "Allow"
 Resource = aws_dynamodb_table.items.arn
 },
 {
 Action = ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"]
 Effect = "Allow"
 Resource = "*"
 }
 ]
 })
}

resource "aws_iam_role_policy_attachment" "lambda_policy_attach" {
 role = aws_iam_role.lambda_exec.name
 policy_arn = aws_iam_policy.lambda_dynamodb_policy.arn
}

3. DynamoDB Masasını İşleyin

resource "aws_dynamodb_table" "items" {
 name = "items"
 billing_mode = "PAY_PER_REQUEST"
 hash_key = "id"

 attribute {
 name = "id"
 type = "S"
 }

 tags = {
 Environment = var.environment
 }
}

4. Paket ve Lambda Function'ı işe almak

İlk olarak, basit bir Lambda işlevinin içinde 03: 7) oluşturun:

exports.handler = async (event) => {
 const AWS = require('aws-sdk');
 const dynamodb = new AWS.DynamoDB.DocumentClient();
 const id = event.pathParameters.id;

 const params = {
 TableName: process.env.TABLE_NAME,
 Item: { id, timestamp: Date.now(), data: event.body }
 };

 await dynamodb.put(params).promise();

 return {
 statusCode: 200,
 body: JSON.stringify({ id })
 };
};

Sonra, Terraform yapılandırmanızda, fonksiyon kodunu referans edin:

data "archive_file" "lambda_zip" {
 type = "zip"
 source_dir = "${path.module}/lambda"
 output_path = "${path.module}/lambda_function_payload.zip"
}

resource "aws_lambda_function" "api_handler" {
 filename = data.archive_file.lambda_zip.output_path
 function_name = "serverless-api-handler"
 role = aws_iam_role.lambda_exec.arn
 handler = "index.handler"
 runtime = "nodejs18.x"
 source_code_hash = data.archive_file.lambda_zip.output_base64sha256

 environment {
 variables = {
 TABLE_NAME = aws_dynamodb_table.items.name
 }
 }
}

5. Lambda'yı API Gateway ile Expose

resource "aws_api_gateway_rest_api" "api" {
 name = "serverless-api"
}

resource "aws_api_gateway_resource" "items" {
 rest_api_id = aws_api_gateway_rest_api.api.id
 parent_id = aws_api_gateway_rest_api.api.root_resource_id
 path_part = "items"
}

resource "aws_api_gateway_resource" "item" {
 rest_api_id = aws_api_gateway_rest_api.api.id
 parent_id = aws_api_gateway_resource.items.id
 path_part = "{id}"
}

resource "aws_api_gateway_method" "put_item" {
 rest_api_id = aws_api_gateway_rest_api.api.id
 resource_id = aws_api_gateway_resource.item.id
 http_method = "PUT"
 authorization = "NONE"
}

resource "aws_api_gateway_integration" "lambda" {
 rest_api_id = aws_api_gateway_rest_api.api.id
 resource_id = aws_api_gateway_resource.item.id
 http_method = aws_api_gateway_method.put_item.http_method
 integration_http_method = "POST"
 type = "AWS_PROXY"
 uri = aws_lambda_function.api_handler.invoke_arn
}

resource "aws_lambda_permission" "apigw" {
 statement_id = "AllowExecutionFromAPIGateway"
 action = "lambda:InvokeFunction"
 function_name = aws_lambda_function.api_handler.function_name
 principal = "apigateway.amazonaws.com"
 source_arn = "${aws_api_gateway_rest_api.api.execution_arn}/*/*"
}

resource "aws_api_gateway_deployment" "prod" {
 depends_on = [aws_api_gateway_integration.lambda]
 rest_api_id = aws_api_gateway_rest_api.api.id
 stage_name = "prod"
}

6. Define Çıktıları

► ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

output "api_endpoint" {
 value = "${aws_api_gateway_deployment.prod.invoke_url}/items/"
}

7. Başvuru

terraform init
terraform plan
terraform apply

Uygulamadan sonra, bir PUT isteğine JSON gövdesi ile son noktaya gelebilirsiniz. Lambda işlevi, tüm yığını yıkmak için DynamoDB'ye veri yazar.

Sunucusuz Bölgeler için Araziform Projeler

Gerçek dünya sunucusuz uygulamaları tek bir yapılandırma dosyası için çok büyük. ölçeklenebilir bir proje yapısını benimsemiştir. İşte ortak modeller:

Encapsulate Reusable Bileşenleri için Modülleri kullanın

Terraform modülleri, mantıksal birimlere kaynak kullanmanıza izin verir. sunucusuz için modüller oluşturabilirsiniz:

Modüller kendi Git havuzunda depolanabilir veya www.FLT:0)Terraform Kayıt[[Dönetici: 1) Çevreye özgü konfigürasyonları basitleştirir: çevrede farklı değişkenlerle bir modül alıyorsunuz.

Müdürler veya İş Alanı ile Ayrı Çevreler

ortamları yönetmek için iki ortak yaklaşım var:

Çoğu sunucusuz takım için, dizin yaklaşımı daha nettir çünkü kodbase'de çevre sınırları açık hale getirir.

Uzak Devleti Locking

Hiçbir zaman takım projeleri için yerel olarak depolamak. DynamoDB kilitlenme ile bir S3 geri kazanmak. S3 kova, eyalet dosyasını tutar ve DynamoDB, yalnızca bir kerede çalıştırılır. Örnek geri yükleme yapılandırma daha önce gösterilmiştir.

Sırları güvenli bir şekilde yönetin

Serverless uygulamalar genellikle veritabanı şifreleri, API anahtarları veya JWT imza Jetonları gibi sırları gerektirir. Bunun yerine Terraform imarlarda bunları zor kodlayın:

Terraform ile Automating Altyapı için en iyi uygulamalar

Güvenilirlik ve takım hızının artırılması için, bu kanıtlanmış uygulamaları takip edin:

Version Control Everything Everything Everything Everything Everything

Modüller dahil olmak üzere tüm Terraform konfigürasyonları, anlamlı iş mesajları ile Git'te depolanmalıdır. Tag değişiklikler için şubeleri serbest bırakır ve hangileri ve ne zaman değiştirmiş olan tam bir denetim izi sağlar.

Her zaman Plan ve İnceleme

Yerel gelişimde, her zaman İZFLT:25'i çalıştırın.Ücretsizce CI/CD'de, üretim dağıtımları için manuel bir onay adımı gerektirir. Terraform Cloud ve Atlantis, plan/apply iş akışlarını entegre eden popüler araçlardır.

CI/CD for Infrastructure

Kod değişiklikleri gibi altyapı değişiklikleri uygulayın. API uç noktaları doğru yanıt verirken entegrasyon testleri çalıştırabilirsiniz.O zaman ACT:29'yi çalıştırın ve - bir araya getirin - sunucusuz için, API uç noktalarının doğru yanıt verdiğini doğrulamaya çalışırsınız.

[FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=

CI/CD ile bile, biri konsol aracılığıyla bir kaynağı manuel olarak değiştirebilir.Program normalurFLT:32) çalışır (örneğin, gece) takıma sürüklenmeyi ve uyarıyı tespit etmek için. Terraform Cloud’un sürüklenme algılaması gibi araçlar bunu otomatikleştirebilir.

Arazi yapılandırmanızı test edin

Birim destekli altyapı kodu, API'ye karşı alınan aletlerle mümkündür ve DynamoDB içeriklerine karşı HTTP testleri uygulayabilirsiniz.For serverless, you can deploy stacks in separate test hesaplar, run HTTP testleri against the API, and validate DynamoDB Content, It captured up real cloud resources, it captured their behavior, and tears them down. For serverless, you can deploy stacks in separate test hesapları, run HTTP testleri.

Kod olarak Politikayı Kullanın

HashiCorp Sentinel (Cloud) veya Open Policy Agent kullanarak organizasyon çapında uyumluluk kurallarının tanımlanması, tüm Lambda fonksiyonlarının X-Ray kanallarını etkinleştirdiğini veya kamu DynamoDB tablolarını engellemesini gerektirir. Bu politikalar zaman zaman içinde uygulanır, güvenlik ve maliyet yönetimi sistematik hale getirir.

Ortak Zorluklar ve Çözümleri

Devlet Dosyası Kilitli ve Çatışmalar

Birden fazla takım üyesi aynı anda 444D:33'ü çalıştırdığında, devlet yolsuzlukları meydana gelebilir. Çözüm: her zaman kilitlemeyi destekleyen bir geri dönüş kullanabilir (S3 + DynamoDB) ve asla paralel şubelerden uzak durmaz.

Lambda Fonksiyonlarının Büyük Sayılarını Kullanın

50+ Lambda tek bir yapılandırmada işlevsiz hale gelir. Çözüm: kullanım: İLMİŞE veya DAHAY:36, fonksiyon tanımlarının haritası ile, eyalet veri kaynaklarını paylaşan ayrı Terraform konfigürasyonları organize eder. Örneğin, merkezi bir “core” yapılandırma ihracat çıktıları, SQS kuyruk URL'leri)

Kompleks Mimarlıklarda Bağlanma Emirliği

Terraform, en bağımlılıkları otomatik olarak ele alırsa, dairesel bağımlılıklar (örneğin, birbirlerinin ARN’leri referans eden iki hizmet, sorunların çözümüne neden olabilir. Çözüm: döngüsü üçüncü bir kaynağın tanıtılmasıyla kırın (örneğin merkezi SNS konusu gibi) veya açık bir şekilde kullanmak.

Lambda Kod Değişiklikleri

Terraform altyapı için tasarlanmıştır, sürekli olarak uygulama kodunu dağıtmaz. Her seferinde yeni Lambda versiyonlarını yeniden uygulama yoluyla tekrar kullanarak tekrar yüklemesi yavaştır ve hızlı kod iterasyonları için ideal değildir. Çözüm: altyapı dağıtımını (bir kez çevre başına) kod dağıtımını ayrı tutar.CI/CD boru hatları, sadece sunucusuz Framework gibi yeni bir dağıtım kodunu güncellemek için yeni bir dağıtım kodu kullanın.

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

Terraform ile altyapı dağıtımını yapmak, aynı rigor'u yazılım ekiplerinin uygulama koduna uyguladığı sunucusuz altyapıya getiriyor.Her kaynağı sürüm kontrollü HCL dosyalarında tanımlamakla, tekrarlanabilir dağıtımlar, güvenli bir değişim yönetimi ve tam denetim yolları ile iyi yapılandırılmış bir Terraform projesini modüllerle, uzaktan eyalet ve CI/CD entegrasyonu, API uç noktalarının ve veri depolamadan zaman ayırarak, bilgisayar sürüklenme veya endişelendirmeye devam edebilirsiniz.

Sunucusuz mimariler karmaşıklıkta büyümeye devam ediyor – etkinlik odaklı iş akışları, adım işlevleri ve küresel altyapı birden çok bölgeye yayılmış – sağlam IaC'nin önemi sadece bu makaledeki desenler ve örneklerle başlayın, uygulamanız ve organizasyonunuzla ölçeklenen bir temel oluşturabilirsiniz.