使用S3管理tfstate文件
首先
你好,我是康平。
这次我想把tfstate保存到S3上。
在使用Terraform Apply创建资源时,需要将tfstate存储在S3上。
文章摘要
创建S3存储桶。本次仍采用registry的模块。
同时按照文章中的指引,更改目录结构。
请问您的意思是“目标读者”吗?
-
- AWSのリソースをTerraformで作成しようと考えている方
- tfstateをS3で管理したい方
这次创建的AWS资源
-
- S3
- 以上
目录结构
我根据不同的环境进行目录分离。
这是通过主tf文件调用模块的形式。
我根据两篇文章参考更改了目录结构。
-
- 20 Terraform Best Practices to Improve your TF
- Standard Module Structure
.
├── envs
│ ├── dev # develop環境
│ │ ├── backend.tf # tfstateを管理
│ │ ├── main.tf # module呼び出し
│ │ ├── provider.tf # providerブロック
│ │ ├── terraform.tfvars # 変数を入力
│ │ └── variables.tf # 変数
│ ├── prd # production環境
│ └── stg # staging環境
└── modules
├── network # ネットワークリソース
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
└── tfstate # tfstate
├── main.tf
├── outputs.tf
└── variables.tf
将outputs.tf和variables.tf文件保持为空,也要创建。
Terraform代码和解释
首先创建用于存储tfstate的S3存储桶。
模块/状态/主要.tf
module "s3_bucket_dev_bucket" {
source = "terraform-aws-modules/s3-bucket/aws"
version = "3.15.1"
bucket = "${var.env}-qiita-bucket-s3"
acl = "private"
control_object_ownership = true
object_ownership = "ObjectWriter"
versioning = {
enabled = true
}
server_side_encryption_configuration = {
rule = {
apply_server_side_encryption_by_default = {
sse_algorithm = "AES256"
}
}
}
tags = {
name = "${var.env}-qiita-bucket-s3"
}
}
acl:只有创建S3的人可以访问
control_object_ownership・object_ownership:启用对象的所有权控制
versioning:启用版本控制
server_side_encryption_configuration:用于加密算法的技术
环境/开发/后端.tf
创建S3后,请使用backend区块将tfstate存储到S3中。
请注意,backend区块不支持使用变量。
terraform {
backend "s3" {
bucket = "dev-qiita-bucket-s3"
key = "dev/terraform.tfstate"
region = "ap-northeast-1"
encrypt = true
}
}
在main.tf中调用模块,在provider.tf中定义terraform的初始设置。
module “dev_tfstate” {
source = “../../modules/tfstate”
}
module “network” {
source = “../../modules/network”
}
envs/dev/main.tf
envs/dev/main.tf
module “dev_tfstate” {
source = “../../modules/tfstate”
}
module “network” {
source = “../../modules/network”
}
在创建AWS资源时,我们将使用默认标签为其添加名为dev的标签。envs/dev/provider.tf
terraform {
required_version = “1.3.9”
required_providers {
aws = {
source = “hashicorp/aws”
version = “~>5.0”
}
}
}
provider “aws” {
region = “ap-northeast-1”
default_tags {
tags = {
Environment = “dev”
}
}
}
确认动作
我們將確認 tfstate 是否存儲在 S3 上。
它已經成功地在 dev/terraform.tfstate 中創建。
這意味著 tfstate 不會在本地創建。
結束
這次我們設定了使用S3來管理tfstate。
tfstate檔案的管理非常重要,所以要小心管理。
此外,我們參考了兩篇文章的目錄結構。
-
- 20 Terraform Best Practices to Improve your TF
- Standard Module Structure
接下来我们需要创建一个CI来执行Terraform Plan。
这次创建的 GitHub 仓库链接为:https://github.com/hikobend/terraform-qiita
分支链接为:https://github.com/hikobend/terraform-qiita/pull/4
使用DynamoDB来管理tfstate
在处理tfstate时,您可以使用S3和DynamoDB进行管理。
使用DynamoDB可以对状态进行加锁。
如果状态没有加锁,并且多个人尝试执行Apply来创建AWS资源,那么状态文件可能会出现不一致的情况。
因此,通过添加StateLock,如果有人正在执行Apply,则其他人将无法执行Apply。
在团队开发中,我认为使用S3 + DynamoDB来管理tfstate是比较好的方式;在个人开发中,只使用S3来管理就可以了。
参考文章:State管理最佳实践
terraform {
使用后端 “s3” {
存储桶 = “S3バケット名”
键 = “dev/terraform.tfstate”
区域 = “ap-northeast-1”
dynamodb表 = “DynamoDB名”
加密 = true
}
}
※由于本文中的资源是由个人创建的,不会使用dynamoDB。
文献引用
-
- AWS S3 bucket Terraform module
-
- 20 Terraform Best Practices to Improve your TF
-
- Standard Module Structure
- State管理ベストプラクティス
将来打算制作的文章
-
- Terraform Plan・ApplyのCIを作成
- セキュリティグループの作成