Terraform Cloud は AWS の credentials を持たせずに tfstate だけ管理することができる

こんにちは、岩城です。

Terraform Cloud を使って AWS 環境の tfstate だけを管理し、バージョン管理と差分確認のみに利用する方法を試してみました。備忘録として設定方法を残しておきます。

あわせて、先日弊社もこより Terraform Cloud のエントリが公開されていますのでご確認ください。

5人まで無料! Terraform Cloudを使ってみた

前提

本エントリは、以下については本筋ではないため、取り上げません。

  • ローカルでの Terraform 実行環境の構築が済んでいること
  • Terraform Cloud のアカウント登録が済んでいること

やってみた

Organization と Workspace を作成する

Terraform Cloud に初めてログインした体で進めていきます。まずは、Organization を作成します。

Organization 名と連絡先メールアドレスを指定します。なお、Organization は、S3 のバケット名のように全世界で一意の名前である必要があります。

今回は、GitHub 等と連携しないので skip します。

Workspace 名を指定します。Workspace は、全世界で一意の名前である必要はありません。

iwaki-testという名前の Organization にexampleという名前の Workspace が作成できました。

Workspace を設定する

Workspace のSettingsからGeneralを選択します。

Execution ModeLocalにします。Local に設定することでterraform planterraform applyなど、実際に AWS を操作するアクションは自身の端末から行い、tfstate だけ Terraform Cloud 上で管理することができます。
ここでRemoteにすると Terraform Cloud から AWS を操作するため、アクセスキーやシークレットアクセスキーといった credentials を登録が必要になります。

User Settings から Token を発行する

CLI から Terraform Cloud に接続する際に必要となる Token を発行します。
画面上右上のStatusからUser Settingsをクリックします。

Token の名前を入力し、Generate tokenをクリックすると Token が発行されます。 この画面から離れると Token を確認することができなくなりますので、コピーもしくはダウンロードしておきます。

ローカルで Terraform の構成ファイルを設定する

本エントリでは、以下のようなディレクトリ構成で試しています。構成ファイルを簡単に説明しながら設定していきます。

$HOME /
    ├ .terraformrc
    └ work /
        └ terraform /
            └ iwaki-test /
                └ example /
                    ├ main.tf
                    └ remote-state.tf

.terraformrc

Terraform Cloud に CLI で接続する際に必要となる Token を記載します。一点注意が必要なのは、$HOME以下に配置する必要がある点です。環境変数TF_CLI_CONFIG_FILEを使ってファイル名(例:.terraformrc_test)を変更することはできますが、$HOME以外には配置して利用することはできないようです。

CLI Configuration File (.terraformrc or terraform.rc)

発行した Token をコピー & ペーストします。

credentials "app.terraform.io" {
  token = "<ココにペースト>"
}

remote-state.tf

Terraform Cloud で作成した Organization と Workspace を指定します。

terraform {
  backend "remote" {
    organization = "iwaki-test"

    workspaces {
      name = "example"
    }
  }
}

main.tf

Terraform Cloud 上で tfstate を管理できることを確認したいので、2019/10/03 時点で最新の Amazon Linux 2 の AMI でインスタンスを 1 台だけ デフォルトVPC 上に作成します。

resource "aws_instance" "example" {
  ami           = "ami-0ff21806645c5e492"
  instance_type = "t2.micro"
}

terraform init する

example ディレクトリ配下でterraform initを実行します。設定が正しく Terraform Cloud にアクセスできれば以下のような内容が出力されます。

$ terraform init

Initializing the backend...

Initializing provider plugins...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.aws: version = "~> 2.30"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

ちなみに、Token が間違っていたり、.terraformrc$HOME配下になかったりすると以下のような出力があり失敗します。

$HOME 配下に .terraformrc がない場合

$ terraform init

Initializing the backend...

Error: Required token could not be found

Make sure you configured a credentials block for app.terraform.io in your CLI
Config File.

.terraformrc の Token が間違っている場合

$ terraform init

Initializing the backend...

Error: Failed to read organization entitlements

  on remote-state.tf line 3, in terraform:
   3:     organization = "iwaki-test"

The "remote" backend encountered an unexpected error while reading the
organization settings: unauthorized.

Terraform Cloud で tfstate を確認する

それでは、terraform applyして tfstate を作成します。

### apply前に構文が正しいか確認
$ terraform plan
### planで問題なければapply
$ terraform apply

正常に apply されれば、Terraform Cloud 上で tfstate を確認できるようになります。 tfstate の差分確認もしてみたいので、先程作成したインスタンスにタグを追加します。

resource "aws_instance" "example" {
  ami           = "ami-0ff21806645c5e492"
  instance_type = "t3.micro"
  tags = {
    Name = "HelloWorld"
  }
}

再度terraform apply した結果がこちら。 2 回 apply しているので、tfstate の履歴も 2 つあります。

最新の状態を確認すると、現在の tfstate の内容と前回から変更が有った差分を確認することができます。

タグが追加されたことが分かります。

おわりに

Terraform Cloud で tfstate だけを管理する方法を紹介しました。比較的簡単に設定することができ、すぐに利用することができました。個人的にしばらく使ってみようと思いましたので、使い続けた感想を書く機会があればブログにしたいと思います。

本エントリがどなたかの役に立てれば幸いです。