前一篇我們稍微聊了一下有什麼方案可以儲存狀態資料,今天就要選 S3 的方案來實作。
使用 AWS S3 儲存狀態檔,並搭配 AWS DynamoDB 鎖定狀態。
完整的檔案內容,可以在 Github 上看到。
使用 aws_s3_bucket
建立儲存貯體:
bucket_prefix
指定唯一名稱前綴versioning
啟用版本控制server_side_encryption_configuration
啟用伺服器端加密resource "aws_s3_bucket" "state" {
bucket_prefix = "terraform-state"
versioning {
enabled = true
}
server_side_encryption_configuration {
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
tags = {
Terraform = true
}
}
使用 aws_dynamodb_table
建立表
name
設定表的名稱billing_mode
設定收費模式hash_key
設定主鍵,一定要叫 "LockID" 並且是"字串"型態attribute
設定資料屬性resource "aws_dynamodb_table" "state_locks" {
name = "terraform-locks"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
tags = {
Terraform = true
}
}
把後續會使用到的資訊設定到輸出上
output "bucket_name" {
value = aws_s3_bucket.state.bucket
}
output "dynamodb_table_name" {
value = aws_dynamodb_table.state_locks.name
}
執行 terraform apply
,成功之後,把輸出的資訊記錄下來,這些在後面會使用到
$ terraform apply
...
Outputs:
bucket_name = terraform-state20200929152923719000000001
dynamodb_table_name = terraform-locks
接下來要實測儲存狀態資料到 S3 了。首先要選一個 Terraform 工作資料夾,就從前面的練習隨便選一個來使用。
加入 s3 的 backend 區塊:
encrypt
啟用伺服器端加密bucket
S3 儲存貯體的名稱key
狀態檔在 S3 儲存貯體裡的檔名region
AWS 地區dynamodb_table
DynamoDB 表的名稱terraform {
backend "s3" {
encrypt = true
bucket = "terraform-state20200929152923719000000001"
key = "build-instance/terraform.tfstate"
region = "ap-northeast-1"
dynamodb_table = "terraform-locks"
}
}
首先要讓 Terraform 初始化後端 s3
$ terraform init
Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.
...
Terraform 會把設定後端的設定放到 .terraform/terraform.tfstate
檔案中。
接下來實際建立基礎架構,如果你有注意到,會多出一些狀態鎖定的訊息。
$ terraform apply
...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Releasing state lock. This may take a few moments...
測試成功!!
用 aws s3 ls
指令查看
$ aws s3 ls terraform-state20200929152923719000000001/build-instance/
2020-10-01 14:28:38 156 terraform.tfstate
先查一下我們建立的表
$ aws dynamodb list-tables --region="ap-northeast-1"
{
"TableNames": [
"terraform-locks"
]
}
再查看裡面的資料
$ aws dynamodb scan --region="ap-northeast-1" --table-name="terraform-locks"
{
"Items": [
{
"Digest": {
"S": "b1a4043a8eedb084e4762218a5ee01b6"
},
"LockID": {
"S": "terraform-state20200929152923719000000001/build-instance/terraform.tfstate-md5"
}
}
],
"Count": 1,
"ScannedCount": 1,
"ConsumedCapacity": null
}
如果在 Terraform 在執行過程中查看 DynamoDB 的資料,才會看到鎖定中的資料。
{
"Items": [
{
"LockID": {
"S": "terraform-state20200929152923719000000001/build-instance/terraform.tfstate"
},
"Info": {
"S": "{\"ID\":\"abc-abc-abc-abc\",\"Operation\":\"OperationTypeApply\",\"Info\":\"\",\"Who\":\"nyo\",\"Version\":\"0.13.2\",\"Created\":\"2020-10-01T07:42:51.137081Z\",\"Path\":\"terraform-state20200929152923719000000001/build-instance/terraform.tfstate\"}"
}
},
{
"Digest": {
"S": "b1a4043a8eedb084e4762218a5ee01b6"
},
"LockID": {
"S": "terraform-state20200929152923719000000001/build-instance/terraform.tfstate-md5"
}
}
],
"Count": 2,
"ScannedCount": 2,
"ConsumedCapacity": null
}