Bài 20: Triển Khai Hạ Tầng Serverless Với Terraform


Danh sách bài viết trong series Terraform Associate (003)

Hạ Tầng Serverless Là Gì?

64ea303e-2bcc-42bf-b85c-6a017534e6fd

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ử bucket my-lambda-code).
  • 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:

    1. 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!
    2. Á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"
    3. 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!"

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).

Điều hướng chuỗi bài viết<< Bài 19: Triển Khai Hạ Tầng Đa Vùng Với Terraform
>> Bài 21: Triển Khai Hạ Tầng Container Với Terraform (ECS, EKS)
Article Thumbnail
Article Thumbnail
Datadog Webinar: Modernize AWS Logs at Scale
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận