Tổng quan.
Đây là ví dụ về Terraform file trên AWS (Amazon Web Services) triển khai một máy chủ web đơn trên AWS (Amazon Web Services). Máy chủ web trả về chuỗi “Hello, World” và lắng nghe trên cổng 8080. Ví dụ này sử dụng Terraform AWS Provider để tương tác với nhiều tài nguyên được hỗ trợ bởi AWS thông qua các API của nó và ví dụ này triển khai trên Terraform phiên bản 0.10.x.
Cấu hình các khóa truy cập AWS của bạn.
Vì lý do bảo mật, nên sử dụng người dùng IAM thay vì tài khoản gốc để truy cập vào AWS.
Cấu hình thông tin xác thực AWS để sử dụng bởi Terraform có thể được thực hiện theo nhiều cách khác nhau, nhưng đây là những cách tiếp cận được khuyến khích:
Cách 1: Cài đặt thông tin xác thực AWS trên hệ thống local của bạn, đối với Linux, macOS hoặc Unix:
~/.aws/credentials
Hoặc đối với Windows nằm tại.
C:\Users\USERNAME\.aws\credentials
File này nên chứa các dòng theo định dạng dưới, lưu ý hãy thay thế các giá trị thông tin xác thực AWS của bạn vào các giá trị <your_access_key_id> và <your_secret_access_key> trong file.
[default]
aws_access_key_id = <your_access_key_id>
aws_secret_access_key = <your_secret_access_key>
Cách 2: Đặt các biến môi trường AWS_ACCESS_KEY_ID và AWS_SECRET_ACCESS_KEY.
Để đặt các biến này trên Linux, macOS hoặc Unix, sử dụng lệnh export:
export AWS_ACCESS_KEY_ID=<your_access_key_id>
export AWS_SECRET_ACCESS_KEY=<your_secret_access_key>
Đối với windows hãy sử dụng set:
set AWS_ACCESS_KEY_ID=<your_access_key_id>
set AWS_SECRET_ACCESS_KEY=<your_secret_access_key>
Tạo file Terraform.
Đoạn code dưới là một ví dụ về cách sử dụng Terraform để triển khai một instance trên AWS và tạo một Security Group cho instance đó. Cụ thể, đoạn code có các phần sau:
- Configure the AWS provider: Phần này khai báo thông tin cần thiết để Terraform có thể kết nối và làm việc với AWS. Trong đoạn code này, cấu hình provider cho region là “eu-west-1”.
- Create a Security Group for an EC2 instance: Phần này tạo một Security Group với tên là “terraform-example-instance” và cho phép truy cập vào instance thông qua port 8080.
- Create an EC2 instance: Phần này tạo một instance với AMI là “ami-785db401”, instance type là “t2.micro”, và sử dụng Security Group được tạo ở phần trước. Ngoài ra, phần này cũng cung cấp một script bash trong biến user_data để cài đặt web server và chạy trên port 8080.
- Output variable: Public IP address: Phần này khai báo một output variable để hiển thị địa chỉ IP public của instance.
Sau khi đoạn code được cấu hình, có thể sử dụng các lệnh Terraform như terraform init
, terraform plan
, và terraform apply
để triển khai instance và Security Group trên AWS.
# Configure the AWS provider
provider "aws" {
region = "eu-west-1"
}
# Create a Security Group for an EC2 instance
resource "aws_security_group" "instance" {
name = "terraform-example-instance"
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
# Create an EC2 instance
resource "aws_instance" "example" {
ami = "ami-785db401"
instance_type = "t2.micro"
vpc_security_group_ids = ["${aws_security_group.instance.id}"]
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p 8080 &
EOF
tags {
Name = "terraform-example"
}
}
# Output variable: Public IP address
output "public_ip" {
value = "${aws_instance.example.public_ip}"
}
Sau khi đoạn code được cấu hình, có thể sử dụng các lệnh Terraform như terraform init
, terraform plan
, và terraform apply
để triển khai instance và Security Group trên AWS.
Chi phí
Nếu triển khai đoạn code trên và sau đó xoá nó, sẽ có một số chi phí phát sinh. Cụ thể, khi triển khai các tài nguyên AWS, bạn sẽ bị tính phí cho việc sử dụng các tài nguyên này cho đến khi bạn xoá chúng. Ví dụ:
- EC2 instance: chi phí tính theo giờ cho việc sử dụng instance. Do đó, nếu bạn chạy instance này trong một giờ, bạn sẽ bị tính phí cho một giờ sử dụng.
- Elastic IP: chi phí tính theo giờ cho việc sử dụng Elastic IP, và bạn sẽ bị tính phí cho mỗi giờ mà IP được liên kết với tài nguyên AWS nào đó.
- Security group: không tính phí nếu bạn chỉ tạo security group, nhưng nếu bạn liên kết nó với các tài nguyên khác (ví dụ: EC2 instance), bạn sẽ bị tính phí cho việc sử dụng security group này.
Chúng ta hãy nhắc lại cách tính phí của Elastic IP:
Vì Elastic IP (EIP) là một IP tĩnh dành riêng cho các tài nguyên của khách hàng trên AWS. AWS sẽ tính phí cho khách hàng khi sử dụng Elastic IP.
Elastic IP được cung cấp miễn phí trong trường hợp nó được gắn vào một EC2 instance đang chạy. Nguyên nhân là để khuyến khích người dùng sử dụng Elastic IP theo cách đúng đắn và giúp tối ưu chi phí cho người dùng.
Tuy nhiên, nếu Elastic IP được gắn vào một instance nhưng không được sử dụng, AWS sẽ tính phí cho việc sở hữu Elastic IP đó. Do đó, để tối ưu chi phí, nếu không sử dụng Elastic IP, bạn nên giải phóng nó bằng cách gắn IP của EC2 instance vào thay vì Elastic IP.
Cụ thể, AWS tính phí cho Elastic IP theo công thức:
Phí Elastic IP = số giờ sử dụng trong tháng x giá Elastic IP đóng băng
Trong đó, giá Elastic IP đóng băng sẽ phụ thuộc vào khu vực sử dụng, có thể xem thông tin giá tại đây: https://aws.amazon.com/ec2/pricing/on-demand/
Như vậy khi bạn triển khai các tài nguyên AWS thông qua Terraform, bạn sẽ phải trả tiền cho việc sử dụng các tài nguyên này. Tuy nhiên, chi phí sẽ phụ thuộc vào thời gian sử dụng và loại tài nguyên mà bạn triển khai. Nếu bạn xoá các tài nguyên này sau khi sử dụng, bạn sẽ không bị tính phí cho việc sử dụng chúng nữa.