【terraform】terraform_remote_stateで外部のstateファイルを参照する

## ユースケース
- `terraform workspace` の切り替えなどのstateファイルが分かれているケースで、別のworkspace(stateファイル)からそのworkspaceのリソース情報を参照したい時などに `terraform_rempte_state` dataリソースが活用できます
- 本ページではGCP BigqueryのView情報を別workspaceから参照するケースで手順記載しています

## 環境
- terraform version 1.0.3
- state file backend -> GCS (GCP)
- Linux 3.10.0-1160.66.1.el7.x86_64 (GCE instance)

## 構成
- terraform workspace -> prd(本番環境) に切り替えている時に、stg(ステージング)のリソース情報を読み込みたい場合
- terraform適用作業は GCP の GCE instance で実施
- stateファイルの格納先(Backend)はリモート(GCS)
![スクリーンショット 2022-06-17 12.00.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585613/80266ec3-0285-e16e-6e75-433f29a7ac2e.png)

## 手順
(1) terraform workspace stg側で、prodから参照させたいリソース情報(value)をoutputさせます
```terraform
output "project_id" {
  value = "${google_bigquery_table.billing_view[0].project}"
}
output "table_id" {
  value = "${google_bigquery_table.billing_view[0].table_id}"
}
output "dataset_id" {
  value = "${google_bigquery_dataset.billing[0].dataset_id}"
}
```
→上記でterraform apply　(stg)

(2) terraform workspace prd側で、(1)でoutputさせたstgのリソース情報を、`terraform_remote_state` dataリソースを用いて prd stateファイルにスナップショットします
```terraform
data "terraform_remote_state" "billing" {
  backend = "gcs"
  workspace = "stg"
  config  = {
    bucket  = "test-backend"
    prefix  = "state/bigquery"
  }
}
```
→上記でterraform apply (prd)

以下のように prd.tfstate に stgのリソース情報(outputs)が記録されます
```json
{
  "version": 4,
  "terraform_version": "1.0.3",
  "serial": 70,
  "lineage": "***",
    ,
    {
      "mode": "data",
      "type": "terraform_remote_state",
      "name": "billing",
      "provider": "provider[\"terraform.io/builtin/terraform\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "backend": "gcs",
            "config": {
              "value": {
                "bucket": "test-backend",
                "prefix": "state/bigquery"
              },
              "type": [
                "object",
                {
                  "bucket": "string",
                  "prefix": "string"
                }
              ]
            },
            "defaults": null,
            "outputs": {
              "value": {
                "dataset_id": "billing",
                "project_id": "test-project",
                "table_id": "billing_view"
              },
              "type": [
                "object",
                {
                  "dataset_id": "string",
                  "project_id": "string",
                  "table_id": "string"
                }
              ]
            },
            "workspace": "stg"
          },
          "sensitive_attributes": []
        }
      ]
    },
```

(3) 取得したstgリソース情報(terraform_remote_state)をprd側のterraformリソースで利用します

以下では `google_bigquery_dataset_access` terraformリソース view blockの定義に stgの`project_id`、`dataset_id`、`table_id`情報(value)を取得しています
```
resource "google_bigquery_dataset_access" "billing_access" {
  count         = local.count.billing_access[terraform.workspace]
  dataset_id    = google_bigquery_dataset.billing[0].dataset_id
  view {
    project_id = "${data.terraform_remote_state.billing.outputs.project_id}"
    dataset_id = "${data.terraform_remote_state.billing.outputs.dataset_id}"
    table_id   = "${data.terraform_remote_state.billing.outputs.table_id}"
  }
}
```
→上記でterraform apply (prd)

:::note info
value取得時のフォーマット `Terraform >= 0.12`

`data.terraform_remote_state.(terraform_remote_stateで定義時のリソース名).outputs.(outputの指定したリソース名)`

※ `Terraform <= 0.11`では`.outputs`は必要無い(公式Doc参照)
:::

以上

## 参考URL
- (公式) https://www.terraform.io/language/state/remote-state-data