iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 29
0
DevOps

今晚我想來點 Terraform 佐 AWS系列 第 29

今晚我想來點遠端化 Terraform 狀態佐 AWS 高可用儲存空間 S3

  • 分享至 

  • xImage
  •  

前一篇我們稍微聊了一下有什麼方案可以儲存狀態資料,今天就要選 S3 的方案來實作。

使用 AWS S3 儲存狀態檔,並搭配 AWS DynamoDB 鎖定狀態。

完整的檔案內容,可以在 Github 上看到。

建立 AWS S3 儲存貯體 (Bucket)

使用 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 表

使用 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,成功之後,把輸出的資訊記錄下來,這些在後面會使用到

$ terraform apply
...
Outputs:

bucket_name = terraform-state20200929152923719000000001
dynamodb_table_name = terraform-locks

設定後端 (Backend)

接下來要實測儲存狀態資料到 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"
  }
}

測試儲存狀態到 S3

首先要讓 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 上的資料

aws s3 ls 指令查看

$ aws s3 ls terraform-state20200929152923719000000001/build-instance/
2020-10-01 14:28:38        156 terraform.tfstate

查看 DynamoDB 上的資料

先查一下我們建立的表

$ 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
}

上一篇
今晚我想來點遠端化 Terraform 狀態
下一篇
今晚我想來點「今晚我想來點 Terraform 佐 AWS」佐鐵人賽心得
系列文
今晚我想來點 Terraform 佐 AWS30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言