ecspresso用ディレクトリからterraformリソース一覧を参照する

2024/01/03に公開

ecspresso用ディレクトリからリソース一覧を参照したい

ecspressoやlambrollでリソースをtfstateから参照したい。ecspressoであれば tfstate pluginを利用し、{{ tfstate "resource_type.resource_name.attr" }} のような形で記述すればよい。lambrollもほぼ同様。

https://github.com/kayac/ecspresso#tfstate

実際に resource_type.resource_name.attr のようなリソースアドレスを記述する上では、tfstate上のリソース一覧やリソース詳細を確認したい。対象リソースが定義されたterraformディレクトリであれば、単にterraform state listなどを実行すればよい。

https://developer.hashicorp.com/terraform/cli/commands/state/list

$ terraform state list
aws_instance.foo
aws_instance.bar[0]
aws_instance.bar[1]
module.elb.aws_elb.main

リソース詳細が確認したいのであれば terraform state showを実行すればよい。

https://developer.hashicorp.com/terraform/cli/commands/state/show

$ terraform state show 'packet_device.worker'
# packet_device.worker:
resource "packet_device" "worker" {
    billing_cycle = "hourly"
    created       = "2015-12-17T00:06:56Z"
    facility      = "ewr1"
    hostname      = "prod-xyz01"
    id            = "6015bg2b-b8c4-4925-aad2-f0671d5d3b13"
    locked        = false
}

しかし、ecspressoなどを実行するアプリケーション用ディレクトリではterraformのコードが格納されていないので上記の方法が利用できない(インフラを制御するterraformコードとアプリを制御するecspressoコードは別リポジトリまたは別ディレクトリに分離されている想定)。
terraform state list も terraform state show も -state オプションが存在するが、これはローカルのterraform.tfstateファイルを指定して参照するためのもので、terraform.tfstateファイルが存在しないecspresso用ディレクトリでは利用できない。terraform init実行済であればTerraform CloudやS3などのRemote Stateを参照できるが、terraformのコードがない状況ではterraform initも実行しておらずRemote State参照できない。
このため、リソースアドレスを記述するためには .tfファイルを格納しているterraform用ディレクトリに移動して操作しないといけない。これは面倒なのでなにか良い方法でリソース一覧を取得したい。

ecspresso用ディレクトリでもterraform initを実行する

Remote Stateを参照するにはterraform init実行済でないと対処できないので、ecspresso用ディレクトリにおいてもterraform initを実行してあげればよい。
terraform initを実行するだけなら、Terraform SettingsとしてBackend Configurationだけ記述すればよい。例えばTerraform Cloudなら以下の通り。S3などのbackendを利用している場合も同様。

https://developer.hashicorp.com/terraform/language/settings/terraform-cloud

terraform {
  cloud {
    organization = "example_corp"

    workspaces {
      tags = ["app"]
    }
  }
}

terraform用ディレクトリであれば Provider RequirementsProvider Configurationなども合わせてTerraform Settingsに記述する必要がある。しかし、ecspresso用ディレクトリから単にterraform initおよびterraform state list/show を実行するだけならこれらの設定は不要。
このためecspresso用ディレクトリにTerraform Settings用のファイルを格納しておいても、terraform providerのアップデートに合わせて修正する必要はない。

まとめ

  • ecspressoなどでtfstateのリソースアドレスを記述する上でtfstate上のリソース一覧を取得したい
  • terraform initおよびterraform state listを実行するために必要最小限のTerraform Settingsを記述した.tfファイルをecspresso用ディレクトリに格納しておけばよい
  • provider関連の記述は不要なので.tfファイルのメンテナンス不要で利用できる

Discussion