Terraform Cloudでstate管理をする為に必要なあれこれ
レスキューナウエンジニアの坂本です。
現在自分のチームではインフラをTerraform Cloudで管理しているのですが、一度構築したワークスペースを分割する作業が必要となりました。
その際、tfファイルの修正だけではなく既存のワークスペースのstateや既に構築されているリソースのstateをやり繰りしなくてはならない状況となり、非常に覚える事が多かったためご紹介します。
今回の話は以下のポイントについてご紹介します。
- tfファイル上でのstate定義、参照方法
- Terraform Cloudでのstate状態の変更
tfファイル上でのstate定義、参照方法について
Terraformでリソースを扱う方法には主に3つのタイプがあります。
- resouce
- data
- 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が管理できない場合に使用されます。
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にアクセスするための準備
- バックエンド構成のTerraformにCloud 設定を追加する
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "your-org"
workspaces {
name = "your-workspase-name"
}
}
}
組織名やワークスペース名は適切なものに置き換えてください。
- Terraform Cloud へログイン
terraformコマンドでのログイン
$ terraform login
上記コマンドを実行後、ブラウザが立ち上がりアクセストークンの発行が始まります。
Terraform Cloud のアカウントがない場合は作成してください。
- 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