はじめに
こんにちは!TechBull 運営チームの富田(@Cooking_ENG )です!SREとして働く中、業務でTerraformを使ってAWSのリソースを作成したり、DataDogの設定を行ったりする機会が増えてきたので、アウトプットとして、Terraformの入門をブログにまとめたいと思います。
Terraformとは
Terraform は、HashiCorp社が開発したオープンソースの IaC(インフラ構成の管理ツール) です。.tfファイルを使ってインフラをコードを定義し、プロバイダーというクラウドサービスと連携する仕組みを使って、クラウドリソース(AWS・GCP・Azureなど)を自動的に作成・変更・削除することができます。
IaC (Infrastructure as Code)
IaCとは、Infrastructure as Code の略です。
これまで手作業やGUIを使って構築していたサーバーやネットワークなどのインフラ構成を、コードで定義して管理する考え方が主流となっているのが IaC(Infrastructure as Code)の特徴です。
IaCを用いてインフラを管理することで、次のようなメリットがあります。
再現性の向上
コード化して設定を管理するので、環境が変わっても同じコードを使用することで、同じインフラ環境を構築がしやすくなります。
自動化によるヒューマンエラー防止
IaCを導入すると、自動化によって手動で行う作業が少なくなり、設定、運用のミスを減らすことができ、ヒューマンエラーを防止することができます。
コードレビュー
コードを使ってインフラ構成を管理するので、アプリケーション開発同様、GitHubを使ってチームの方にレビュー依頼をすることができます。レビューを使ってチームで認識を揃えることでより安全性の高い環境を構築することができます。
また、個人的にはGUIでは見えにくかった、環境の全体像がコードによって把握しやすくなっていることもIaCを使うメリットだと思います。
TerraformはこのIaCの代表的なツールであり、「設定ファイル(.tf)」にリソース定義を書くことで、環境を一貫して管理することができます。
- s3_bucket.tf
|
1 2 3 4 |
resource "aws_s3_bucket" "example" { bucket = "my-example-bucket" acl = "private" } |
※例:Terraformを使ったAWS S3のリソースを作成するソースコード
Terraformの基本コマンド
Terraformを使う上で、最初に覚えておきたい基本コマンドを紹介します。
terraform init
terraformを使用する前に、プロバイダーやモジュールをダウンロードして準備するコマンドです。(初期化コマンド)
実行後、.terraformディレクトリが作成され、プラグインやモジュールの内容がこのディレクトリに格納されて使用できるようになります。
terraform plan
コードの変更によってどのようなインフラ変更が発生するかを確認するコマンドです。
実際にリソースを作成・変更・削除する前に、影響範囲を安全にチェックできます。
※実行例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
$ terraform plan Terraform will perform the following actions: # airbyte_connection.googlesheets_teradata will be created + resource "airbyte_connection" "googlesheets_teradata" { + configuration = (known after apply) + connections = (known after apply) + data_residency = "auto" + destination_id = "Google Sheets - Teradata" + name = "Google Sheets - Teradata" + namespace_definition = "destination" + namespace_format = (known after apply) + non_breaking_schema_updates_behavior = "ignore" + prefix = (known after apply) + schedule = { + basic_timing = (known after apply) + cron_expression = "0 15 * * ?" + schedule_type = "cron" } + source_id = (known after apply) + status = (known after apply) + workspace_id = (known after apply) } # airbyte_destination_teradata.my_destination_teradata will be created + resource "airbyte_destination_teradata" "my_destination_teradata" { + configuration = { + host = "terraform-y49lltwbbealsvoq.env.clearscape.teradata.com" + password = (sensitive value) + schema = "airbyte_td_two" + ssl = false + ssl_mode = {} + allow = {} + username = "demo_user" } + destination_id = (known after apply) + destination_type = "known after apply" } Plan: 2 to add, 0 to change, 0 to destroy. |
-
+:新しく作成されるリソース -
~:変更が加えられるリソース -
-:削除されるリソース
terraform apply
定義したリソースを実際にクラウド上へ反映するコマンドです。Terraformが差分をもとにリソースを作成・変更・削除します。
ローカルからもクラウドに反映はできますが、チーム開発ではGitHubActionsなどのCI/CDを使ってApplyをする方法もあります。
terraform destroy
Terraformで管理しているリソースをすべて削除するコマンドです。検証環境や一時的に作成したリソースをクリーンアップするときに使用します。
実行前に terraform plan のような確認が入るため、削除対象をしっかり確認してからコマンドを実行することをおすすめします。
terraform fmt
Terraformのコード(.tfファイル)を自動的に整形し、全体のコードスタイルを統一してくれるコマンドです。
整形されるのはインデントやスペースのみで機能的な変更は行われません。CI/CDの一環で、Terraformのlintを確認するのが一般的なので、プルリクエストを作成する前に実行することを意識しておくといいと思います。
tfstateファイル
Terraformは、作成したインフラの状態をterraform.tfstateというファイルに保存します。
このファイルには、Terraformが「今、どんな環境で何がデプロイされているのか」を認識するための非常に重要なデータが書かれています。
tfstateの主な役割
コードと実際のインフラの比較
コード上で定義してある内容とクラウド上の状態を照らし合わせ、差分を把握します。
変更差分の計算terraform plan や terraform apply の際に、どのリソースを作成・変更・削除するかを判断します。
破壊的変更の防止
状態を正確に管理することで、意図しないリソース削除や設定変更を防ぎます。
チームでTerraformを使う場合は、HCP Terraformなどのリモート環境でtfstateファイルを保存・管理するとチームが同じ状態を参照することができるので安全に開発ができると思います。
※HCP TerraformとはTerraformの状態管理と実行をクラウド上で安全かつ便利に行えるサービスです。
まとめ
触ってみたかったTerraformを業務で触ることでできて、より便利さを実感することができました。
個人的には、これまでAWSなどのリソースを確認する際、マネージドコンソールだけではインフラ構成の全体像が把握しにくかったのですが、TerraformをはじめとするIaCを導入することで、インフラの全体像をより高い解像度で把握できる点が大きな利点だと感じています。
まだまだわからないことが多いですが、SREとしてまずはTerraformを抑えてインフラの構築、運用がしっかりできるように成長していきたいと思います。

約7年間、和食料理人として働き、コロナ禍をきっかけにエンジニアへとキャリアチェンジする。現在はRuby on Railsを中心にバックエンド開発を担当し、ReactやTypeScriptを使ったフロントエンド開発にも取り組んでいる。以前はプログラミングスクールを運営する会社で、エンジニア講師として未経験の方の学習支援を行う。TechBullに出会えたことで、今後はSREになるために技術のキャッチアップや運営チームとして活動。
