Terraform とは
Terraform は、Azure、AWS、GCP など様々なクラウドプラットフォームに対応したインフラ構築ツールです。
HCL (HashiCorp Configuration Language) という言語を使って、どのようにインフラを構築するかをコードで定義することができます (IaC: Infrastructure as Code)。 Azure や AWS などの個々のサービスと通信する機能は、プロバイダー と呼ばれる Terraform のプラグインとして提供されており、何千ものプロバイダーが Terraform Registry で公開されています。 適切なプロバイダーが見つからなければ、Golang(Go 言語)で自作することも可能です。
インストール
Terraform の CLI ツール(terraform
コマンド)は、下記公式サイトの手順に従って簡単にインストールできます。
各 OS のパッケージマネージャー(macOS の brew
など)でインストールするのが手っ取り早いですが、1 バイナリーで提供されているので、バイナリ―をダウンロードして適当なディレクトリに配置する方がむしろ簡単かもしれません。
Golang 製のツールは、1 バイナリ―で提供されていているのでよいですね。
次のように terraform
コマンドを実行できるようになれば OK です。
$ terraform -version
Terraform v1.5.4
on windows_amd64
Terraform コード (main.tf) の作成
ここでは、Terraform によるリソース作成の Hello World として、AWS の S3 バケットを作成してみます。
EC2 インスタンスを作成する例などがよくありますが、消し忘れが怖いので S3 バケットにしておきます。
前提条件として、AWS CLI(aws
コマンド)の実行が可能になっているものとします(参考: AWS の初期設定: AWS CLI と認証情報の設定。
Terraform のエントリーポイントとなるファイルは、main.tf
という名前で作成します(Terraform コード と呼びます)。
main.tf
では、使用するプロバイダー(Azure や AWS)の設定や、作成するリソースの定義を行います。
次の例では、S3 バケットを 1 つ定義しています。
resource
のパラメーターには、作成するリソースのタイプ (aws_s3_bucket
) と名前 (example
) を指定しています。
このタイプと名前の組み合わせ (aws_s3_bucket.example
) は、Terraform がリソースの更新や削除を行うときに、操作対象のリソースを特定するために使用します。
AWS 上に作成する S3 バケットの名前ではないことに注意してください。
terraform コマンドの実行
terraform init
main.tf
を作成したら、最初に terraform init
コマンドを実行して、必要なプラグイン(ここでは AWS)などをカレントディレクトリにダウンロードします。
このとき、.terraform.lock.hcl
というロックファイルが生成されます。
ここには、ダウンロードしたプラグインの具体的なバージョン情報などが記載されているので、Git などのバージョン管理システムにコミットするようにします。
他のチームメンバーが terraform init
コマンドを実行したときは、このロックファイルに従って各種プラグインがインストールされます。
ロックファイルの内容を更新したい場合(使用するプラグインを更新したい場合)は、-upgrade
オプションを付けて実行します。
terraform plan
次に、terraform plan
コマンドを実行して、どのようなリソースが生成されるのかを事前確認しておきます。
terraform apply
問題なさそうであれば、terraform apply
コマンドを実行して、実際にクラウド上にリソースを生成します。
AWS コンソール 上で S3 バケット (012345012345-bucket
) が作成されているのを確認できれば成功です。
terraform apply
コマンドを実行すると、カレントディレクトリに terraform.tfstate
というステートファイルが生成されます。
このファイルは、Terraform が現在の実際のインフラ構成を追跡するために使用します。
デフォルトではローカルディレクトリに生成されますが、チーム内の複数メンバーが terraform
コマンドを実行する場合は、このステートファイルを共有する必要があります。
ステートファイルを共有する方法としては、S3 バケットを使う方法 や、Terraform Cloud サービスを使う方法 があります。terraform destroy
最後に、今回作成したリソースをまとめて削除するには terraform destory
コマンドを実行します。
これで、Terraform による Hello World は完了です。
٩(๑❛ᴗ❛๑)۶ わーぃ