EP5: Resource Terraform Đầu tiên trên AWS - Tạo một S3 Bucket Đơn giản
10 min read

Xin chào các bạn đã trở lại với series "Terraform và AWS Cho Người Mới Bắt Đầu"! Trong Bài 4: Kết nối Terraform với AWS - AWS Provider và Các Phương Thức Xác Thực, chúng ta đã cấu hình xong AWS Provider và đảm bảo Terraform có thể "nói chuyện" an toàn với tài khoản AWS của bạn.
Hôm nay là ngày bạn thực sự chạm tay vào sức mạnh của Terraform! Chúng ta sẽ cùng nhau:
Tìm hiểu về khái niệm Resource trong Terraform - "viên gạch" xây dựng nên hạ tầng.
Giới thiệu sơ lược về dịch vụ lưu trữ Amazon S3.
Viết những dòng code HCL đầu tiên để định nghĩa một S3 bucket.
Thực hành quy trình
plan
->apply
để tạo bucket trên AWS.Khám phá cách cập nhật và cuối cùng là xóa tài nguyên bằng
destroy
.
Hãy chuẩn bị tinh thần để chứng kiến điều kỳ diệu khi hạ tầng được tạo ra từ code nhé!
Resources trong Terraform là gì?
Trong Terraform, Resource là thành phần quan trọng nhất. Mỗi khối (block) resource
trong tệp cấu hình của bạn mô tả một hoặc nhiều đối tượng hạ tầng mà bạn muốn tạo và quản lý. Đó có thể là một máy chủ ảo (EC2 instance), một mạng riêng ảo (VPC), một cơ sở dữ liệu (RDS instance), hay trong trường hợp của bài này, một S3 bucket.
Cú pháp chung của một khối resource
như sau:
resource "resource_type" "resource_name" {
# Các đối số (arguments) cấu hình cho resource
# argument_name = value
# ...
}
Trong đó:
resource
: Từ khóa khai báo một khối tài nguyên."resource_type"
: Một chuỗi xác định loại tài nguyên bạn muốn tạo. Loại này được định nghĩa bởi provider. Ví dụ:"aws_instance"
cho máy chủ EC2,"aws_s3_bucket"
cho S3 bucket."resource_name"
: Một chuỗi do bạn tự đặt tên, dùng để định danh resource này trong phạm vi cấu hình Terraform của bạn. Nó giống như một biến cục bộ, cho phép bạn tham chiếu đến resource này từ những phần khác của code Terraform. Tên này không ảnh hưởng đến tên thực tế của tài nguyên trên AWS (trừ khi bạn dùng nó để gán cho thuộc tínhname
của tài nguyên).Bên trong cặp ngoặc nhọn
{}
là các arguments (đối số) dùng để cấu hình chi tiết cho resource đó. Các arguments này phụ thuộc vào từngresource_type
và được quy định trong tài liệu của provider.
Giới thiệu Sơ lược về Amazon S3
Amazon S3 (Simple Storage Service) là một dịch vụ lưu trữ đối tượng (object storage) của AWS. Nó cung cấp khả năng lưu trữ và truy xuất dữ liệu với độ bền cao, tính sẵn sàng cao, và khả năng mở rộng gần như vô hạn.
Một vài khái niệm chính của S3:
Buckets: Là các "thùng chứa" dữ liệu của bạn trên S3. Tên bucket phải là duy nhất trên toàn cầu (globally unique) trên tất cả các tài khoản AWS.
Objects: Là các tệp tin (files) và metadata (siêu dữ liệu) mô tả chúng mà bạn lưu trữ trong bucket.
Regions: Bạn chọn một AWS Region cụ thể để tạo bucket. Dữ liệu trong bucket sẽ được lưu trữ trong region đó.
Các trường hợp sử dụng phổ biến của S3:
Lưu trữ tài sản tĩnh cho website (hình ảnh, video, CSS, JavaScript).
Sao lưu và phục hồi dữ liệu.
Lưu trữ dữ liệu cho các ứng dụng Big Data và Data Lakes.
Lưu trữ log files.
S3 là một lựa chọn tuyệt vời để làm tài nguyên đầu tiên vì nó tương đối đơn giản, phổ biến và chi phí sử dụng có thể rất thấp (hoặc nằm trong Free Tier của AWS với dung lượng nhất định).
Định nghĩa một S3 Bucket bằng Terraform
Chúng ta sẽ sử dụng resource type aws_s3_bucket
để tạo một S3 bucket. Bạn luôn có thể tìm thấy tài liệu chi tiết nhất về resource này (và tất cả các resource khác của AWS provider) trên Terraform Registry: Terraform AWS Provider - aws_s3_bucket
Bây giờ, hãy thêm đoạn code sau vào tệp main.tf
của bạn (hoặc bạn có thể tạo một tệp mới ví dụ s3.tf
và Terraform sẽ tự động đọc nó)
# main.tf (hoặc s3.tf)
# Khối terraform {} và provider "aws" {} đã có từ các bài trước
# (Đảm bảo chúng vẫn còn trong cấu hình của bạn)
# terraform {
# required_providers {
# aws = {
# source = "hashicorp/aws"
# version = "~> 5.0"
# }
# }
# }
# provider "aws" {
# region = "ap-southeast-1" # Hoặc region bạn chọn
# default_tags {
# tags = {
# Environment = "Terraform-Blog-Series"
# Course = "Terraform-For-Beginners"
# ManagedBy = "Terraform"
# }
# }
# }
resource "aws_s3_bucket" "my_learning_bucket" { # "my_learning_bucket" là tên local trong Terraform
bucket = "tf-blog-series-my-unique-bucket-20250602" # Tên bucket này phải DUY NHẤT TOÀN CẦU!
# Bạn có thể thêm các tags cụ thể cho resource này.
# Chúng sẽ được gộp (merge) với default_tags từ provider.
# Nếu có key trùng lặp, tag ở đây sẽ ghi đè tag trong default_tags.
tags = {
Purpose = "Terraform Learning - First S3 Bucket"
LastUpdated = "2025-06-02"
}
}
Giải thích các phần quan trọng:
resource "aws_s3_bucket" "my_learning_bucket"
:aws_s3_bucket
: Loại tài nguyên chúng ta muốn tạo.my_learning_bucket
: Tên cục bộ mà chúng ta đặt cho resource này trong code Terraform. Bạn có thể dùng tên này để tham chiếu đến bucket từ các phần khác của cấu hình (sẽ học sau).
bucket = "tf-blog-series-my-unique-bucket-20250602"
:Đây là đối số quan trọng nhất, định nghĩa tên thực tế của S3 bucket sẽ được tạo trên AWS.
LƯU Ý CỰC KỲ QUAN TRỌNG: Tên S3 bucket phải là duy nhất trên toàn cầu trên tất cả các tài khoản AWS. Nếu bạn chọn một tên đã được người khác sử dụng, Terraform sẽ báo lỗi khi
apply
.Mẹo đặt tên bucket duy nhất: Kết hợp tên dự án, tên của bạn/công ty, ngày tháng, hoặc một chuỗi ngẫu nhiên (ví dụ:
mycompany-webapp-assets-prod-20250602-randomstr
). Hãy thay đổi giá trị này thành một tên duy nhất của riêng bạn.
tags = { ... }
:Bạn có thể định nghĩa các tags cụ thể cho resource này.
Các tags này sẽ được gộp với
default_tags
mà bạn đã định nghĩa trong khốiprovider "aws"
(ở Bài 4). Nếu một key tag (ví dụEnvironment
) xuất hiện ở cảdefault_tags
và trong resource này, giá trị trong resource sẽ được ưu tiên (ghi đè).
Thực hành: plan
và apply
để Tạo S3 Bucket
Sau khi thêm code định nghĩa S3 bucket vào tệp .tf
và lưu lại, hãy mở Terminal trong thư mục dự án của bạn và thực hiện các bước sau:
Bước 1: terraform plan
- Xem trước Kế hoạch
Chạy lệnh:
terraform plan
Terraform sẽ phân tích cấu hình của bạn, so sánh với trạng thái hiện tại (nếu có, ban đầu sẽ là trống) và hiển thị một kế hoạch chi tiết về những gì nó sẽ làm. Output sẽ tương tự như sau:
Terraform will perform the following actions:
# aws_s3_bucket.my_learning_bucket will be created
+ resource "aws_s3_bucket" "my_learning_bucket" {
+ acceleration_status = (known after apply)
+ acl = (known after apply)
+ arn = (known after apply)
+ bucket = "tf-blog-series-my-unique-bucket-20250602"
+ bucket_domain_name = (known after apply)
+ bucket_regional_domain_name = (known after apply)
+ force_destroy = false
+ id = (known after apply)
+ object_lock_enabled = false
+ policy = (known after apply)
+ region = "ap-southeast-1"
+ request_payer = (known after apply)
+ server_side_encryption_configuration = (known after apply)
+ tags = {
+ "Course" = "Terraform-For-Beginners"
+ "Environment" = "Terraform-Blog-Series"
+ "ManagedBy" = "Terraform"
+ "Purpose" = "Terraform Learning - First S3 Bucket"
+ "LastUpdated" = "2025-06-02"
}
+ tags_all = { # Bao gồm cả default_tags
+ "Course" = "Terraform-For-Beginners"
+ "Environment" = "Terraform-Blog-Series"
+ "ManagedBy" = "Terraform"
+ "Purpose" = "Terraform Learning - First S3 Bucket"
+ "LastUpdated" = "2025-06-02"
}
+ website_domain = (known after apply)
+ website_endpoint = (known after apply)
# ... và nhiều thuộc tính khác
}
Plan: 1 to add, 0 to change, 0 to destroy.
Dấu
+
phía trướcresource "aws_s3_bucket" "my_learning_bucket"
cho biết resource này sẽ được tạo mới.Xem kỹ các thuộc tính sẽ được tạo, đặc biệt là
bucket
vàtags_all
.Dòng cuối cùng
Plan: 1 to add, 0 to change, 0 to destroy.
tóm tắt hành động.Luôn luôn review kỹ output của
terraform plan
trước khiapply
!
Bước 2: terraform apply
- Thực thi Kế hoạch
Nếu bạn hài lòng với kế hoạch, hãy chạy lệnh:
terraform apply
Terraform sẽ hiển thị lại kế hoạch và yêu cầu bạn xác nhận bằng cách gõ yes
:
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Sau khi bạn gõ yes
và nhấn Enter, Terraform sẽ bắt đầu tạo S3 bucket trên AWS. Bạn sẽ thấy output tương tự:
aws_s3_bucket.my_learning_bucket: Creating...
aws_s3_bucket.my_learning_bucket: Creation complete after 2s [id=tf-blog-series-my-unique-bucket-20250602]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Chúc mừng! Bạn vừa tạo thành công tài nguyên AWS đầu tiên bằng Terraform!
Bước 3: Kiểm tra trên AWS Management Console
Đăng nhập vào AWS Management Console.
Điều hướng đến dịch vụ S3.
Trong danh sách các buckets, bạn sẽ thấy bucket vừa tạo (ví dụ:
tf-blog-series-my-unique-bucket-20250602
).Nhấp vào tên bucket để xem chi tiết, kiểm tra Region và các Tags đã được áp dụng.
Xem xét State File (terraform.tfstate
)
Sau khi terraform apply
thành công, Terraform sẽ tạo (hoặc cập nhật) một tệp tin tên là terraform.tfstate
trong thư mục dự án của bạn (nếu bạn đang sử dụng local state, là mặc định).
Đây là một tệp JSON cực kỳ quan trọng. Nó lưu trữ trạng thái của các tài nguyên mà Terraform đang quản lý, ánh xạ các resource trong code của bạn với các đối tượng thực tế trên AWS.
Terraform sử dụng tệp state này để biết những gì đã được tạo, để lên kế hoạch cho các thay đổi tiếp theo, và để quản lý các phụ thuộc.
TUYỆT ĐỐI KHÔNG BAO GIỜ SỬA TỆP
terraform.tfstate
THỦ CÔNG trừ khi bạn là chuyên gia và biết chính xác mình đang làm gì (và thường là trong các tình huống khẩn cấp, có hướng dẫn từ support). Việc sửa thủ công có thể làm hỏng state và gây ra các vấn đề nghiêm trọng.
Bạn có thể mở tệp terraform.tfstate
để xem (nhưng đừng sửa!). Nó sẽ chứa thông tin chi tiết về S3 bucket bạn vừa tạo.
Thay đổi và Cập nhật Resource
Giả sử bạn muốn thêm hoặc thay đổi một tag cho S3 bucket. Hãy sửa khối resource "aws_s3_bucket" "my_learning_bucket"
trong tệp .tf
của bạn:
resource "aws_s3_bucket" "my_learning_bucket" {
bucket = "tf-blog-series-my-unique-bucket-20250602" # Giữ nguyên tên bucket
tags = {
Purpose = "Terraform Learning - Updated Bucket" # Thay đổi giá trị
LastUpdated = "2025-06-03" # Thay đổi giá trị
ReviewedBy = "MySelf" # Thêm tag mới
}
}
Lưu tệp lại và chạy:
terraform plan
: Bạn sẽ thấy Terraform phát hiện ra sự thay đổi và lên kế hoạch cập nhật (modify) tags cho bucket. Dấu~
thường biểu thị sự thay đổi.Plan: 0 to add, 1 to change, 0 to destroy.
terraform apply
: Xác nhậnyes
để áp dụng thay đổi.Kiểm tra lại trên AWS S3 Console, bạn sẽ thấy các tags đã được cập nhật.
Dọn dẹp: terraform destroy
Khi bạn học hoặc thử nghiệm, việc dọn dẹp tài nguyên sau khi hoàn thành là rất quan trọng để tránh phát sinh chi phí không mong muốn. Terraform cung cấp một lệnh đơn giản để làm điều này:
terraform destroy
Lệnh này sẽ:
Hiển thị tất cả các tài nguyên mà nó sẽ xóa (trong trường hợp này là S3 bucket).
Yêu cầu bạn xác nhận bằng cách gõ
yes
.
Sau khi bạn xác nhận, Terraform sẽ xóa S3 bucket khỏi tài khoản AWS của bạn.
aws_s3_bucket.my_learning_bucket: Destroying... [id=tf-blog-series-my-unique-bucket-20250602]
aws_s3_bucket.my_learning_bucket: Destruction complete after 1s
Destroy complete! Resources: 1 destroyed.
Kiểm tra lại trên S3 Console, bucket sẽ không còn nữa.
Kết luận
Trong bài viết tiếp theo, Bài 6: Terraform State - "Bộ nhớ" của Hạ tầng AWS của Bạn, chúng ta sẽ đào sâu hơn vào khái niệm "Terraform State" - một thành phần tối quan trọng giúp Terraform hiểu và quản lý hạ tầng của bạn một cách chính xác.