Build infrastructure AWS Failover and High Availability
Document: https://learn.hashicorp.com/tutorials/terraform/install-cli
$ brew tap hashicorp/tap
$ brew install hashicorp/tap/terraform
$ terraform -install-autocomplete
Document: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-mac.html
1/ Tải package về máy 2/ Click double vào package và cài đặt. Nên cài vào disk local 3/ Kiểm tra sau khi cài đặt
$ which aws
/usr/local/bin/aws
$ aws --version
aws-cli/2.1.1 Python/3.7.4 Darwin/19.6.0 exe/x86_64
Documents: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html
$ aws configure --profile [name]
AWS Access Key ID [None]:
AWS Access Key ID [None]:
Default region name [None]:
Default output format [None]:
Kiểm tra credentials vừa setting cat ~/.aws/credentials
Cách sử dụng:
$ aws ec2 [action] --profile [name_profile]
Ví dụ muốn list tất cả EC2:
aws ec2 describe-instances --profile learning
Ngoài ra, ta củng có thể set ENV trong 1 session để không cần gõ --profile
$ export AWS_PROFILE=[name_profile]
Và thử lại ví dụ trên aws ec2 describe-instances vẫn cho ra kết quả tương tự.
Clone project về máy và làm theo các step bên dưới.
Workspace dùng để chia môi trường dev, staging, product. Ở đây ta tạo workspace chỉ để log lại trạng thái của các môi trường. Còn config các môi trường ở trong các file dev.tfvars, prod.tfvars
# Tạo workspace
$ terraform workspace new [name]
# Hiển thị các workspace đang có
$ terraform workspace list
# Chọn workspace
$ terraform workspace select [name]
# Kiểm tra workspace hiện tại là cái nào
$ terraform workspace show
Sau khi tạo workspace và select 1 workspace xong thì ta tiến hành build terraform
Để SSH lên EC2 thì phải cần keypair. Vậy thay vì ta phải lên dashboard AWS để tạo thì ta có thể tạo ở local và push lên AWS thông qua Terraform.
Có thể tạo ra các keypair cho từng môi trường khác nhau.
$ ssh-keygen -f terraform_ec2_key
Sau khi run command trên thì tạo ra 2 file terraform_ec2_key và terraform_ec2_key.pub.
Copy nội dung ssh-rsa trong file .pub và gán vào biến keypair trong file *.tfvars.
File còn lại tuyệt đối phải bảo mật và giữ lại ở local dùng để ssh lên EC2
Ta chỉ cần setting như sau vào file dev.tfvars, prod.tfvars
keypair = {
name = "MKP-exm-dev"
value = "ssh-rsa AAAAB3...bQ5H3M= apple@MinhTangs-MBP"
}
Ta cần phải khai báo config trong các file dev.tfvars hay prod.tfvars trước khi thực hiện.
Lưu ý: Trước khi build infra bằng terraform
- Gán tên profile. Run command
cat ~/.aws/credentialsđể xem tên profile
profile = "learning"
- Gán ID của AMI
asg_ami_id = "ami-0f1a5142758f85483"
Để có được ID của AMI ta cần phải tạo sẵn 1 EC2 và sau đó create new image
Vì sao phải tạo AMI trước: Bởi vì trong thực tế ta cần phải tạo mẫu một EC2, trong EC2 này sẽ setup các package cần thiết mà project cần. Sau đó tạo AMI từ EC2. Ta cần lấy ID AMI để gán vào
asg_ami_idđể Auto Scaling Group sẽ scale ra EC2 theo đúng như ta đã setting lúc ban đầu.
$ terraform init
$ terraform workspace select [dev]
Nếu ta muốn build infra aws cho môi trường nào thì chỉ định thông qua -var-file=[env].tfvars
$ terraform apply -var-file=dev.tfvars -auto-approve [-lock=false]
Sau khi apply thì terraform sẽ tự động build môi trường trên AWS.
Lưu ý: Trong terraform không có cơ chế Rollback. Nếu lỗi bước nào thì sẽ dừng tại bước đó, và các bước đã chạy thì vẫn tồn tại các resources trên AWS.
Destroy
Nếu muốn xóa 1 module hay resource đã build trước đó thì cần chỉ định thông qua -target=
$ terraform destroy -target=[resource-or-module] -var-file=dev.tfvars -auto-approve [-lock=false]
Xóa tất cả những thứ đã build trên AWS từ Terraform (Không nên dùng lệnh này trong thực tế)
$ terraform destroy -var-file=dev.tfvars -auto-approve [-lock=false]
Access to console terraform
$ terraform console
Hiển thị chi tiết config terraform theo workspace hiện tại
$ terraform show
hoặc
$ terraform plan -var-file=dev.tfvars -lock=false
Đối với show thì terraform sẽ dựa vào config hiện tại để show ra mà không cần gọi API AWS. Ngược lại với plan thì sẽ gọi API AWS để kiểm tra và cho ra kết quả chính xác hơn (nếu có lỗi thì sẽ báo lỗi, còn show thì không)
