Terraformで複数のAWS EC2インスタンスを作成、管理する方法:「AWS」×「Terraform」で学ぶクラウド時代のインフラ管理入門(3)
自動化ツールの一つである「Terraform」について、これから学ぼうという人、使っていきたい人に向けて基本的な使い方を紹介していきます。第3回は同じような構成のEC2インスタンスを複数作成、管理する方法について。
自動化ツールの一つである「Terraform」について、これから学ぼうという人、使っていきたい人向けに、Amazon Web Services(AWS)を利用して基本的な使い方を紹介していく本連載。前回は、Terraformを利用してAWS環境に「Amazon Elastic Compute Cloud」(Amazon EC2)インスタンスの作成、変更、削除方法を解説しました。第3回は同じような構成のEC2インスタンスを複数作成、管理する方法を解説します。
単純な記述方法だとTerraformの管理が大変になる
Terraformを使用して複数のEC2インスタンスを作成する場合、単純に実現しようとすると、リソースを定義するTerraformコードを必要な数だけ記述すれば作成できます。
以下のように記述すると、「example01」と「example02」という名前の2つのEC2インスタンスが作成されます。
resource "aws_instance" "example01" { ami = "ami-0f9816f78187c68fb" instance_type = "t2.micro" tags = { Name = "example01" } } resource "aws_instance" "example02" { ami = "ami-0f9816f78187c68fb" instance_type = "t2.micro" tags = { Name = "example02" } }
しかし、作成するインスタンスが10個だったり、100個だったりすると、その分だけTerraformのコードが長くなり、管理が大変になります。こうした要件にもTerraformなら簡単に解決する方法があります。本記事では、countを利用した方法をご紹介します。
countを利用して複数リソースを作成する
前述のような、同種のEC2インスタンスを2つ作成する場合を例に、countを利用してTerraformコードを書くと、次のようになります。
resource "aws_instance" "example" { count = 2 ami = "ami-0f9816f78187c68fb" instance_type = "t2.micro" tags = { Name = "example" } }
先ほどと異なり、記述するリソースを定義する個数が1つだけになりました。それではいつものようにterraform 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: # aws_instance.example[0] will be created + resource "aws_instance" "example" { (中略) } # aws_instance.example[1] will be created + resource "aws_instance" "example" { (中略) } Plan: 2 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.
出力された内容を見ると、リソース名に当たるaws_instance.exampleの後ろに「[0]」や「[1]」が付け加えられているのが分かります。プログラミングを経験された方なら、これが配列を表すようにも見えるのではないでしょうか。Terraformのコード上では、定義された複数のリソースに対して配列のように参照できますが、詳しい内容は次回触れたいと思います。
それでは、次にterraform applyを実行します。実行結果は省略しますが、実行後にAWSマネジメントコンソールを確認すると、次のようにEC2インスタンスが2つ生成されていることが確認できます。
それぞれのEC2インスタンスの内容を確認すると、インスタンスタイプやAmazonマシンイメージ(AMI)は同一のものであることが分かります。ここで、Terraformのコードでcountの数値を増やしてみましょう。
resource "aws_instance" "example" { count = 10 ami = "ami-0f9816f78187c68fb" instance_type = "t2.micro" tags = { Name = "example" } }
定義上はEC2インスタンスが10個生成されることになります。terraform planで予定される処理内容を確認してみましょう。
$ terraform plan aws_instance.example[0]: Refreshing state... [id=i-xxxxxxxxxxxxxxxxx] aws_instance.example[1]: Refreshing state... [id=i-xxxxxxxxxxxxxxxxx] 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.example[2] will be created + resource "aws_instance" "example" { (中略) Plan: 8 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.
先に作成した2つのEC2インスタンスはそのままで、残り8つのEC2インスタンスを新しく作成する内容に見えます。terraform applyを実行した後、AWSマネジメントコンソールを確認してみましょう。
設定通り、EC2インスタンスが10個作成されたことが分かります。しかし、インスタンスの名前が全て「example」になっていて、一目で扱うインスタンスの判別ができず、このままでは管理しづらいです。そこで、それぞれ別の名前を付けるようにしてみましょう。
count変数を利用して複数のリソースを管理する
前述のように、countを利用して作成するリソースは配列のような取り扱いがされ、それぞれ番号が振られていることが分かります。この番号を利用してEC2インスタンスの名前をそれぞれ変えてみましょう。
Terraform では、countを使用したリソースに対してcountという変数が扱えるようになり、それぞれの番号はcount.indexで参照できます。突然「変数」という概念が登場して戸惑う人もいるかと思いますが、変数も次回以降で詳しく触れていきます。今回は、count.indexという変数が利用できるんだということが理解できれば問題ありません。
それでは、Terraformのコードを修正してインスタンスの名前に番号を振ってみましょう。
resource "aws_instance" "example" { count = 10 ami = "ami-0f9816f78187c68fb" instance_type = "t2.micro" tags = { Name = "example${count.index}" } }
上記のように修正してterraform planを実行します。すると、次のようにそれぞれ番号が付いていることが確認できます。
$ terraform plan (中略) # aws_instance.example[0] will be updated in-place ~ resource "aws_instance" "example" { id = "i-xxxxxxxxxxxxxxxxx" ~ tags = { ~ "Name" = "example" -> "example0" } ~ tags_all = { ~ "Name" = "example" -> "example0" } # (30 unchanged attributes hidden) # (8 unchanged blocks hidden) }
terraform applyを実行して、AWSマネジメントコンソールを確認します。期待通り、それぞれのインスタンスの名前に番号が振られるようになりました。
最後に、インスタンスの数を減らして元の2つに戻してみましょう。変更方法は、もちろんcountの数字を減らすだけです。
resource "aws_instance" "example" { count = 2 ami = "ami-0f9816f78187c68fb" instance_type = "t2.micro" tags = { Name = "example${count.index}" } }
同様に、terraform planで実行内容を確認して、terraform applyを実行します。AWSマネジメントコンソール画面を確認すると、0と1の数字が付いたEC2インスタンス以外は終了済みとなり、数が減っていることが確認できました。
このように、Terraformでは同様の構成で複数のリソースを管理することが簡単に実現できます。次回は、Terraformの便利な機能であるデータソースを紹介します。
筆者紹介
鎌田啓佑
サイオステクノロジー所属。OSS よろず相談室でサポート対応をしているテクニカルサポートエンジニア。Ansibleに出会ってから自動化に取りつかれ、自身の業務やプライベートであらゆるものの自動化に取り組む。プライベートではJavaでちょっとしたツールの開発を趣味にしている。
Copyright © ITmedia, Inc. All Rights Reserved.