[登壇レポート]「Terraformあれやこれ」という内容で登壇してきました #jawsug_asa #jawsug

仕事で Terraform を使うことになり、勉強中に奮闘した内容をまとめています。Terraform を使ったことがない方、使い始めたばかりの方に参考にしていただけると嬉しいです。
2024.04.21

コーヒーが好きな emi です。

JAWS-UG朝会 #56 で「Terraformあれやこれ」というタイトルで 20 分登壇してきました。
仕事で Terraform を使うことになり、勉強中に奮闘した内容をまとめています。Terraform を使ったことがない方、使い始めたばかりの方に参考にしていただけると嬉しいです。

登壇資料

発表のダイジェスト

当日は 60 ~ 70 名程度の方が視聴くださいました。はじめに普段一番よく利用する IaC ツールを伺ったところ、

  • CloudFormation
  • CDK
  • Serverless Framework

を使われる方が多く、あまり Terraform を使っている方はいらっしゃらなかったようです。

ちなみに JAWS DAYS 2024「ぼくのかんがえたさいきょうのAWSへのリソースデプロイ」というセッションでは、CloudFormation に次いで Terraform が 2 位でした。

Terraform は HashiCorp 社が提供する IaC ツールで、様々なプロバイダーのリソースを HCL という独自の言語で書かれたソースコードで管理でき、バージョン管理、再利用、共有などが可能です。
プロバイダーとしては

  • AWS
  • Azure
  • Google Cloud
  • Kubernetes
  • Alibaba Cloud
  • Olacle Cloud
  • Docker
  • Cloudflare
  • akamai



などなど、実に様々なプロバイダーのリソースをコード管理することが可能です。サポートされるプロバイダーの一覧は以下公式サイトを参照ください。

以下、Terraform を使って AWS リソースを作成するまでの概要です。

  • Terraform では terraform コマンドを使って環境のセットアップやリソースのデプロイをおこなうため、terraform をインストールして開発環境を整える必要がある
  • Terraform から AWS の API を叩きに行く際に AWS CLI を利用するため、AWS CLI をセットアップする必要がある

CloudFormation ではこういった開発環境の整備は不要なので、CloudFormation とは大きく異なる点ですね。手元の端末に開発環境を整えてもいいですし、Cloud9 を使って開発環境を整えても良いと思います。

また、Terraform は直接 API を叩きに行ってリソースを作成するので、裏で CloudFormation が動きません。CDK や SAM では裏で CloudFormation スタックが作成されますが、Terraform では作成されないところも大きな特徴です。

Terraform コードの中身の概要です。

  • Terraform の設定
    • Terraform 実行時は一番最初に terraform ブロックを読み込みます。Terraform の世界では {} で囲まれた部分を「ブロック」と呼びます。
    • ここで Terraform のバージョンやプロバイダーのバージョンを指定できます。
    • コードに記載されている内容と実際に作成されるリソースの整合性を確認するために tfstate ファイルという状態ファイルを保持するのですが、この状態ファイルの保存先もここで指定します。
  • プロバイダーの設定
    • プロバイダーの設定をします。AWS の場合はここでリージョンや AWS CLI で使用するプロファイルの種類などを指定できます。
    • 資料では記載しませんでしたが、alias という設定で、同じプロバイダーに対して複数の構成を定義したり、リソースごとまたはモジュールごとにどれを使用するかを選択できるようにしたりできます。
    • Provider Configuration - Configuration Language | Terraform | HashiCorp Developer
  • リソースの作成
    • 実際に作成するリソースを定義する場所です。

ソースコードができたら、terraform コマンドでリソースを作成します。以下のコマンドが主によく使うコマンドです。

他にも以下のコマンドはよく使います。

  • terraform fmt
    • コードのインデントなどを整理して一貫したフォーマットにします。
  • terraform validate
    • 構文的に正しいかどうか検証します。また、設定されたリソース、モジュール、変数などが適切に設定されているかどうかもチェックします。
  • terraform console
    • 対話型のコンソールを起動し、モジュールから渡される内容の状態や値を確認します。

続いて私が Terraform を始めたばかりのころに理解に時間がかかった点です。
Terraform では作成するリソースを定義する際「リソース名」という部分を設定する必要があります。

これは CloudFormation で言うと「論理 ID」にあたります。
リソース - AWS CloudFormation

ノルウェーのエンジニアの方が主導で提供しているコミュニティのドキュメント Naming conventions | English | Terraform Best Practices に分かりやすく記載されています。

リソース名の主な目的は、同じタイプのリソースを複数作成する際に一意に区別できるようにすることです。
同じタイプのリソースが一つしかない場合や適切な名称が無い場合は this を使うと良いそうです。

他にも、リソース名ではリソースタイプを繰り返すべきではない、などの記載もありました。

また、リソースに着けるプレフィックスなど、複数リソースで使用する値は variable を使って変数にすることで使いまわしができるようになります。

リソースごとにモジュールを作成し、1 つモジュールを作成すれば複数の環境からモジュールを呼び出して同じ構成のリソースを作成することができます。

モジュールについては以下のブログが大変分かりやすいので参考にしてください。

最後に、2024/3/30 に Terraform 公式ドキュメントに追加されたスタイルガイドについて触れました。Terraform は書く人によってスタイルがばらけがちなので、統一したルールがあると複数名で開発する際に品質がそろってよいです。

終わりに

Terraform のほんの一部について紹介しました。まだまだ Terraform は奥が深く、書き方もそうですし、CI/CD パイプラインなどを組み合わせた管理・運用方法なども学習が必要です。
Terraform について雰囲気だけでも伝わったら嬉しいです。

参考