Xử lý sự cố

Các lỗi thường gặp và cách xử lý khi deploy MILU2 Stage Infrastructure

Lỗi thường gặp

No valid credential sources found

Nguyên nhân: AWS SSO hết hạn
Cách xử lý: Chạy aws sso login rồi thử lại. Hoặc dùng deploy.ps1 (tự refresh credentials)
aws sso login

RepositoryAlreadyExistsException (ECR)

Nguyên nhân: ECR repo đã tồn tại trên AWS nhưng không có trong state
Cách xử lý: Import repo vào state
terraform import 'module.ecr.aws_ecr_repository.this["milu2/milu2-stage-api"]' milu2/milu2-stage-api

DuplicateLoadBalancerName

Nguyên nhân: ALB/NLB đã tồn tại trên AWS
Cách xử lý: Dùng deploy.ps1 (auto import) hoặc import thủ công
terraform import 'module.alb.aws_lb.internal' <ALB_ARN>

ACM apply treo lâu tại aws_acm_certificate_validation

Nguyên nhân: Chưa tạo CNAME record để validate certificate
Cách xử lý: Lấy CNAME từ ACM rồi tạo trên DNS provider
aws acm describe-certificate --certificate-arn <arn>
# Get the CNAME Name and Value from DomainValidationOptions
# Create the CNAME record on your DNS provider

VpcPeeringConnectionAlreadyExists

Nguyên nhân: VPC Peering đã tồn tại
Cách xử lý: Xoá peering cũ trên Console hoặc import vào state

expected length of user_data to be in the range (0 - 16384)

Nguyên nhân: Script user_data quá lớn (>16KB)
Cách xử lý: Module đã dùng user_data_base64 + base64gzip(). Pull code mới nhất

EC2 mount /mnt/s3 ghi không được

Nguyên nhân: mount-s3 thiếu flags --allow-overwrite --allow-delete
Cách xử lý: SSH vào EC2 và sửa mount-s3.service
sudo sed -i 's|--gid 1000.*|--gid 1000 --dir-mode 0777 --file-mode 0666 --allow-overwrite --allow-delete|' /etc/systemd/system/mount-s3.service
sudo systemctl daemon-reload
sudo umount -l /mnt/s3
sudo systemctl restart mount-s3.service

MySQL không import schema

Nguyên nhân: File schema_only.sql chưa upload lên S3
Cách xử lý: Upload file rồi redeploy hoặc chạy import thủ công
# Upload schema
aws s3 cp schema_only.sql s3://<bucket>/docker/milu2-mysql/

# Or import manually on EC2
docker exec -i milu2mysqld mysql -uroot -p$PWD < /home/ec2-user/milu2/milu2-mysql/docker/schema_only.sql

Web service hiển thị Docker daemon IP thay vì client IP

Nguyên nhân: nginx set_real_ip_from 0.0.0.0; (thiếu /0)
Cách xử lý: Đổi thành set_real_ip_from 0.0.0.0/0; hoặc liệt kê CIDR cụ thể

CIDR conflict khi deploy nhiều stage

Nguyên nhân: stage_index trùng với stage khác
Cách xử lý: Chạy preflight-check.ps1 để scan và đề xuất stage_index trống
.\preflight-check.ps1
# Check 7b will scan build VPC route table and suggest non-conflicting stage_index

Debug Tips

Các bước debug khi gặp vấn đề:

Debug Commands
# 1. Check Terraform state
terraform state list
terraform state show '<resource_address>'

# 2. Enable debug logging
$env:TF_LOG = "DEBUG"
terraform plan 2>&1 | Out-File debug.log

# 3. Check AWS credentials
aws sts get-caller-identity

# 4. Check EC2 logs
ssh ec2-user@<ip>
sudo tail -f /var/log/cloud-init-output.log
sudo tail -f /var/log/milu2-docker-bootstrap.log

# 5. Check docker containers
docker ps -a
docker logs <container_name>

# 6. Check systemd services
sudo systemctl status mount-s3.service
sudo journalctl -u mount-s3.service

Mẹo

Khi gặp lỗi không rõ nguyên nhân, chạy terraform plan với TF_LOG=DEBUG để xem chi tiết API calls.