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.
- [FONT:0) Inconsistency:[Dönetici:[Dönetici: 0,4] Farklı ortamlar (dev, boğma, prod) kaçınılmaz olarak, yaratılan eller dışında sürüklenir.
- [0]Hiçbir sürüm tarihi:[Dönetici: [DnamoDB’yi kim değiştirdi? Neden kod olmadan denetimlenebilirliği kaybedersiniz.
- [FONT:0)Recreation kabusu:[Dönetici: 1 ) Bir felaketten sonra her şeyi sıfırdan yeniden yapılandırmanız gerekir, her ayarı hatırlıyor musunuz.
- [FONT:0) Zaman kaybı:[Dönetici: [Dönetici:0) Uygulama mantığına girebilmeleri için konsol aracılığıyla tıklayın.
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
- Terraform yüklü ([[Düz:0) indir[Dönem: 1 )
- AWS hesabı, yapılandırılmış ( çevre değişkenleri veya ) ile yapılandırılır.
- Node.js kuruldu ( Lambda kodu derlemek için)
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:
- Bir baz Lambda işlevi modülü (IAM rolü ile, temel BulutWatch izinleri ve Seçmeli VPC yapılandırı)
- Bir API Gateway + Lambda entegrasyonu modülü
- Standart nitelikler ve otoskaling ile bir DynamoDB masa modülü
- Ölü kuyruklarla SQS kuyruk modülü
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:
- [FONT:0] Çevre başına yöneticilik:[Dönetici: [Dönetici: 0:15) Bu, s.net.com.tr|k.netmenlik ve s.
- [FONT:0]Terraform Workspaces:) Aynı konfigürasyonun örneklerini oluşturmak için yerleşik çalışma alanı özelliğini kullanın. Workspaces daha hafiftir ancak birden çok takımla uğraşırken kafa karıştırıcı hale gelebilir.
Ç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:
- AWS Sırları Yöneticisi veya SSM Parametre Mağaza, referans veya [[FONTD:2) veya [[FONT=FONT) veri kaynakları kaynakları
- Vault sağlayıcısı dinamik sırları getirmek için
- Çevreye özgü şifreli değişken dosyaları (örneğin, [[DüzDÜŞÜN) gibi araçlar ile
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.