こんにちは。KOUKIです。
とある企業で、Web APIの開発などしています。
最近だとクラウドネイティブ化の波が押し寄せてきて、AWSやGCPにも触り始めました。
その影響で、Terraformを学習する必要が出てきたので、本記事ではTerraformの基礎について備忘を残しておきたいと思います。
<目次>
事前準備
1 2 3 4 5 |
mkdir terraform cd terraform touch docker-compose.yml touch Makefile touch main.tf |
Terraformとは
Terraformは、アプリ実行基盤などをコードベースで管理できるツールです。
例えば、AWS上でEC2・DynamoDB・S3を組み合わせたアプリ実行環境があったとします。これを、Terraformの文法規則に則ってコードで記述することで、コマンド一発でアプリ実行環境を構築することができたりします。
Terraformを使わない場合、手動で設定をポチポチしていくことになるので、結構めんどくさいです。
習得しておくとかなり快適なエンジニアライフが送れると思います。
Terraformのインストール
ローカルにインストール
[ここ]からTerraformをインストールしてください。インストール手順も公開されています。
Macの場合は、Homebrewで簡単にインストールできます。
1 2 |
brew tap hashicorp/tap brew install hashicorp/tap/terraform |
Dockerイメージ
通常であればTerraformをインストールする必要があるのですが、Terraformのdockerイメージが提供されています。Dockerプロバイダーを使うときは利用が難しいのですが、それ以外の場合はTerraformをインストールする必要がないので、おすすめです。
1 2 3 4 5 6 7 8 |
version: "3.7" services: terraform: image: hashicorp/terraform:1.0.3 volumes: - .:/infra working_dir: /infra |
Dockerプロバイダー
Terraformは、AWS・GCP・Azure関係なく使える便利ツールですが、Dockerプロバイダーを使うとローカルでも簡単にTerraformを動かせたりします。
main.tfに以下の設定を行いましょう。
1 2 3 4 5 6 7 8 9 10 |
# --- root/main.tf --- terraform { required_providers { docker = { source = "kreuzwerker/docker" } } } provider "docker" {} |
これが最小単位の構成になります。
このコードを実行したところで何も起きませんが、エラーなく起動するか確認しましょう。
Terraformコマンド(Makefile)
MakefileにTerraformのコマンドを記述します。
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 |
.PHONY: init validate plan apply destroy fmt console init: terraform init # docker-compose run --rm terraform init validate: terraform validate # docker-compose run --rm terraform validate plan: terraform plan # docker-compose run --rm terraform plan apply: terraform apply -auto-approve # docker-compose run --rm terraform apply -auto-approve destroy: terraform destroy -auto-approve # docker-compose run --rm terraform destroy -auto-approve fmt: terraform fmt -recursive --diff # docker-compose run --rm terraform fmt -recursive --diff console: terraform console # docker-compose run --rm terraform console |
Terraform初期化
gitを使うときにinitコマンドを実行するように、Terraformにもinitコマンドがあります。
Terraforを利用する際に、最初に実行するコマンドです。
今回は、Makefileにinitコマンドを記述しているので、以下のコマンドで実行します。
1 2 3 4 5 6 |
make init # Windowsの場合 terraform init Terraform has been successfully initialized! |
コンソール上に「Terraform has been successfully initialized!」が表示されたらOKです。
ローカルにも「.terraform」フォルダが生成されます。

アプリ実行環境の構築
Terraformでnoderedのイメージをローカルに落としてみましょう。
Resource
Terraformには、Resourceという重要なエレメントがあります。
ここには、Terraformで構築するリソースを指定します。
AWSのサービス(EC2など)やGCPのサービス(BigQueryなど)は、全てリソース化されているので、使いたいサービスはここに定義することになります。
今回は、Docker Imageを使いたいので、resourceタグにdocker_imageを指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# --- root/main.tf --- terraform { required_providers { docker = { source = "kreuzwerker/docker" } } } provider "docker" {} resource "docker_image" "nodered_image" { # docker image name = "nodered/node-red:latest" } |
Plan
アプリケーション環境を構築する前に、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 |
$ make plan terraform plan Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # docker_image.nodered_image will be created + resource "docker_image" "nodered_image" { + id = (known after apply) + latest = (known after apply) + name = "nodered/node-red]latest" + output = (known after apply) + repo_digest = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now. |
Apply
Plan実行後は、applyコマンドで起動します。
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 |
$ make apply terraform apply -auto-approve Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # docker_image.nodered_image will be created + resource "docker_image" "nodered_image" { + id = (known after apply) + latest = (known after apply) + name = "nodered/node-red:latest" + output = (known after apply) + repo_digest = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. docker_image.nodered_image: Creating... docker_image.nodered_image: Still creating... [10s elapsed] docker_image.nodered_image: Still creating... [20s elapsed] docker_image.nodered_image: Still creating... [30s elapsed] docker_image.nodered_image: Still creating... [40s elapsed] docker_image.nodered_image: Still creating... [50s elapsed] docker_image.nodered_image: Still creating... [1m0s elapsed] docker_image.nodered_image: Still creating... [1m10s elapsed] docker_image.nodered_image: Still creating... [1m20s elapsed] docker_image.nodered_image: Still creating... [1m30s elapsed] docker_image.nodered_image: Creation complete after 1m32s [id=sha256:db209923532eb78b1ea206277ca8f50498c526709ac572b28cee7a8f8f5d4465nodered/node-red:latest] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. |
下記のコマンドで、docker imageの一覧を表示しましょう。
1 2 3 |
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nodered/node-red latest db209923532e 36 hours ago 512MB |
node-redのイメージがインストールされています。
Destroy
destroyコマンドで作成した環境を消すことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ make destroy terraform destroy -auto-approve docker_image.nodered_image: Refreshing state... [id=sha256:db209923532eb78b1ea206277ca8f50498c526709ac572b28cee7a8f8f5d4465nodered/node-red:latest] Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: - destroy Terraform will perform the following actions: # docker_image.nodered_image will be destroyed - resource "docker_image" "nodered_image" { - id = "sha256:db209923532eb78b1ea206277ca8f50498c526709ac572b28cee7a8f8f5d4465nodered/node-red:latest" -> null - latest = "sha256:db209923532eb78b1ea206277ca8f50498c526709ac572b28cee7a8f8f5d4465" -> null - name = "nodered/node-red:latest" -> null - repo_digest = "nodered/node-red@sha256:8c861522fddf1f71fb56fe0a881981cc79c40957a0816c11c6950ee67eb2c1d0" -> null } Plan: 0 to add, 0 to change, 1 to destroy. docker_image.nodered_image: Destroying... [id=sha256:db209923532eb78b1ea206277ca8f50498c526709ac572b28cee7a8f8f5d4465nodered/node-red:latest] docker_image.nodered_image: Destruction complete after 1s Destroy complete! Resources: 1 destroyed. |
docker imageを確認しましょう。
1 2 |
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE |
node-redのイメージが削除されています。
次回
Terraformは、Init -> Plan -> Apply -> Destroyが基本的な流れです。
次回は、コンテナの作成と情報の確認方法を学びましょう。
コメントを残す
コメントを投稿するにはログインしてください。