目次
はじめに
Terraformは、Infrastructure as Code(IaC)を定義できるオープンソースのツールです。Alibaba Cloud、AWS、Azureなど、さまざまなクラウドプロバイダーに対応しています。Terraformを使うことで、インフラをコードで管理し、インフラの構築や展開を自動化することができます。
Terraformの流れは次のようになります。まずコードを書き、次にコマンドを実行し、Terraformがインフラを提供するのを待ちます。インフラの構築が完了すると、Terraformは現在のインフラ構成を記録する「Terraform State」というファイルを作成します。

このようなことができるツールは他にもあります。例えば、Ansibleです。ただし、Ansibleは構成管理のためのツールであり、IaCに特化しているわけではありません。そのため、Ansibleを使うと不要な処理まで実行してしまうことがあります 。
アプリケーションをデプロイするには、次のような流れが考えられます。まずTerraformでインフラを作成し、その後AnsibleでDockerのインストールやCIツールの設定など、サーバーに必要な構成を行います。そして最後に、DockerまたはKubernetesを使ってアプリケーションを実行します。

Terraformを使う理由
- 使いやすい
- オープンソースかつ無料
- 宣言的プログラミング:必要なものだけを記述すれば、Terraformが実行してくれる
- AWS、GCP、Azureなど複数のクラウドに対応した構成が1つの設定ファイルで可能(クラウド非依存)
Terraformの使い方
このシリーズでは、Terraformを使ってAWS上にインフラを構築します。
この作業を行うには、AWSアカウントと管理者権限を持つIAMユーザーが必要です。
AWS CLIのクイックスタートに従って設定してください。
Access Keyを取得したら、~/.aws/credentials
という名前のファイルを作成し、以下の内容を記述します:
[default]
aws_access_key_id=<your-key>
aws_secret_access_key=<your-key>
その後、こちらのリンクからTerraformをインストールします
“Hello Terraform!”
この例では、Terraformを使ってAWSクラウド上にEC2インスタンスを作成します。
Terraformで使われている言語は、HashiCorp Configuration Language(HCL)と呼ばれます。

手順は以下の通りです:
- Terraformファイルを作成する
- AWSプロバイダーを設定する
terraform init
コマンドでTerraformを初期化するterraform apply
コマンドでEC2インスタンスを作成するterraform destroy
コマンドでEC2インスタンスを削除する
main.tf
という名前のファイルを作成します。
provider "aws" {
region = "us-west-2"
}
使用するプロバイダーはaws
で、リソースはus-west-2
リージョンに作成されます。
その後、EC2インスタンスを作成するコードを追加します。
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "hello" {
ami = "ami-09dd2e08d601bff67"
instance_type = "t2.micro"
tags = {
Name = "HelloWorld"
}
}
上記では、resource
というブロックを使用しています。これはTerraformで最も重要なブロックで、リソースを作成するために使われます。resource
の後には、作成したいリソースのタイプ(これは使用するプロバイダーが提供するリソースタイプによって決まります)、例えば上記ではaws_instance
、
そして最後にリソース名を指定します。この名前は自由に決めることができます。

あるリソースの属性を確認したい場合は、Terraform Registryのページを参照します。
例えば、aws
のaws_instance
の属性を確認したい場合は、Terraform Registryで調べます。

「Documentation」をクリックします。

aws_instance
を検索します。

各リソースには、リソースタイプに応じて引数(input)と属性(output)があります。
出力される属性の中には「computed attributes」と呼ばれるものがあり、これはリソースが作成された後に初めて取得できる値です。

構成を書き終えたら、ターミナルを開いて terraform init
と入力します。
このステップは新しいインフラ構成を書くときに必ず必要で、main.tf
がある現在のディレクトリにプロバイダーのコードがダウンロードされます。
terraform init
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Installing hashicorp/aws v3.66.0...
- Installed hashicorp/aws v3.66.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
init
が完了したら、次に terraform apply
コマンドを実行して、EC2インスタンスを作成します。
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:
# aws_instance.hello will be created
+ resource "aws_instance" "hello" {
+ ami = "ami-09dd2e08d601bff67"
...
Plan: 1 to add, 0 to change, 0 to destroy.
aws_instance.hello: Creating...
aws_instance.hello: Still creating... [10s elapsed]
aws_instance.hello: Still creating... [20s elapsed]
...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
実行が完了したら、自分のWebコンソールを開いて、EC2インスタンスが作成されていることを確認できます。

EC2を削除したい場合は、terraform destroy
コマンドを実行するだけです。
terraform destroy -auto-approve
aws_instance.hello: Refreshing state... [id=i-0ec68130272c45152]
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:
# aws_instance.hello will be destroyed
- resource "aws_instance" "hello" {
- ami = "ami-09dd2e08d601bff67" -> null
...
Plan: 0 to add, 0 to change, 1 to destroy.
aws_instance.hello: Destroying... [id=i-0ec68130272c45152]
aws_instance.hello: Still destroying... [id=i-0ec68130272c45152, 10s elapsed]
aws_instance.hello: Still destroying... [id=i-0ec68130272c45152, 20s elapsed]
aws_instance.hello: Still destroying... [id=i-0ec68130272c45152, 30s elapsed]
aws_instance.hello: Destruction complete after 35s
Destroy complete! Resources: 1 destroyed.
すばらしい、Webコンソールを確認すると、EC2インスタンスが正常に削除されたことがわかります。
まとめ
これで、IaCとは何か、そしてTerraformの使い方について一通り学びました。
見ての通り、Terraformを使えばリソースの作成や削除がとても簡単に行えます。
次回は、構成コードの書き方について詳しく説明します。