ecspresso や ecschedule から Terraform Cloud の state を参照する方法

2023/07/11に公開
2

Terraform Cloud の state を参照したい!

ecspressoとecscheduleの便利な機能の一つに Terraform の state を参照するプラグイン(tfstate プラグイン)があります。

tfstate プラグインを利用すると、以下ののようなマスタッシュ構文で Terraform で管理しているリソースの設定値を参照することができます。

{{ tfstate `path.to.resource` }}

READMEに記載されているtfstateプラグインの利用例として、ローカルの path を指定する方法とS3 bucketのURLを指定する方法がありますが、Terraform Cloud で管理している state を参照する例がありません。 ( 自分が見つけきれていないだけかもしれません... )

ecspresso のコードを読むと内部的に tfstate-lookup を利用していることがわかりました。
https://github.com/fujiwara/tfstate-lookup

上記リポジトリを参照することで Terraform Cloud の場合の URL 指定方法を知ることができましたので記事にしてみました。

API Token を発行して環境変数 TFE_TOKEN に設定する

まず、 Terraform Cloud にアクセスするためには、あらかじめ API Token を発行して環境変数 TFE_TOKEN に設定しておく必要があります。

以下の PR にそのあたりの記述がありました。

https://github.com/fujiwara/tfstate-lookup/pull/30

API Token の作成方法についてはについては以下を参照してください。

https://developer.hashicorp.com/terraform/cloud-docs/users-teams-organizations/api-tokens

API Token の種類として、 User, Team, Organization がありますので、運用形態にあわせて選択すると良いと思います。

たとえば、私のチームでは Terraform Cloud で1つのチームが1つの Organization を利用しており、 Team という単位では別れていないため Organization token を作成しました。

環境変数が設定できたら、次に進みます。

ecspresso と ecschedule の設定

ecsoresso, ecschedule それぞれの設定例を示します。

Terraform Cloud 上の state を参照するURLは remote://app.terraform.io/{ORGANIZATION}/{WORKSPACE} の形式になります。

たとえば Organization foo の Workspace bar の state を参照する場合には ecspresso や ecschedule の config.yaml に以下のような設定を記述します。

config.yaml
plugins:
  - name: tfstate
    config:
      url: remote://app.terraform.io/foo/bar

設定はこれだけです。

実際にデプロイする前に ecspresso render や  ecschedule diff などを実行すると Terraform Cloud から state の値を読み取って設定が反映されることが確認できると思います。

さいごに

ecspresso や ecschedule のtfstateプラグインを利用してTerraformのstateを読み取ってリソースの設定値を参照できることは README を読んで理解していましたが、 Terraform Cloud で管理している場合の参照方法がやや分かりづらかったので記事として公開してみました。

この情報が誰かの参考となれば幸いです。

Discussion