[P4] Hướng Dẫn Chi Tiết: Deploy và Destroy Stack Đầu Tiên Với AWS CDK

Tue, November 12, 2024 - 4 min read View Count
AWS CDK Deployment Process

Xem những bài viết cùng series

Mục lục

  1. Giới thiệu
  2. Quy trình Deploy Stack
  3. Cấu trúc Project và Code mẫu
  4. Các bước Deploy chi tiết
  5. Cách Destroy Stack
  6. Best Practices và Tips
  7. Troubleshooting

Giới thiệu

AWS CDK (Cloud Development Kit) là công cụ Infrastructure as Code cho phép bạn định nghĩa cloud resources bằng các ngôn ngữ lập trình quen thuộc. Bài viết này sẽ hướng dẫn chi tiết cách deploy stack đầu tiên và cách xóa (destroy) stack khi không cần thiết.

Quy trình Deploy Stack

3 Phase chính trong quá trình Deploy

  1. Preparation Phase

    • Kiểm tra môi trường và dependencies
    • Xác thực AWS credentials
    • Validate stack configuration
  2. Synthesis Phase

    • Tạo CloudFormation templates từ code
    • Generate các deployment artifacts
    • Bundle Lambda functions và assets (nếu có)
  3. Deployment Phase

    • Upload assets lên S3 (nếu cần)
    • Tạo/Update CloudFormation stack
    • Monitor deployment progress

Cấu trúc Project và Code mẫu

Cấu trúc thư mục chuẩn

my-first-cdk-app/
├── app.py                           # Entry point
├── cdk.json                         # CDK config
├── requirements.txt                 # Python dependencies
└── my_first_cdk_app/
    ├── __init__.py
    └── my_first_cdk_app_stack.py    # Stack definition

Code Stack mẫu

from aws_cdk import (
    Stack,
    aws_sqs as sqs,
    aws_sns as sns,
    aws_sns_subscriptions as sns_subscriptions,
    CfnOutput,
    Duration
)
from constructs import Construct
 
class MyFirstCdkAppStack(Stack):
    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
 
        # Tạo Dead Letter Queue (DLQ)
        dlq = sqs.Queue(
            self, "MyFirstCdkAppDLQ",
            queue_name="my-first-cdk-app-dlq",
            retention_period=Duration.days(14)
        )
 
        # Tạo Main Queue với DLQ
        queue = sqs.Queue(
            self, "MyFirstCdkAppQueue",
            queue_name="my-first-cdk-app-queue",
            visibility_timeout=Duration.seconds(300),
            dead_letter_queue=sqs.DeadLetterQueue(
                max_receive_count=3,
                queue=dlq
            )
        )
 
        # Tạo SNS Topic với encryption
        topic = sns.Topic(
            self, "MyFirstCdkAppTopic",
            topic_name="my-first-cdk-app-topic",
            display_name="My First CDK App Topic",
            encryption=sns.TopicEncryption.KMS_MANAGED
        )
 
        # Kết nối Queue với Topic
        topic.add_subscription(
            sns_subscriptions.SqsSubscription(queue)
        )

Các bước Deploy chi tiết

1. Chuẩn bị môi trường

# Tạo và kích hoạt virtual environment
python -m venv .venv
source .venv/bin/activate  # Linux/MacOS
.venv\Scripts\activate     # Windows
 
# Cài đặt dependencies
pip install -r requirements.txt
 
# Config AWS credentials
aws configure

2. Deploy Stack

# Deploy cơ bản
cdk deploy
 
# Deploy với options
cdk deploy --require-approval never  # Bỏ qua confirm
cdk deploy --parameters uploadBucketName=my-bucket  # Với parameters
cdk deploy --tags environment=dev  # Với tags
cdk deploy --progress events  # Xem events realtime

Cách Destroy Stack

Có 2 cách để xóa stack

  1. Qua CloudFormation Console

    • Vào AWS Console > CloudFormation
    • Chọn stack cần xóa
    • Click nút “Delete”
  2. Sử dụng CDK CLI (Recommended)

    # Xóa stack hiện tại
    cdk destroy
     
    # Xóa nhiều stack
    cdk destroy stack1 stack2

⚠️ Lưu ý quan trọng: KHÔNG xóa stack “CDKToolkit” vì đây là bootstrapping stack cần thiết cho các deployment sau này.

Kiểm tra kết quả sau khi destroy

  1. Vào CloudFormation Console kiểm tra status “DELETE_COMPLETE”
  2. Kiểm tra physical resources đã bị xóa:
    • SQS Console không còn queue
    • SNS Console không còn topic
    • Các resource khác đã được cleanup

Ưu điểm của CDK Destroy

CDK Destroy không chỉ đơn thuần là wrapper của CloudFormation delete-stack, mà còn cung cấp nhiều tính năng nâng cao:

  1. Xử lý phức tạp tự động: Ví dụ với S3 bucket:
    • CloudFormation thông thường không thể xóa bucket có chứa objects
    • CDK cung cấp property auto_delete_objects để tự động xử lý việc này
  2. Abstraction cao hơn:
    • Không cần hiểu chi tiết về CloudFormation
    • Không cần viết Lambda function để xử lý custom resource
    • Tự động setup và configure các resource phụ thuộc

Best Practices và Tips

  1. Security

    • Review IAM permissions trước khi deploy
    • Enable encryption cho sensitive data
    • Áp dụng principle of least privilege
  2. Monitoring

    # Thêm CloudWatch Alarm
    queue.metric_approximate_number_of_messages_visible().create_alarm(
        self, "QueueDepthAlarm",
        threshold=100,
        evaluation_periods=3,
        alarm_name="Queue depth > 100 messages"
    )
  3. Resource Tagging

    Tags.of(self).add("Environment", "Development")
    Tags.of(self).add("Project", "MyFirstCdkApp")

Troubleshooting

  1. Permission Errors

    • Kiểm tra IAM roles và policies
    • Verify AWS credentials
    • Check resource policies
  2. Resource Limits

    • Kiểm tra service quotas
    • Request limit increases nếu cần
    • Dùng AWS Service Quotas console
  3. Dependency Issues

    • Check circular dependencies
    • Verify resource references
    • Review CloudFormation events

Kết luận

AWS CDK mang lại nhiều lợi thế so với việc sử dụng CloudFormation trực tiếp:

  1. Developer Experience tốt hơn

    • Sử dụng ngôn ngữ lập trình quen thuộc
    • Có auto-completion và type checking
    • Tái sử dụng code dễ dàng
  2. Productivity cao hơn

    • Code ít hơn so với YAML/JSON
    • Built-in best practices
    • Tự động quản lý dependencies
  3. Dễ bảo trì

    • Version control friendly
    • Dễ test
    • Documentation rõ ràng

Tài liệu tham khảo