AWS認証情報をTerraform Cloudに渡さずtfstate置き場として使う方法

2023.03.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「Terraform CloudでAWSリソースをdeployはしなくてもいいけど、tfstate置き場として使いたいな」

tfstateの置き場に困ったことはありませんか?

Terraform Cloudにはstate管理機能があり、とても便利です。

  • state管理用(S3やDynamodb)のリソースを作成する必要がない
  • stateロック機能が標準でついている
  • 変更差分をTerraform Cloudのコンソールから確認できる

今回はTerraform Cloudをtfstate置き場としてだけ使う方法を紹介します。

この方法では、Terraform Cloud側にAWS認証情報を設定する必要はありません。 もちらん今まで通り、ローカルからTerraformコマンドを実行できます。

この機能はFreeプランでも使用することができます。

結論

Terraform CloudのWorkspaceの設定で実行モードをLocalにするだけです。

Terraform Cloudでは、terraform applyterraform planをどこで実行するかを設定することができます。

Localであれば、自分の端末上で実行されます。 そのため、自分の端末上にAWS等デプロイする対象の認証情報があれば実行できます。

Remoteは、Terraform Cloud上で実行されるため、Terraform Cloud上に認証情報を設定する必要があります。

Remoteにした場合でも、自分の端末上でterraformのコマンドを実行できますが、planやapplyの処理自体はTerraform Cloud上で行われます。 この際自分の端末上でコマンドの結果を確認できますが、Terraform Cloud上で実行した結果をストリーミングしているだけです。

ちなみに、Terraform Cloudの実行モードのデフォルトはRemoteです。

やってみる

サンプルコードの用意

任意のディレクトリにテスト用のサンプルコードを用意します。

$ touch main.tf backend.tf

main.tf(AWSリソース作成)

テスト用にCloudWatch ロググループを作成するコードです。

main.tf

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "4.58.0"
    }
  }
  required_version = "1.4.0"
}

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_cloudwatch_log_group" "tfstate_test" {
  name     = "tfstate_test"
}

backend.tf(tfstateの置き場所の定義)

backend.tf

terraform {
  cloud {
    organization = "<Organization名>"

    workspaces {
      name = "tfstate-tfc"
    }
  }
}

Organization名はTerraform Cloudのコンソールの赤枠の部分が該当します。

Terraform CloudにCLIでログイン

ローカルで以下のコマンドを実行して、Terraform Cloudにログインします。 (以前に実施したことがある場合は、この手順はスキップできます。)

Terraform will request an API token for app.terraform.io using your browser.

If login is successful, Terraform will store the token in plain text in
the following file for use by subsequent commands:
    /Users/sato.masaki/.terraform.d/credentials.tfrc.json

Do you want to proceed?
  Only 'yes' will be accepted to confirm.

  Enter a value: yes

ローカルにTerraform Cloudのクレデンシャルを作成するか聞かれる「yes」を入力すると、Terraform CloudのAPI token発行の画面に遷移します。 Create API tokenを選択して、tokenを作成します。

tokenが表示されるため、コピーして先程のコンソールに貼り付けます。

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/sato.masaki/.terraform.d/credentials.tfrc.json

Token for app.terraform.io:
  Enter a value: # Tokenを貼り付ける

Enterを押すとログインに成功した旨が表示されます。

tokenは~/.terraform.d/credentials.tfrc.jsonに保存されます。

Terraform Cloud Workspaceの作成

ファイルを用意したら、同じディレクトリで以下のコマンドを実行します。

$ terraform init
# 省略
Terraform Cloud has been successfully initialized!

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

If you ever set or change modules or Terraform Settings, run "terraform init"
again to reinitialize your working directory.

コマンド実行時にbackend.tfで指定していたWorkspace名でTerraform Cloud上に自動的にWorkspaceが作成されます。

Terraform Cloud Workspaceの実行モードをLocalに変更

Terraform Cloudのコンソール上で、Workspace名(今回はtfstate-test) -> Settings -> Generalの順に選択します。 Execution ModeLocalにして、Save settingsを選択します。

Terraformをローカルで実行する

AWS認証情報をローカルに設定したら、terraformコマンドが実行できます。 環境変数で認証情報を設定する方法を例として上げましたが、任意の方法を選択できます。

$ export AWS_ACCESS_KEY_ID=<アクセスキー>
$ export AWS_SECRET_ACCESS_KEY=<シークレットアクセスキー>
$ export AWS_SESSION_TOKEN=<セッショントークン>
$ terraform plan
$ terraform apply

Terraform Cloudでtfstateを確認

Terraform Cloud上でtfstateを確認してみましょう。

Terraform Cloudのコンソール上で、Workspace名(今回はtfstate-test) -> Stateを選択します。

tfstateの変更履歴を確認できます。 (変更履歴を出すために、初回apply後コードを変えてapplyしたため2つ出ています。手順通りにやった場合は、1つだけでます。)

任意のバージョンを選択すると、tfstateの中身を確認できます。

他にもこの画面からは、tfstateのダウロードや変更差分の確認ができます。

トラブルシューティング

Error: configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.

terraform initまではできたが、terraform planterraform apply時に以下のエラーがでて実行できない。 AWS認証情報をローカルに設定済み。

Error: configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.

Terraform Cloudに認証情報をセットしていない状態で、Terraform Cloud上でコマンドが実行される設定担っていると思います。

Terraform Cloudの実行モードがRemoteになっている可能性があります。 本記事の「Terraform Cloud Workspaceの実行モードをLocalに変更」を参考に実行モードをLocalに変更してください。

おわりに

Terraform Cloudをtfstate置き場として使う方法でした。

Terraform CloudにAWS認証情報を置く必要がないため、既存のデプロイフローは変えたくないけど、tfstateだけTerraform Cloudに置きたい場合に有効です。

また、ユーザー5人まで無料のFreeプランでもこの機能を使うことができます。

Terraform Cloudを使って組織でのTerraform運用を始める第一歩として、この機能を試すのも良いかもしれません。

以上、AWS事業本部の佐藤(@chari7311)でした。

あわせて読みたい記事

参考