在中国,使用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设置。