Trong bài viết này, chúng ta sẽ xem trạng thái Terraform là gì và cách quản lý trạng thái này trên S3 Bucket. Chúng ta cũng sẽ xem "lock" là gì trong Terraform và cách triển khai trạng thái này. Để triển khai, chúng ta cần tạo một S3 Bucket và một DynamoDB Table trên AWS.
Trước khi tiếp tục, chúng ta hãy tìm hiểu những điều cơ bản về trạng thái Terraform và Lock.
Cấu hình "AWS_ACCESS_KEY_ID" và "AWS_SECRET_ACCESS_KEY" để bạn có thể truy cập tài khoản của mình từ CLI.
Sử dụng lệnh sau để xuất các giá trị của "AWS_ACCESS_KEY_ID" và "AWS_SECRET_ACCESS_KEY
Sau khi đã định cấu hình thông tin xác thực, bạn có thể chỉ cần kiểm tra chúng bằng cách liệt kê các thùng bằng lệnh sau.
aws s3 ls
vim variables.tf
Tạo 'main.tf' chịu trách nhiệm tạo Bảng DynamoDB. Main.tf này sẽ đọc giá trị của các biến từ variables.tf. Bảng này sẽ được sử dụng để lưu trữ khóa.
Lệnh đầu tiên được sử dụng là 'terraform init'. Lệnh này tải xuống và cài đặt các plugin cho các nhà cung cấp được sử dụng trong cấu hình. Trong trường hợp của chúng tôi, đó là AWS.
terraform init
Lệnh thứ hai được sử dụng là 'terraform plan'. Lệnh này được sử dụng để xem những thay đổi sẽ diễn ra trên cơ sở hạ tầng.
terraform plan
Lệnh 'terraform apply' sẽ tạo các tài nguyên trên AWS được đề cập trong tệp main.tf. Bạn sẽ được nhắc cung cấp thông tin đầu vào để tạo các tài nguyên.
terraform apply
Bây giờ, bạn có thể vào DynamoDB Dashboard trên bảng điều khiển để kiểm tra xem Bảng đã được tạo hay chưa.
Cho đến thời điểm này, chúng tôi đã tạo S3 Bucket theo cách thủ công từ S3 Console và DynamoDB Table bằng Terraform. Chúng tôi chưa cấu hình S3 Bucket làm Backend để lưu trữ trạng thái và DynamoDB Table để lưu trữ khóa.
Để đạt được mục tiêu, chúng tôi phải sửa đổi tệp Terraform main.tf. Sau khi sửa đổi mã và thực thi, trạng thái cục bộ Pre-existing của chúng ta sẽ được sao chép vào S3 Backend.
Cập nhật main.tf hiện tại của chúng ta bằng mã sau.
vim main.tf
Bây giờ, nếu bạn thử lệnh "terraform plan" để xem tài nguyên mới nào sẽ được tạo, lệnh sẽ không thành công với lỗi sau.
Bạn sẽ được yêu cầu khởi tạo lại phần phụ trợ.
Để khởi tạo lại phần phụ trợ, hãy sử dụng lệnh "terraform init". Ở bước này, tệp trạng thái cục bộ của bạn sẽ được sao chép vào S3 Bucket.
terraform init
Bạn có thể quan sát đầu ra như trong ảnh chụp màn hình bên dưới sau khi thực hiện lệnh "terraform init", Terraform đã được bật để sử dụng Bảng DynamoDb để lấy khóa. Sau khi Khóa được bật, không có hai thao tác giống nhau nào trên cùng một tài nguyên có thể được thực hiện song song.
Bạn có thể vào Bảng điều khiển S3 từ Bảng điều khiển AWS để xem terraform.tfstate đã được sao chép hay chưa.
Bây giờ, bạn lại có thể tạo một tài nguyên mới và xem trạng thái sẽ được lưu trữ trên S3 Bucket. Để tạo bảng Kiểm tra DynamoDB mới, hãy cập nhật tệp main.tf bằng mã sau.
vim main.tf
Lần này, không cần phải thực thi "terraform init" vì không có thay đổi nào trong Backend đối với Provider.
Bạn chỉ cần sử dụng lệnh "terraform plan" để xem những tài nguyên mới nào sẽ được tạo.
terraform plan
Bây giờ, hãy thực thi lệnh sau để tạo một DynamoDb Test Table mới.
terraform apply
Trong ảnh chụp màn hình ở trên, bạn có thể thấy Khóa đã được bật, tệp .tfstate đang được sao chép vào S3.
Bây giờ, trong bảng điều khiển, bạn có thể thấy bảng mới đã được tạo
Bây giờ nếu bạn không còn cần tài nguyên đã tạo bằng Terraform nữa, hãy sử dụng lệnh sau để xóa tài nguyên.
terraform destroy
Ngay sau khi xóa tài nguyên, bạn có thể thấy bảng được sử dụng để khóa cũng đã bị xóa. Nếu bạn không cần S3 Bucket nữa, bạn có thể xóa nó khỏi bảng điều khiển.
Trước khi tiếp tục, chúng ta hãy tìm hiểu những điều cơ bản về trạng thái Terraform và Lock.
- Trạng thái Terraform (tệp terraform.tstate):
Tệp trạng thái chứa thông tin về những tài nguyên hiện có được xác định trong các tệp cấu hình terraform. Ví dụ, nếu bạn đã tạo một EC2 Instance sử dụng terraform config, thì tệp trạng thái chứa thông tin về tài nguyên thực tế được tạo trên AWS. - S3 làm Backend để lưu trữ tệp State:
Nếu chúng ta làm việc trong một nhóm, thì tốt nhất là lưu trữ tệp trạng thái terraform từ xa để mọi người trong nhóm có thể truy cập vào tệp đó. Để lưu trữ trạng thái từ xa, chúng ta cần hai thứ: một thùng s3 để lưu trữ tệp trạng thái và một tài nguyên terraform s3 backend. - Khóa:
Nếu chúng ta lưu trữ tệp trạng thái từ xa để nhiều người có thể truy cập vào tệp đó, thì chúng ta có nguy cơ nhiều người cố gắng thực hiện các thay đổi đối với cùng một tệp tại cùng một thời điểm. Vì vậy, chúng ta cần có một cơ chế sẽ "khóa" trạng thái nếu trạng thái đó hiện đang được những người dùng khác sử dụng. Chúng ta có thể thực hiện điều này bằng cách tạo một bảng dynamoDB để terraform sử dụng.
Điều kiện tiên quyết
- Hiểu biết cơ bản về Terraform.
- Hiểu biết cơ bản về S3 Bucket.
- Terraform được cài đặt trên hệ thống của bạn.
- Tài khoản AWS (Tạo nếu bạn chưa có).
- 'access_key' & 'secret_key' của Người dùng AWS IAM. (Nhấp vào đây để tìm hiểu cách tạo người dùng IAM bằng 'access_key' và 'secret_key' trên AWS, )
Những gì chúng ta sẽ làm
- Tạo một S3 Bucket và đính kèm Chính sách vào đó.
- Tạo Bảng DynamoDB bằng Terraform
- Tạo EC2 bằng các tệp cấu hình Terraform.
- Xóa phiên bản EC2 đã tạo bằng Terraform.
Tạo một S3 Bucket và đính kèm Chính sách vào đó.
Nhấp vào đây để tìm hiểu cách tạo S3 Bucket trên Tài khoản AWS. Sau khi tạo một Bucket, hãy đính kèm Chính sách sau vào đó.
Mã:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1560164441598", "Effect": "Allow", "Principal": "*", "Action": [ "s3:PutObject*", "s3:List*", "s3:Get*", "s3:Delete*" ], "Resource": [ "arn:aws:s3:::state-lock-rahul", "arn:aws:s3:::state-lock-rahul/*" ] } ]}
Cấu hình "AWS_ACCESS_KEY_ID" và "AWS_SECRET_ACCESS_KEY" để bạn có thể truy cập tài khoản của mình từ CLI.
Sử dụng lệnh sau để xuất các giá trị của "AWS_ACCESS_KEY_ID" và "AWS_SECRET_ACCESS_KEY
Mã:
export AWS_ACCESS_KEY_ID=AKIAQ6GAIA5XC2XMMM7Wexport AWS_SECRET_ACCESS_KEY=BqmubAkz1L2OOsxcvJLjl3usE0XIn5WNtY+Qaxfbecho $AWS_ACCESS_KEY_IDecho $AWS_SECRET_ACCESS_KEY
aws s3 ls
Tạo Bảng DynamoDB bằng Terraform
Tạo 'variables.tf' chứa các biến bắt buộc khai báo.vim variables.tf
Mã:
biến "region" { description = "Khu vực AWS VPC"}
Tạo 'main.tf' chịu trách nhiệm tạo Bảng DynamoDB. Main.tf này sẽ đọc giá trị của các biến từ variables.tf. Bảng này sẽ được sử dụng để lưu trữ khóa.
Mã:
nhà cung cấp "aws" { region = "${var.region}"}
tài nguyên "aws_dynamodb_table" "terraform_locks" {
name = "rahul-test-dynamodb-table"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
thuộc tính {
name = "LockID"
type = "S"
}
}
Lệnh đầu tiên được sử dụng là 'terraform init'. Lệnh này tải xuống và cài đặt các plugin cho các nhà cung cấp được sử dụng trong cấu hình. Trong trường hợp của chúng tôi, đó là AWS.
terraform init
Lệnh thứ hai được sử dụng là 'terraform plan'. Lệnh này được sử dụng để xem những thay đổi sẽ diễn ra trên cơ sở hạ tầng.
terraform plan
Lệnh 'terraform apply' sẽ tạo các tài nguyên trên AWS được đề cập trong tệp main.tf. Bạn sẽ được nhắc cung cấp thông tin đầu vào để tạo các tài nguyên.
terraform apply
Bây giờ, bạn có thể vào DynamoDB Dashboard trên bảng điều khiển để kiểm tra xem Bảng đã được tạo hay chưa.
Cho đến thời điểm này, chúng tôi đã tạo S3 Bucket theo cách thủ công từ S3 Console và DynamoDB Table bằng Terraform. Chúng tôi chưa cấu hình S3 Bucket làm Backend để lưu trữ trạng thái và DynamoDB Table để lưu trữ khóa.
Để đạt được mục tiêu, chúng tôi phải sửa đổi tệp Terraform main.tf. Sau khi sửa đổi mã và thực thi, trạng thái cục bộ Pre-existing của chúng ta sẽ được sao chép vào S3 Backend.
Cập nhật main.tf hiện tại của chúng ta bằng mã sau.
vim main.tf
Mã:
provider "aws" { region = "${var.region}"}terraform { backend "s3" { bucket = "state-lock-rahul" key = "test/terraform.tfstate" region = "eu-west-3" dynamodb_table = "rahul-test-dynamodb-table" }}resource "aws_dynamodb_table" "terraform_locks" { name = "rahul-test-dynamodb-table" billing_mode = "PAY_PER_REQUEST" hash_key = "LockID" attribute { name = "LockID" type = "S" }}
Bây giờ, nếu bạn thử lệnh "terraform plan" để xem tài nguyên mới nào sẽ được tạo, lệnh sẽ không thành công với lỗi sau.
Bạn sẽ được yêu cầu khởi tạo lại phần phụ trợ.
Để khởi tạo lại phần phụ trợ, hãy sử dụng lệnh "terraform init". Ở bước này, tệp trạng thái cục bộ của bạn sẽ được sao chép vào S3 Bucket.
terraform init
Bạn có thể quan sát đầu ra như trong ảnh chụp màn hình bên dưới sau khi thực hiện lệnh "terraform init", Terraform đã được bật để sử dụng Bảng DynamoDb để lấy khóa. Sau khi Khóa được bật, không có hai thao tác giống nhau nào trên cùng một tài nguyên có thể được thực hiện song song.
Bạn có thể vào Bảng điều khiển S3 từ Bảng điều khiển AWS để xem terraform.tfstate đã được sao chép hay chưa.
Bây giờ, bạn lại có thể tạo một tài nguyên mới và xem trạng thái sẽ được lưu trữ trên S3 Bucket. Để tạo bảng Kiểm tra DynamoDB mới, hãy cập nhật tệp main.tf bằng mã sau.
vim main.tf
Mã:
biến "region" { mô tả = "Khu vực AWS VPC"}Rahuls-MacBook-Pro:terraform rahul$ cat main.tfnhà cung cấp "aws" { region = "${var.region}"}terraform { backend "s3" { bucket = "state-lock-rahul" key = "test/terraform.tfstate" region = "eu-west-3" dynamodb_table = "rahul-test-dynamodb-table" }}resource "aws_dynamodb_table" "terraform_locks" { name = "rahul-test-dynamodb-table" billing_mode = "PAY_PER_REQUEST" hash_key = "LockID" thuộc tính { name = "LockID" type = "S" }}resource "aws_dynamodb_table" "test-table" { name = "rahul-test-table" billing_mode = "PAY_PER_REQUEST" hash_key = "LockID" attribute { name = "LockID" type = "S" }}
Lần này, không cần phải thực thi "terraform init" vì không có thay đổi nào trong Backend đối với Provider.
Bạn chỉ cần sử dụng lệnh "terraform plan" để xem những tài nguyên mới nào sẽ được tạo.
terraform plan
Bây giờ, hãy thực thi lệnh sau để tạo một DynamoDb Test Table mới.
terraform apply
Trong ảnh chụp màn hình ở trên, bạn có thể thấy Khóa đã được bật, tệp .tfstate đang được sao chép vào S3.
Bây giờ, trong bảng điều khiển, bạn có thể thấy bảng mới đã được tạo
Bây giờ nếu bạn không còn cần tài nguyên đã tạo bằng Terraform nữa, hãy sử dụng lệnh sau để xóa tài nguyên.
terraform destroy
Ngay sau khi xóa tài nguyên, bạn có thể thấy bảng được sử dụng để khóa cũng đã bị xóa. Nếu bạn không cần S3 Bucket nữa, bạn có thể xóa nó khỏi bảng điều khiển.