🎉

TerraformでAWSにWebサーバを作成する【03. VPC編】

8 min read

こんにちは、Masuyama です。

本記事は Terraform で AWS を操作する第一歩となる「TerraformでAWSにWebサーバを作成する【01. インストール編】」シリーズの一つです。

前回の記事 - 02. 初期セットアップ編 にて Terraform で AWS リソースを作成するための準備が整ったので、今回からいよいよ実際に AWS リソースを作成してみます。
まずは土台となる VPC (+サブネット) を作成します。

事前の注意

今回は作ってすぐ壊すレベルのものであるため、ステージによってファイルや変数を分けるといった本番運用を想定したディレクトリ構成ではありません。
この点について考え方を把握しておきたい方はクラスメソッドさんの Terraformにおけるディレクトリ構造のベストプラクティス をご参照ください。
2016 年と古めの記事ではありますが、考え方は参考になると思います。

VPC用 .tf ファイル作成

それでは作業ディレクトリ (terraform init を実行したディレクトリ) に実行用のファイルを作成します。
作るリソースがわかりやすいよう、名前は vpc.tf としておきます。

$ touch vpc.tf

中身は次のように記述します。
(参考:公式ドキュメント)

vpc.tf

resource "aws_vpc" "tfweb_vpc" {
  cidr_block           = "10.100.0.0/16"
  instance_tenancy     = "default"
  enable_dns_hostnames = true
  enable_dns_support   = true
}

少し解説します。

  • cird_block
    • 文字通り CIDR を指定しています。ここは任意の CIDR に変更いただいて問題ありません。
  • instance_tenancy
    • ここで作成される EC2 インスタンスの物理ハードウェア分散方法を指定しています。通常は複数の AWS アカウントと共存する形式である共有型 (default) を指定します。
  • enable_dns_hostnames
    • パブリック IP アドレスを持つインスタンスが、対応するパブリック DNS ホスト名を取得するかどうか指定します ()。
  • enable_dns_support
    • DNS 解決がサポートされているかどうかを示します。

実行計画の作成

AWS リソースを作成するためのファイルが一つできたので、前回学んだ 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_vpc.tfweb_vpc will be created
  + resource "aws_vpc" "tfweb_vpc" {
      + arn                              = (known after apply)
      + assign_generated_ipv6_cidr_block = false
      + cidr_block                       = "10.100.0.0/16"
      + default_network_acl_id           = (known after apply)
      + default_route_table_id           = (known after apply)
      + default_security_group_id        = (known after apply)
      + dhcp_options_id                  = (known after apply)
      + enable_classiclink               = (known after apply)
      + enable_classiclink_dns_support   = (known after apply)
      + enable_dns_hostnames             = true
      + enable_dns_support               = true
      + id                               = (known after apply)
      + instance_tenancy                 = "default"
      + ipv6_association_id              = (known after apply)
      + ipv6_cidr_block                  = (known after apply)
      + main_route_table_id              = (known after apply)
      + owner_id                         = (known after apply)
      + tags_all                         = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

このように、どのようなリソースが作られる予定であるかをひと目で確認することが出来ます。
なお、いくつかのパラメータ (ARN) などは known after apply となっていますが、これは Terraform を実行した後に判明するパラメータであることを示しています。

リソースの作成 (terraform apply)

では terraform plan で確認した実行計画に問題がなければ terraform apply コマンドでリソースを実際に作成します。

terraform apply は terraform plan を実行した場合と同様、まず最初に自動的に新しい実行計画を作成し、それを承認するかどうかを確認してから、提案されたアクションを実行します。

$ terraform apply

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_vpc.tfweb_vpc will be created
  + resource "aws_vpc" "tfweb_vpc" {
      + arn                              = (known after apply)
      + assign_generated_ipv6_cidr_block = false
      + cidr_block                       = "10.100.0.0/16"
      + default_network_acl_id           = (known after apply)
      + default_route_table_id           = (known after apply)
      + default_security_group_id        = (known after apply)
      + dhcp_options_id                  = (known after apply)
      + enable_classiclink               = (known after apply)
      + enable_classiclink_dns_support   = (known after apply)
      + enable_dns_hostnames             = true
      + enable_dns_support               = true
      + id                               = (known after apply)
      + instance_tenancy                 = "default"
      + ipv6_association_id              = (known after apply)
      + ipv6_cidr_block                  = (known after apply)
      + main_route_table_id              = (known after apply)
      + owner_id                         = (known after apply)
      + tags_all                         = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: 

途中までは terraform plan コマンド実行時と似ているのですが、最後に対話式で承認を求められるようになります。
これに対して指示通り 'yes' と入力すると、事前に表示されている実行計画通りにリソースが作成されます。

...
  Enter a value: yes

aws_vpc.tfweb_vpc: Creating...
aws_vpc.tfweb_vpc: Still creating... [10s elapsed]
aws_vpc.tfweb_vpc: Creation complete after 13s [id=vpc-08829488b3b271957]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

想定通りに作成されているかどうか、念の為 AWS コンソール上からも確認してみましょう。

いいですね。VPC ID も、terraform apply 後にコマンドライン上に出力された値と一致していることが分かります。

サブネット用 .tf ファイル作成 & 実行

この調子で、先ほど作成した VPC 内にサブネットを用意します。
ここでポイントになるのが 「どうやって VPC とサブネットを紐付けるか?」 になります。

結論からいうと、VPC の ID をサブネット用の .tf ファイル内で指定することで、どの VPC 内にサブネットを作成するかを紐付けることができます。
先ほど使った vpc.tf ファイルをもう一度みてみましょう。

vpc.tf (再掲)

resource "aws_vpc" "tfweb_vpc" {
  cidr_block           = "10.100.0.0/16"
  instance_tenancy     = "default"
  enable_dns_hostnames = true
  enable_dns_support   = true
}

冒頭部分で作るリソースが aws_vpc、つまり AWS の VPC であることを示していると同時に "tfweb_vpc" と名前を付けていることにお気づきでしょうか。
ここの名前は任意なのですが、この名前を別の .tf ファイルから参照することで、このリソースを参照することが可能になります。

具体的に見てみましょう。
サブネット用の .tf ファイルとして subnet.tf ファイルを作成し、次のように記述します。

subnet.tf

resource "aws_subnet" "tfweb_subnet" {
  vpc_id                  = "${aws_vpc.tfweb_vpc.id}"
  cidr_block              = "10.100.0.0/24"
  availability_zone       = "ap-northeast-1a"
  map_public_ip_on_launch = true
}

vpc_id の欄で、aws_vpc リソースの tfweb_vpc (VPC に付けた一意の名前) を参照し、さらにその ID を引っ張ってきています。
このように、ファイル間で名前を参照しながら紐付けを行うというのは頻繁に使われる設定です。
※ここでも "tfweb_subnet" という名前をつけて、別なファイルから更にサブネットを参照できるようにしています。

では今回は terraform apply で確認と実行を同時に済ませてしまいましょう。

$terraform apply
...(中略)...
  Enter a value: yes

aws_subnet.tfweb_subnet: Creating...
aws_subnet.tfweb_subnet: Still creating... [10s elapsed]
aws_subnet.tfweb_subnet: Creation complete after 11s [id=subnet-0a2190cc60270affd]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

AWS コンソール上で確認しても、出力された subnet id を持つサブネットが作成されたことが分かります。

今回でリソースを作成する方法を学んだので、次回から一気に他のリソースを作成していきましょう。

Discussion

ログインするとコメントできます