Danh sách bài viết trong series Terraform Associate (003)
- Bài 0: Giới Thiệu Series Và Tổng Quan Về Chứng Chỉ Terraform Associate (003)
- Bài 1: Terraform Là Gì? Tổng Quan Và Vai Trò Trong IaC
- Bài 2: Cài Đặt Terraform Trên Các Hệ Điều Hành
- Bài 3: Terraform Workflow: Init, Plan, Apply, Destroy
- Bải 4: Terraform CLI Nâng Cao: Lệnh Taint, Import, Refresh
- Bài 5: Quản Lý Provider Trong Terraform
- Bài 6: Quản Lý Resource Trong Terraform
- Bài 7: Sử Dụng Biến (Variables) Trong Terraform
- Bài 8: Sử Dụng Output Trong Terraform
- Bài 9: Hiểu Terraform State Quản Lý Trạng Thái Hạ Tầng
- Bài 10: Sử Dụng Remote State Với Backend Như S3 Trong Terraform
- Bài 11: Terraform Workspace Quản Lý Nhiều Môi Trường
- Bài 12: Terraform Module: Mô-đun Hóa Cấu Hình
- Bài 13: Terraform Data Sources Truy Vấn Thông Tin Hạ Tầng
- Bài 14: Quản Lý Vòng Đời Tài Nguyên Với Terraform
- Bài 15: Tự Động Hóa Và Tích Hợp CI/CD Với Terraform
- Bài 16: Xử Lý Lỗi Và Debug Trong Terraform
- Bài 17: Tối Ưu Hóa Hiệu Suất Với Terraform
- Bài 18: Bảo Mật Cấu Hình Terraform
- Bài 19: Triển Khai Hạ Tầng Đa Vùng Với Terraform
- Bài 20: Triển Khai Hạ Tầng Serverless Với Terraform
- Bài 21: Triển Khai Hạ Tầng Container Với Terraform (ECS, EKS)
- Bài 22: Triển Khai Hạ Tầng Multi-Cloud Với Terraform
- Bài 23: Tổng Kết Series Và Chuẩn Bị Cho Kỳ Thi Terraform Associate (003)
Hạ Tầng Serverless Là Gì?

Hạ tầng serverless là mô hình triển khai ứng dụng mà nhà cung cấp đám mây (VD: AWS) tự động quản lý máy chủ, mở rộng tài nguyên, và tính phí dựa trên mức sử dụng. Các dịch vụ serverless phổ biến trên AWS bao gồm AWS Lambda (chạy mã mà không cần máy chủ), API Gateway (tạo API), và DynamoDB (cơ sở dữ liệu không máy chủ). Terraform giúp quản lý các tài nguyên serverless này dưới dạng mã (Infrastructure as Code), đảm bảo triển khai nhất quán và dễ dàng mở rộng. Đây là một kỹ năng thực tiễn hữu ích cho kỳ thi Terraform Associate (003), liên quan đến mục tiêu 7 (Read, Generate, and Modify Configuration).
Tại Sao Sử Dụng Terraform Cho Serverless?
- Tự động hóa triển khai: Quản lý toàn bộ stack serverless (Lambda, API Gateway) bằng mã.
- Tính nhất quán: Đảm bảo cấu hình giống nhau giữa các môi trường (dev, prod).
- Quản lý dễ dàng: Dễ dàng cập nhật hoặc xóa tài nguyên serverless.
- Tích hợp với CI/CD: Dễ dàng tích hợp vào pipeline để tự động triển khai.
- Kiểm soát chi phí: Terraform giúp theo dõi và tối ưu tài nguyên serverless.
Cách Triển Khai Hạ Tầng Serverless Với Terraform
Tạo Lambda Function
- Sử dụng
aws_lambda_function
để tạo Lambda function. - Cần chuẩn bị file mã nguồn Lambda (VD: file ZIP chứa mã Python).
Tích Hợp Với API Gateway
- Sử dụng
aws_api_gateway_rest_api
,aws_api_gateway_resource
, vàaws_api_gateway_method
để tạo API. - Tích hợp API Gateway với Lambda bằng
aws_api_gateway_integration
.
Quản Lý Quyền Với IAM
- Tạo IAM role cho Lambda để truy cập các dịch vụ khác (VD: DynamoDB, CloudWatch Logs).
- Gắn role vào Lambda function bằng
aws_iam_role_policy_attachment
.
Ví Dụ Thực Tế: Triển Khai API Serverless Trên AWS
-
Chuẩn bị mã Lambda:
- File
lambda_function.py
:import json def lambda_handler(event, context): return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
- Nén file thành
lambda_function.zip
:zip lambda_function.zip lambda_function.py
- Upload file
lambda_function.zip
lên S3 bucket (giả sử bucketmy-lambda-code
).
- File
-
File Terraform
main.tf
:terraform { backend "s3" { bucket = "my-terraform-state" key = "state/serverless.tfstate" region = "us-east-1" dynamodb_table = "terraform-locks" encrypt = true } } provider "aws" { region = "us-east-1" } # IAM Role cho Lambda resource "aws_iam_role" "lambda_exec" { name = "lambda_exec_role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "lambda.amazonaws.com" } } ] }) } resource "aws_iam_role_policy_attachment" "lambda_policy" { role = aws_iam_role.lambda_exec.name policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" } # Lambda Function resource "aws_lambda_function" "hello_lambda" { function_name = "hello_lambda" s3_bucket = "my-lambda-code" s3_key = "lambda_function.zip" handler = "lambda_function.lambda_handler" runtime = "python3.9" role = aws_iam_role.lambda_exec.arn depends_on = [aws_iam_role_policy_attachment.lambda_policy] } # API Gateway resource "aws_api_gateway_rest_api" "api" { name = "hello_api" } resource "aws_api_gateway_resource" "resource" { rest_api_id = aws_api_gateway_rest_api.api.id parent_id = aws_api_gateway_rest_api.api.root_resource_id path_part = "hello" } resource "aws_api_gateway_method" "method" { rest_api_id = aws_api_gateway_rest_api.api.id resource_id = aws_api_gateway_resource.resource.id http_method = "GET" authorization = "NONE" } resource "aws_api_gateway_integration" "integration" { rest_api_id = aws_api_gateway_rest_api.api.id resource_id = aws_api_gateway_resource.resource.id http_method = aws_api_gateway_method.method.http_method integration_http_method = "POST" type = "AWS_PROXY" uri = aws_lambda_function.hello_lambda.invoke_arn } # Quyền cho API Gateway gọi Lambda resource "aws_lambda_permission" "api_gateway" { statement_id = "AllowAPIGatewayInvoke" action = "lambda:InvokeFunction" function_name = aws_lambda_function.hello_lambda.function_name principal = "apigateway.amazonaws.com" source_arn = "${aws_api_gateway_rest_api.api.execution_arn}/*/*" } # Triển khai API Gateway resource "aws_api_gateway_deployment" "deployment" { rest_api_id = aws_api_gateway_rest_api.api.id stage_name = "prod" depends_on = [ aws_api_gateway_integration.integration, aws_api_gateway_method.method ] } output "api_url" { value = "${aws_api_gateway_deployment.deployment.invoke_url}/hello" }
-
Quy trình:
-
Khởi tạo backend:
terraform init
Output:
Initializing the backend... Successfully configured the backend "s3"! Terraform will automatically use this backend unless the backend configuration changes. Terraform has been successfully initialized!
-
Áp dụng cấu hình:
terraform apply -auto-approve
Output:
aws_iam_role.lambda_exec: Creating... aws_iam_role.lambda_exec: Creation complete after 2s [id=lambda_exec_role] aws_iam_role_policy_attachment.lambda_policy: Creating... aws_iam_role_policy_attachment.lambda_policy: Creation complete after 1s aws_lambda_function.hello_lambda: Creating... aws_lambda_function.hello_lambda: Creation complete after 5s [id=hello_lambda] aws_api_gateway_rest_api.api: Creating... aws_api_gateway_rest_api.api: Creation complete after 3s [id=abc123] aws_api_gateway_resource.resource: Creating... aws_api_gateway_resource.resource: Creation complete after 1s [id=def456] aws_api_gateway_method.method: Creating... aws_api_gateway_method.method: Creation complete after 1s aws_api_gateway_integration.integration: Creating... aws_api_gateway_integration.integration: Creation complete after 1s aws_lambda_permission.api_gateway: Creating... aws_lambda_permission.api_gateway: Creation complete after 1s aws_api_gateway_deployment.deployment: Creating... aws_api_gateway_deployment.deployment: Creation complete after 2s Apply complete! Resources: 7 added, 0 changed, 0 destroyed. Outputs: api_url = "https://abc123.execute-api.us-east-1.amazonaws.com/prod/hello"
- Kiểm tra API:
- Truy cập URL từ output (
https://abc123.execute-api.us-east-1.amazonaws.com/prod/hello
). - Kết quả:
"Hello from Lambda!"
- Truy cập URL từ output (
-
Lưu Ý Quan Trọng Khi Triển Khai Serverless Với Terraform
- Kiểm tra mã Lambda: Đảm bảo file ZIP chứa mã Lambda hợp lệ trước khi triển khai.
- Quyền IAM: Đảm bảo Lambda role có quyền truy cập cần thiết (VD: CloudWatch Logs).
- Chi phí serverless: Theo dõi chi phí API Gateway và Lambda, đặc biệt với lưu lượng lớn.
- Tích hợp CI/CD: Dùng pipeline để tự động cập nhật mã Lambda và triển khai.
- Debug Lambda: Sử dụng CloudWatch Logs để kiểm tra lỗi nếu API không hoạt động.
Liên Hệ Với Chứng Chỉ Terraform Associate (003)
Kỳ thi Terraform Associate (003) không kiểm tra trực tiếp triển khai serverless, nhưng hiểu cách quản lý tài nguyên serverless sẽ giúp bạn áp dụng kiến thức thực tiễn vào mục tiêu 7 và 8. Bạn cần nắm:
- Khái niệm liên quan:
- Quản lý tài nguyên không máy chủ (Lambda, API Gateway).
- Tích hợp tài nguyên với IAM role.
- Thực hành: Biết cách triển khai serverless sẽ giúp bạn xử lý tốt hơn trong các tình huống thực tế.
Kết Luận
Triển khai hạ tầng serverless với Terraform giúp xây dựng ứng dụng không máy chủ hiệu quả, tiết kiệm chi phí và dễ mở rộng. Sử dụng Terraform để quản lý Lambda, API Gateway, và IAM role sẽ giúp bạn tự động hóa toàn bộ stack serverless. Dù không phải trọng tâm của kỳ thi Terraform Associate (003), kỹ năng này rất hữu ích trong thực tế. Ở bài tiếp theo, chúng ta sẽ tìm hiểu cách sử dụng Terraform để triển khai hạ tầng container (VD: ECS, EKS).