【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}]'
スクリーンショット 2020-06-21 15.49.02.png

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}' # 念のため最低値を設定しておく
スクリーンショット 2020-06-21 16.54.51.png

3. 后端设置

为了将状态文件存储在上述创建的存储桶中,我们将实施一项操作来设置这一配置。在存在tf文件的目录中,我们将创建一个新的backend.tf文件。

terraform {
  backend s3 {
    bucket         = "1で作成したバケット名"
    key            = "terraform.tfstate"
    dynamodb_table = "2で作成したテーブル名"
    region         = "ap-northeast-1"
    encrypt        = true
  }
}
スクリーンショット 2020-06-21 16.59.47.png

使用 Terraform Cloud

看起来也有与Github和GitLab集成以执行计划和应用的功能,但本次示例仅限于用于共享管理状态文件的目的。
我觉得在用户界面上能够查看变更内容(历史)非常出色。

1. 注册账号

请点击 Terraform Cloud 上的“注册Cloud”按钮来创建一个账号。所需信息仅需要一个电子邮件地址。需要创建的内容包括账号、组织和工作区这三个项。

2. 工作空间设置

为了仅限于共享管理状态文件,执行以下设置。

    実行モードをLocalに
スクリーンショット 2020-06-21 6.05.20.png
    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上确认当前状态和与上一次的差异。

スクリーンショット 2020-06-21 6.19.26.png

参考资料

    Terraform Cloud
通过设置环境变量TF_CLI_CONFIG_FILE,可以引用已放置在任意位置的credential文件。credential文件以以下格式保存令牌。
广告
将在 10 秒后关闭
bannerAds