Terraformの状態(state)をローカルではなくリモートで管理する方法:「AWS」×「Terraform」で学ぶクラウド時代のインフラ管理入門(8)
インフラ自動化ツールの一つである「Terraform」について、これから学ぼうという方、使っていきたい方を対象に、Terraformの導入方法や基本的な使い方を紹介していく本連載。今回は、Terraformの状態(state)をローカルではなくリモートで管理する方法を紹介します。
インフラ自動化ツールの一つである「Terraform」について、Terraformの導入方法や基本的な使い方を紹介していく本連載。前回は、既存のAWS(Amazon Web Services)リソースをTerraformの管理下に置く(インポートする)方法を紹介しました。
Terraformは、管理しているクラウドリソースに関する情報を「状態(state)」というもので記録しています。これまでTerraformを実行した際にterraform.tfstateというファイルが作成されているのを見たことがある人もいるでしょう。stateの実態はこのファイルです。
Terraformは、管理しているクラウドリソースの情報をstateに記録しておき、クラウドリソースの状態とstateを比較して、変更の要否を判断しています。つまり、このstateがなければクラウドリソースを正しく管理できなくなります。通常はローカルにファイルとしてstateが置かれますが、複数人で管理することが難しいですし、データの破損や紛失の心配もあります。
今回はこのstateをリモートで管理する方法を紹介します。
stateをリモートで管理するには
Terraformで利用できるstateの格納先(格納方法)は、本記事の執筆時点で以下の10種類です(参考元)。
- ローカル
- Azure Storage
- Consul KV Store
- Tencent Cloud Object Storage
- Google Cloud Storage
- HTTP (REST)
- Kubernetes secret
- Alibaba Cloud OSS
- PostgreSQL
- Amazon Simple Storage Service(Amazon S3)
これらの10種類の中からstateの格納先を選択するわけですが、複数人で管理することが前提なら、ローカルは避けましょう。前述の通り、破損や紛失の心配もありますし、仮に「Git」などを使って共有していたとしても、常に最新状態を維持する必要があるためです。複数人でTerraformを実行する場合には、その実行タイミングによってはstateの内容でコンフリクトが生じる可能性もあります。
ローカル以外のリモートで管理する設定を選ぶことで、Terraformによってクラウドリソースが変更されるたびに自動で最新のstateがリモート上に保存されるので、複数人でTerraformを実行する際のstateのコンフリクトは発生しづらくなります。
今回は、Amazon S3にstateを格納する方法を解説します。
Amazon S3を利用してリモートでstateを管理する
Amazon S3上にstateを保存する場合、stateを保存するためのS3バケットを事前に作成する必要があります。AWSの管理コンソールからAmazon S3の管理画面を開き、新しくS3バケットを作成します。今回は例としてバケット名を「terraform-state.sios.jp」にしていますが、バケット名はグローバル名前空間で一意である必要がありますので、ここは好きな名前に置き換えてください。
S3バケットが作成できたら、次はTerraform側でこのS3バケットをstateの格納先に設定しましょう。第1回で設定したTerraform コードであるterraformブロック内に、backendという新しい設定を追記します。
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" } backend "s3" { bucket = "terraform-state.sios.jp" region = "ap-northeast-1" key = "example.tfstate" } } }
設定できたら、terraform initコマンドを実行します。ローカルに保存していた既存のstateを、今回設定したAmazon S3上にコピーするかどうかを聞いてきますので、「yes」と答えましょう。すると、既存の情報を維持したままAmazon S3上でstateを管理できるようになります。
$ terraform init Initializing the backend... Do you want to copy existing state to the new backend? Pre-existing state was found while migrating the previous "local" backend to the newly configured "s3" backend. No existing state was found in the newly configured "s3" backend. Do you want to copy this state to the new "s3" backend? Enter "yes" to copy and "no" to start with an empty state. Enter a value: yes Successfully configured the backend "s3"! Terraform will automatically use this backend unless the backend configuration changes. Initializing provider plugins... - Reusing previous version of hashicorp/aws from the dependency lock file - Using previously-installed hashicorp/aws v4.67.0 Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.
正常にstateをAmazon S3で管理できるようになったかどうかを確認してみます。AWSの管理コンソールから、今回作成したS3バケットの中身を見てみると、「example.tfstate」というファイルが作成されていることが確認できます。
これでstateをリモートで管理する状態になったはずです。試しに、ローカルに残っている「terraform.tfstate」ファイルを削除した上で、terraform planコマンドを実行してリソースの状況に変化がないかどうかを確認してみます。
$ rm -f terraform.tfstate $ terraform plan aws_instance.test: Refreshing state... [id=i-xxxxxxxxxxxxxxxxx] No changes. Your infrastructure matches the configuration. Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.
ローカルのstateファイルを削除しても、新しくインスタンスを作成するような動作にならないため、正しくリモートでstateを管理できていることが分かります。
stateをリモート管理することで複数人での管理にも適したTerraform環境にできるため、チームでの運用時にも活用できます。ぜひ試してみてください。
筆者紹介
鎌田啓佑
サイオステクノロジー所属。OSS よろず相談室でサポート対応をしているテクニカルサポートエンジニア。Ansibleに出会ってから自動化に取りつかれ、自身の業務やプライベートであらゆるものの自動化に取り組む。プライベートではJavaでちょっとしたツールの開発を趣味にしている。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Terraformで複数のAWS EC2インスタンスを作成、管理する方法
自動化ツールの一つである「Terraform」について、これから学ぼうという人、使っていきたい人に向けて基本的な使い方を紹介していきます。第3回は同じような構成のEC2インスタンスを複数作成、管理する方法について。 - 「ダブルチェックを頑張る」でごまかさない、スクウェア・エニックスのサーバ設定漏れ防止策
スクウェア・エニックスは膨大な数のゲームを提供している。当然、それらを支えるインフラも大量で、運用管理にかかる手間も大きい。「Cloud Operator Days Tokyo 2023」のセミナーを基に、大量サーバの最適な管理法を紹介する。 - 設定ミスの社外秘情報はググれます――サイバー攻撃者はどうやってクラウドを墜とすのか?
2024年2月28日、アイティメディアが主催するセミナー「ITmedia Security Week 2024 冬」における「クラウドセキュリティ」ゾーンで、多摩大学 ルール形成戦略研究所 客員教授 西尾素己氏が「攻撃者はいかにしてクラウドを堕(お)とすのか 今知るべき攻撃のトレンド」と題した講演に登壇した。以前はランサムウェアをテーマとして、世界情勢に合わせて講演したが、今回は“クラウド”の現状を、西尾氏の視点で語るセッションとなった。