Hướng Dẫn Thiết Lập Hạ Tầng VPC và IAM trên AWS
Tổng Quan
Hướng dẫn này cung cấp các chỉ dẫn từng bước để tạo ra một hạ tầng Đám Mây Riêng Ảo (VPC) an toàn trên AWS bằng cách sử dụng AWS CLI. VPC cho phép bạn cung cấp một phần tách biệt hợp lý của Đám Mây AWS, nơi bạn có thể khởi chạy các tài nguyên AWS trong một mạng ảo mà bạn xác định.
Điều Kiện Tiên Quyết
- AWS CLI đã được cài đặt và cấu hình với thông tin xác thực phù hợp.
- Hiểu biết cơ bản về các khái niệm mạng (CIDR, subnet).
- Quyền IAM phù hợp cho các thao tác VPC và EC2.
Chiến Lược Gán Nhãn Tài Nguyên
Trong toàn bộ hướng dẫn này, chúng ta sẽ triển khai một chiến lược gán nhãn đồng nhất cho tất cả các tài nguyên. Cách tiếp cận này đảm bảo:
- Dễ dàng nhận diện và theo dõi tài nguyên.
- Đơn giản hóa việc phân bổ chi phí.
- Tổ chức và quản lý tài nguyên tốt hơn.
Các nhãn tiêu chuẩn được sử dụng:
Name
: Định danh mô tả cho tài nguyên.Environment
: Giai đoạn phát triển (ví dụ: Dev, Staging, Production).Purpose
: Định danh dự án hoặc ứng dụng.
1. Thiết Lập VPC
Tạo VPC
Tạo một VPC với khối CIDR /16, cung cấp khoảng 65,536 địa chỉ IP:
aws ec2 create-vpc \
--cidr-block 10.0.0.0/16 \
--tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=DoclingVPC},{Key=Environment,Value=Dev}]'
Ghi chú: Khối CIDR 10.0.0.0/16
có nghĩa là tất cả các tài nguyên trong VPC này sẽ có địa chỉ IP bắt đầu bằng 10.0.x.x
, trong đó hai ô số đầu tiên giữ nguyên.
Lưu ID VPC để Tham Khảo Tương Lai
VPC_ID=$(aws ec2 describe-vpcs \
--filters Name=tag-key,Values=Name \
--query "Vpcs[?Tags[?Key=='Name' && Value=='DoclingVPC']].VpcId" \
--output text)
Áp Dụng Nhãn Bổ Sung
Tạo một tệp tags.json
:
{
"Tags": [
{
"Key": "Purpose",
"Value": "DoclingSetup"
}
]
}
Áp dụng các nhãn cho VPC:
aws ec2 create-tags --resources $VPC_ID --cli-input-json file://tags.json
Xác Minh Việc Tạo VPC
aws ec2 describe-vpcs \
--filters Name=tag-key,Values=Purpose \
--query "Vpcs[].[VpcId,CidrBlock,State]" \
--output table
2. Cấu Hình Subnet
Các subnet phân đoạn VPC của bạn thành các mạng nhỏ hơn. Chúng ta sẽ tạo cả subnet công cộng và riêng tư theo các thực hành tốt nhất của AWS.
Tạo Subnet Riêng Tư
Triển khai một subnet riêng tư trong vùng khả dụng us-east-1b
:
aws ec2 create-subnet \
--vpc-id $VPC_ID \
--cidr-block 10.0.4.0/24 \
--availability-zone us-east-1b \
--tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=PrivateSubnet-1b}]'
Tạo Subnet Công Cộng
Triển khai một subnet công cộng trong vùng khả dụng us-east-1a
:
aws ec2 create-subnet \
--vpc-id $VPC_ID \
--cidr-block 10.0.3.0/24 \
--availability-zone us-east-1a \
--tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=PublicSubnet-1a}]'
Ghi chú: Mỗi subnet /24 cung cấp 256 địa chỉ IP (mặc dù AWS giữ 5 IP cho sử dụng nội bộ).
Lấy ID của Subnet
# Lấy ID của Subnet Riêng Tư
PRIVATE_SUBNET=$(aws ec2 describe-subnets \
--filters Name=tag-value,Values=PrivateSubnet-1b \
--query "Subnets[0].SubnetId" \
--output text)
# Lấy ID của Subnet Công Cộng
PUBLIC_SUBNET=$(aws ec2 describe-subnets \
--filters Name=tag-value,Values=PublicSubnet-1a \
--query "Subnets[0].SubnetId" \
--output text)
Áp Dụng Nhãn cho Các Subnet
aws ec2 create-tags --resources $PUBLIC_SUBNET --cli-input-json file://tags.json
aws ec2 create-tags --resources $PRIVATE_SUBNET --cli-input-json file://tags.json
Xác Minh Cấu Hình Subnet
aws ec2 describe-subnets \
--filters Name=tag-key,Values=Purpose \
--query "Subnets[].[SubnetId,CidrBlock,AvailabilityZone]" \
--output table
3. Cấu Hình Internet Gateway
Internet Gateway (IGW) cho phép giao tiếp giữa VPC của bạn và internet.
Tạo Internet Gateway
IGW_ID=$(aws ec2 create-internet-gateway \
--tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=DoclingIGW}]' \
--query "InternetGateway.InternetGatewayId" \
--output text)
Áp Dụng Nhãn
aws ec2 create-tags --resources $IGW_ID --cli-input-json file://tags.json
Gắn Internet Gateway vào VPC
aws ec2 attach-internet-gateway \
--internet-gateway-id $IGW_ID \
--vpc-id $VPC_ID
Xác Minh Internet Gateway
aws ec2 describe-internet-gateways \
--filters Name=tag-key,Values=Purpose \
--query "InternetGateways[].[InternetGatewayId,Attachments[0].VpcId,Attachments[0].State]" \
--output table
4. Cấu Hình Bảng Định Tuyến
Bảng định tuyến xác định nơi mà lưu lượng mạng được chỉ định. AWS tự động tạo bảng định tuyến chính với mỗi VPC, nhưng thực hành tốt nhất là tạo các bảng định tuyến tùy chỉnh để kiểm soát an ninh tốt hơn.
Tạo Bảng Định Tuyến Công Cộng
PUBLIC_ROUTE_TABLE_ID=$(aws ec2 create-route-table \
--vpc-id $VPC_ID \
--query "RouteTable.RouteTableId" \
--output text)
Thêm Định Tuyến Internet
Cấu hình bảng định tuyến để chỉ định lưu lượng internet thông qua Internet Gateway:
aws ec2 create-route \
--route-table-id $PUBLIC_ROUTE_TABLE_ID \
--destination-cidr-block 0.0.0.0/0 \
--gateway-id $IGW_ID
Liên Kết Subnet Công Cộng với Bảng Định Tuyến
PUBLIC_SUBNET_ASSOCIATION_ID=$(aws ec2 associate-route-table \
--route-table-id $PUBLIC_ROUTE_TABLE_ID \
--subnet-id $PUBLIC_SUBNET \
--query "AssociationId" \
--output text)
Xác Minh Cấu Hình Bảng Định Tuyến
aws ec2 describe-route-tables \
--route-table-ids $PUBLIC_ROUTE_TABLE_ID \
--query "RouteTables[].[RouteTableId,Routes[].DestinationCidrBlock,Associations[].SubnetId]" \
--output table
Các Thực Hành Bảo Mật Tốt Nhất
-
Bảng Định Tuyến Chính: Không bao giờ thêm các định tuyến internet vào bảng định tuyến chính. Điều này đảm bảo các subnet mới không vô tình trở thành công cộng.
-
Cách Ly Subnet: Giữ các subnet riêng tư thực sự riêng tư bằng cách không liên kết chúng với các bảng định tuyến chứa các định tuyến internet gateway.
-
Triển Khai Nhiều AZ: Đối với các môi trường sản xuất, triển khai các subnet trên nhiều vùng khả dụng để đảm bảo tính khả dụng cao.
-
Network ACLs: Cân nhắc triển khai danh sách điều khiển truy cập mạng để tăng cường bảo mật cấp độ subnet.
AWS IAM và Các Vai Trò Instance
AWS IAM hoạt động trên ba thành phần cơ bản:
- Mối Quan Hệ Tin Cậy - Xác định các thực thể nào có thể giả lập một vai trò.
- Quyền Hạn - Xác định các hành động mà vai trò có thể thực hiện.
- Thông Tin Xác Thực Tạm Thời - Cung cấp các token truy cập có thời hạn để giả lập vai trò.
Quy Trình Triển Khai IAM
- Tạo Chính Sách Tin Cậy - Xác định các dịch vụ AWS nào có thể giả lập vai trò.
- Tạo Vai Trò - Thiết lập vai trò với chính sách tin cậy.
- Gắn Quyền Hạn - Cung cấp quyền hạn cụ thể cho vai trò.
- Tạo Instance Profile - Đóng gói vai trò cho các instance EC2 (khi cần).
- Liên Kết Tài Nguyên - Liên kết vai trò hoặc instance profile với các tài nguyên AWS.
Cấu Hình IAM cho EC2
Chính Sách Tin Cậy cho EC2
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "ec2.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
}
Tạo Vai Trò Instance EC2
# Tạo vai trò
aws iam create-role \
--role-name ec2_instance_role \
--assume-role-policy-document file://ec2-trust-policy.json \
--tags Key=Name,Value=EC2InstanceRole
# Thêm nhãn bổ sung
aws iam tag-role \
--role-name ec2_instance_role \
--cli-input-json file://tags.json
# Gắn chính sách quản lý
aws iam attach-role-policy \
--role-name ec2_instance_role \
--policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role
Tạo Instance Profile
# Tạo instance profile
aws iam create-instance-profile \
--instance-profile-name ec2_instance_role-profile \
--tags Key=Name,Value=EC2InstanceRoleProfile
# Thêm nhãn cho instance profile
aws iam tag-instance-profile \
--instance-profile-name ec2_instance_role-profile \
--cli-input-json file://tags.json
# Liên kết vai trò với instance profile
aws iam add-role-to-instance-profile \
--role-name ec2_instance_role \
--instance-profile-name ec2_instance_role-profile
Cấu Hình IAM cho ECS
Chính Sách Tin Cậy cho Các Nhiệm Vụ ECS
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "ecs-tasks.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
}
Vai Trò Thực Thi Nhiệm Vụ ECS
Vai trò thực thi nhiệm vụ là cần thiết để ECS kéo hình ảnh container và ghi nhật ký thay mặt bạn.
# Tạo vai trò thực thi nhiệm vụ ECS
ECS_TASK_EXEC_ROLE=$(aws iam create-role \
--role-name ecs_task_exec_role \
--assume-role-policy-document file://ecs-trust-policy.json \
--tags Key=Name,Value=ECSTaskExecutionRole \
--query "Role.RoleName" \
--output text)
# Thêm nhãn
aws iam tag-role \
--role-name $ECS_TASK_EXEC_ROLE \
--cli-input-json file://tags.json
# Gắn chính sách quản lý cho việc thực thi nhiệm vụ
aws iam attach-role-policy \
--role-name $ECS_TASK_EXEC_ROLE \
--policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
Vai Trò Nhiệm Vụ ECS (Tùy Chọn)
Vai trò nhiệm vụ cung cấp quyền cho mã ứng dụng của bạn chạy bên trong container.
Ghi chú: Vai trò này có thể được bỏ qua nếu ứng dụng của bạn không cần truy cập API AWS. Hãy thử mà không có nó trước để xác định xem nó có cần thiết hay không.
# Tạo vai trò nhiệm vụ ECS (nếu cần)
ECS_ROLE=$(aws iam create-role \
--role-name ecs_task_role \
--assume-role-policy-document file://ecs-trust-policy.json \
--tags Key=Name,Value=ECSTaskRole \
--query "Role.RoleName" \
--output text)
# Thêm nhãn
aws iam tag-role \
--role-name $ECS_ROLE \
--cli-input-json file://tags.json
# Gắn các chính sách cụ thể cho ứng dụng khi cần
# aws iam attach-role-policy --role-name $ECS_ROLE --policy-arn <policy-arn>
Kết Luận
Bạn đã có nền tảng IAM và mạng cần thiết cho việc triển khai AWS ECS của chúng ta.
Các Bước Tiếp Theo: Trong phần tiếp theo của chuỗi bài viết này, chúng ta sẽ cấu hình hạ tầng EC2 sẽ sử dụng các vai trò này để chạy các ứng dụng container hóa của bạn.