【Terraform】共享管理状态文件
概要
本文将介绍如何在云上管理使用terraform apply命令创建的状态文件。假设您正在使用terraform管理AWS资源。
管理方式
當執行apply時,會生成一個記錄目前結果的檔案,該檔案稱為tfstate檔案。(它會檢查這個檔案並計算出差異對吧)
預設情況下,該檔案會在本地生成,但在進行團隊開發時,如果只存在於某個人的本地,會造成困擾。
因此,一般來說,tfstate檔案會按照以下方式進行管理。
-
- Cloud上にステートファイル管理用のバケット(ECSやGCS)を作成
- Terraform Cloudを利用
使用 AWS S3 存储桶
在AWS上,可以轻松地进行管理。
然而,最好是将存储状态文件的存储桶本身放在terraform以外的基础架构中进行管理(根据官方文档)。
尽管最好为管理该存储桶而单独分配一个帐户,但这样会变得复杂,因此我们将使用aws-cli创建存储桶,并将其置于terraform的管理之外。
1. 创建状态管理桶
只是简单地创建也可以,但如果按照以下设置保留的话会更加放心。
-
- バージョニング :不用意な削除等が行われた場合でも復元することができる
-
- 暗号化 :バケット自体の暗号化を行う
- ブロックパブリックアクセス:バケットを公開しないよう設定
# バケット作成
aws s3api create-bucket --bucket ${bucket_name} --create-bucket-configuration LocationConstraint=${region}
# バージョニングの有効化
aws s3api put-bucket-versioning --bucket ${bucket_name} --versioning-configuration Status=Enabled
# バケットの暗号化
aws s3api put-bucket-encryption --bucket ${bucket_name} \
--server-side-encryption-configuration '{"Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "AES256"}}]}'
# ブロックパブリックアクセス
aws s3api put-public-access-block --bucket ${bucket_name} \
--public-access-block-configuration '{
"BlockPublicAcls" : true,
"IgnorePublicAcls" : true,
"BlockPublicPolicy" : true,
"RestrictPublicBuckets": true
}'
# タグ付け
aws s3api put-bucket-tagging --bucket ${bucket_name} \
--tagging 'TagSet=[{Key=description,Value=manage mintak-terraformer tfstate}]'
2. 创建 DynamoDB 表
通过结合使用DynamoDB,可以实现状态锁定。
※虽然真假并不明确,但是分区键的名称如果不是LockID,将无法正常运行。
aws dynamodb create-table \
--table-name ${state_lock_table_name} \
--attribute-definitions '[{"AttributeName":"LockID","AttributeType": "S"}]' \ # S=stringの意味
--key-schema '[{"AttributeName":"LockID","KeyType": "HASH"}]' \ # HASH=パーティションキーの意味
--provisioned-throughput '{"ReadCapacityUnits": 1, "WriteCapacityUnits": 1}' # 念のため最低値を設定しておく
3. 后端设置
为了将状态文件存储在上述创建的存储桶中,我们将实施一项操作来设置这一配置。在存在tf文件的目录中,我们将创建一个新的backend.tf文件。
terraform {
backend s3 {
bucket = "1で作成したバケット名"
key = "terraform.tfstate"
dynamodb_table = "2で作成したテーブル名"
region = "ap-northeast-1"
encrypt = true
}
}
使用 Terraform Cloud
看起来也有与Github和GitLab集成以执行计划和应用的功能,但本次示例仅限于用于共享管理状态文件的目的。
我觉得在用户界面上能够查看变更内容(历史)非常出色。
1. 注册账号
请点击 Terraform Cloud 上的“注册Cloud”按钮来创建一个账号。所需信息仅需要一个电子邮件地址。需要创建的内容包括账号、组织和工作区这三个项。
2. 工作空间设置
为了仅限于共享管理状态文件,执行以下设置。
- 実行モードをLocalに
- VCS provider off
如果在设置工作区时设置了版本控制系统提供者,则在这种情况下将其关闭,因为它在本次使用中不需要。
从工作区->设置->版本控制中进行删除操作。
3. 命令行登录
你要從控制台登錄嗎?在這個步驟中將生成API Key。(key信息將存放在~/.terraform.d/credentials.tfrc.json中。1)
你想繼續嗎?請輸入”y”。
$ terraform login
Do you want to proceed? (y/n) y
# ここでTerraform CloudのUIでAPI Keyを発行する画面へ遷移する。そのまま発行を行いコピーして、コンソールにペーストする
Terraform must now open a web browser to the tokens page for app.terraform.io.
If a browser does not open this automatically, open the following URL to proceed:
https://app.terraform.io/app/settings/tokens?source=terraform-login
---------------------------------------------------------------------------------
Generate a token using your browser, and copy-paste it into this prompt.
Terraform will store the token in plain text in the following file
for use by subsequent commands:
/Users/mintak/.terraform.d/credentials.tfrc.json
Token for app.terraform.io:
Retrieved token for user mintak21
---------------------------------------------------------------------------------
Success! Terraform has obtained and saved an API token.
4. 后端设置
为了将状态文件保存到Terraform Cloud中,我们将进行如下实现。
在存在tf文件的目录中,新建一个backend.tf文件。
terraform {
backend remote {
hostname = "app.terraform.io"
organization = "組織名"
workspaces {
name = "ワークスペース名"
}
}
}
如果在这种情况下尝试进行apply或destroy操作,将不再在本地创建状态文件,而是在Terraform Cloud上创建。
您可以在UI上确认当前状态和与上一次的差异。
参考资料
- Terraform Cloud