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, được xác định là một biến var. 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.
Đầu tiên chúng ta tạo file main.tf
# Configure the AWS provider
provider "aws" {
region = "eu-west-1"
}
# Data source: query the list of availability zones
data "aws_availability_zones" "all" {}
# Create a Security Group for an EC2 instance
resource "aws_security_group" "instance" {
name = "terraform-example-instance"
ingress {
from_port = "${var.server_port}"
to_port = "${var.server_port}"
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
lifecycle {
create_before_destroy = true
}
}
# Create a Security Group for an ELB
resource "aws_security_group" "elb" {
name = "terraform-example-elb"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
# Create a Launch Configuration
resource "aws_launch_configuration" "example" {
image_id = "ami-785db401"
instance_type = "t2.micro"
security_groups = ["${aws_security_group.instance.id}"]
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p "${var.server_port}" &
EOF
lifecycle {
create_before_destroy = true
}
}
# Create an Autoscaling Group
resource "aws_autoscaling_group" "example" {
launch_configuration = "${aws_launch_configuration.example.id}"
availability_zones = ["${data.aws_availability_zones.all.names}"]
load_balancers = ["${aws_elb.example.name}"]
health_check_type = "ELB"
min_size = 2
max_size = 10
tag {
key = "Name"
value = "terraform-asg-example"
propagate_at_launch = true
}
}
# Create an ELB
resource "aws_elb" "example" {
name = "terraform-asg-example"
availability_zones = ["${data.aws_availability_zones.all.names}"]
security_groups = ["${aws_security_group.elb.id}"]
listener {
lb_port = 80
lb_protocol = "http"
instance_port = "${var.server_port}"
instance_protocol = "http"
}
health_check {
healthy_threshold = 2
unhealthy_threshold = 2
timeout = 3
interval = 30
target = "HTTP:${var.server_port}/"
}
}
File outputs.tf
# Output variable: DNS Name of ELB
output "elb_dns_name" {
value = "${aws_elb.example.dns_name}"
}
File vars.tf
# Input variable: server port
variable "server_port" {
description = "The port the server will use for HTTP requests"
default = "8080"
}
Đoạn code trên là một file Terraform script, được sử dụng để cấu hình và triển khai các tài nguyên trên Amazon Web Services (AWS).
Các tài nguyên được cấu hình và triển khai bao gồm:
- Cấu hình môi trường AWS thông qua nhà cung cấp AWS (AWS provider).
- Truy vấn danh sách các khu vực khả dụng thông qua một nguồn dữ liệu (data source).
- Tạo một nhóm bảo mật (Security Group) cho một EC2 instance.
- Tạo một nhóm bảo mật (Security Group) cho một Elastic Load Balancer (ELB).
- Tạo một Launch Configuration.
- Tạo một nhóm tự động mở rộng (Autoscaling Group).
- Tạo một ELB.
Các tài nguyên này được định nghĩa bởi các khối (block) của Terraform, với mỗi khối tương ứng với một tài nguyên được triển khai trên AWS.
Để triển khai các tài nguyên này, ta có thể sử dụng lệnh terraform apply
trong thư mục chứa file script. Terraform sẽ đọc các khối này và triển khai tài nguyên tương ứng trên AWS.
Chi phí
Nếu bạn chỉ triển khai tạm thời, rồi ngay lập tức xoá ngay sau đó, thì chi phí sẽ thấp hơn so với khi triển khai trong thời gian dài. Tuy nhiên, vẫn có một số chi phí không thể tránh khỏi, ví dụ như:
- Chi phí sử dụng EC2 instances và load balancer trong thời gian hoạt động
- Chi phí sử dụng tài nguyên như EBS và lưu lượng mạng
- Chi phí cho các dịch vụ AWS khác (ví dụ như S3 nếu bạn lưu trữ các file cấu hình Terraform)
Do đó, để tính toán chi phí chính xác, bạn cần xem xét tất cả các yếu tố trên. Tuy nhiên, nếu bạn chỉ triển khai tạm thời và xoá ngay sau đó, chi phí sẽ không quá đáng kể.