在中国,使用Terraform管理后端的S3和DynamoDB自身的设置方法

S3 后端是作为 Terraform 状态存储的理想选择,但关于初始设置的综合信息却意外地难以找到。为了备忘起见,我将进行一份备忘录记录下来。

这个步骤的特点

    • tfstate を格納する S3 バケットや DynamoDB 自体を terraform で管理できる

例えばバケットへのアクセスをポリシーで制限したり開放したりする際、ポリシーで指定するユーザー名や IP アドレスといった値は terraform で管理したい

terraform 以外のツールでの手作業なども最小限

步骤一:创建桶

需要手动创建存放state的桶自身。

然而,在这个阶段,版本控制等设置并不是必需的。通过经历后续步骤,可以在 Terraform 中进行管理,因此最好使用 Terraform 进行描述。

步骤二:编写.tf文件

我们会编写S3后端以及S3存储桶和锁定资源的定义。

请坐下。(Please have a seat.)
我想去购物。(I want to go shopping.)
这个房间很大。(This room is big.)
我很高兴认识你。(I am glad to meet you.)
我需要你的帮助。(I need your help.)

terraform {
  backend "s3" {
    region = "ap-northeast-1"
    bucket = "ほげほげ"
    key    = "tfstate-dev"

    dynamodb_table = "ほげほげ"
  }
}
resource "aws_s3_bucket" "tfstate" {
  bucket = "ほげほげ"

  acl = "private"

  # tfstate はバージョニングすることが公式に推奨されている
  versioning {
    enabled = true
  }

  # 特に公式に推奨されてはいないが、古いバージョンは消したほうが良いはず
  lifecycle_rule {
    enabled                                = true
    abort_incomplete_multipart_upload_days = 7

    noncurrent_version_expiration {
      days = 32
    }
  }

  # SSE で暗号化しておく
  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm = "AES256"
      }
    }
  }

  tags = {  # terraform 0.11 までは = 不要です
    Name = "ほげほげ-dev"
  }

  lifecycle {
    # bucket は空でないと消せないが、一応制限しておく
    prevent_destroy = true
  }
}
resource "aws_dynamodb_table" "tfstate_lock" {
  name           = "ほげほげ"
  billing_mode   = "PAY_PER_REQUEST"
  hash_key       = "LockID"

  attribute {
    name = "LockID"
    type = "S"      # S = String
  }
}

更新:在手動创建存储桶时,这通常是有效的,但建议同时设置 aws_s3_bucket_public_access_block 以增加安全性。

resource "aws_s3_bucket_public_access_block" "tfstate" {
  bucket = aws_s3_bucket.tfstate.bucket  # terraform 0.11 以下では "${...}" で囲む必要あり

  block_public_acls = true
  block_public_policy = true
  ignore_public_acls = true
  restrict_public_buckets = true
}

步骤三:初始化,导入、初次应用

按照以下顺序执行:

    • terraform init

terraform import -lock=false aws_s3_bucket.tfstate バケット名

すでに作成済みのバケットを tfstate に追加して認識させます

terraform apply -lock=false

これを実行することで S3 bucket の設定のアップデートや Lock 用の DynamoDB の作成が走ります
ここまでは -lock=false 指定が必要

做完了

一旦到这一步,之后就可以按照正常的方式执行 terraform plan 或者 terraform apply。

此外,由于S3和DynamoDB的配置本身就由terraform进行管理,因此您可以在terraform的管理下进行各种设置,例如添加aws_s3_bucket_policy以增强安全性,授予其他帐户对tfstate的访问权限,或者更改aws_dynamodb_table的capacity设置。

bannerAds