Terraform Cloud は AWS の credentials を持たせずに tfstate だけ管理することができる
こんにちは、岩城です。
Terraform Cloud を使って AWS 環境の tfstate だけを管理し、バージョン管理と差分確認のみに利用する方法を試してみました。備忘録として設定方法を残しておきます。
あわせて、先日弊社もこより 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 Mode
をLocal
にします。Local
に設定することでterraform plan
やterraform 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 だけを管理する方法を紹介しました。比較的簡単に設定することができ、すぐに利用することができました。個人的にしばらく使ってみようと思いましたので、使い続けた感想を書く機会があればブログにしたいと思います。
本エントリがどなたかの役に立てれば幸いです。