🎃

Terraform Cloudでstate管理をする為に必要なあれこれ

2023/10/23に公開

レスキューナウエンジニアの坂本です。
現在自分のチームではインフラをTerraform Cloudで管理しているのですが、一度構築したワークスペースを分割する作業が必要となりました。
その際、tfファイルの修正だけではなく既存のワークスペースのstateや既に構築されているリソースのstateをやり繰りしなくてはならない状況となり、非常に覚える事が多かったためご紹介します。

今回の話は以下のポイントについてご紹介します。

  1. tfファイル上でのstate定義、参照方法
  2. Terraform Cloudでのstate状態の変更

tfファイル上でのstate定義、参照方法について

Terraformでリソースを扱う方法には主に3つのタイプがあります。

  1. resouce
  2. data
  3. webリクエスト参照(プロバイダ提供の参照方法)

1. resouce

作成と管理: resourceブロックは、実際にクラウドリソースを作成および管理します。

所有権: 作成されたリソースはTerraformによって所有し、Terraformのステートファイル(.tfstate)に保存されます。

ライフサイクル: resourceはterraform applyで作成、更新、または削除されます。

一般的にTerraformを使用してインフラを構築する際に使用するものになります。

resource "aws_s3_bucket" "my_bucket" {
  bucket = "my-bucket"
  acl    = "private"
}

2. data

参照のみ: dataブロックは、既存のリソースを参照しますが、そのリソースを作成、更新、または削除しません。
所有権なし: dataによって参照されたリソースはTerraformに所有されません。そのためstateファイルに保存されません。
リードオンリー: 主に読み取り専用で、リソースの属性にアクセスするために使用されます。

data "aws_ami" "example" {
  most_recent = true
  owners      = ["self"]
}

3. httpリクエスト(プロバイダ提供の参照方法)

外部データの取得: httpリクエストは特定のHTTPエンドポイントからデータを取得するためのものです。
所有権なし、作成なし、定義なし: Terraformによって所有されません、リソースを作成するわけでもありません。参照権の有無もplanで確認しません。内部定義も必要ありません。
一時的なデータ: 主に設定データや一時的なデータを取得するのに使用されます。参照IDが管理できない場合に使用されます。

EC2から参照するサンプル
resource "aws_instance" "example" {
  ami           = "ami-sumple"
  instance_type = "t2.micro"
  provisioner "remote-exec" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get install -y curl",
      "curl 'https://s3.amazonaws.com/your-bucket-name?list-type=2'"
    ]
  }
}

***"curl 'https://s3.amazonaws.com/your-bucket-name?list-type=2'"***の部分が参照記述になります。

Terraform Cloudでのstate状態の変更について

Terraform Cloud上で管理しているリソースのstate 状態はよくあるクラウドプロバイダのように直接webコンソールから操作することができません。
そこで一度ローカルに移して操作、反映するといった流れになります。
イメージとしてはgithubのlocalとremoteに近いものとなります。(最近は結構web上で修正やコミットができてしましますが💦)

localからTerraform Cloudにアクセスするための準備

  1. バックエンド構成のTerraformにCloud 設定を追加する
main.tf
terraform {
  backend "remote" {
    hostname = "app.terraform.io"
    organization = "your-org"

    workspaces {
      name = "your-workspase-name"
    }
  }
}

組織名やワークスペース名は適切なものに置き換えてください。

  1. Terraform Cloud へログイン
    terraformコマンドでのログイン
$ terraform login

上記コマンドを実行後、ブラウザが立ち上がりアクセストークンの発行が始まります。
Terraform Cloud のアカウントがない場合は作成してください。

  1. terraformのステート状況を取得する
$ terraform init

通常、ローカル環境のみで実行する場合は空のstateファイルが作成されますが、バックエンドにcloudやremoteを指定している場合は指定先からstateファイルの取得を行います。
上記の手順でstateのcloudとlocalの連携準備は完了となります。

terraform stateコマンド紹介

ここからはterraform stateコマンドを使用してTerraform Cloud 上のstateを操作することができます。

基本的にはローカルでstateファイルを修正する際のコマンド、挙動と同じですが、影響はTerraform cloudに出ます。
リソース種別やリソース名、リソースIDはterraform state listやTerraform Cloud 管理画面から確認することができます。

リソースを追加する場合

$ terraform state import {リソース種別}.{リソース名} {リソースID}

リソースを削除する場合

$ terraform state remove {リソース種別}.{リソース名}

cloud上のstateを再度取得する場合

$ terraform state pull

cloud上にlocalのstateを反映する場合

$ terraform state push
レスキューナウテックブログ

Discussion