Terraformで始めるインフラ管理 – 第1回

目次

はじめに

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のページを参照します。
例えば、awsaws_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を使えばリソースの作成や削除がとても簡単に行えます。
次回は、構成コードの書き方について詳しく説明します。