terraform cloudで初めるAWS その2: ネットワーク設計編
これはシリーズ化する予定なので過去の記事や続きは←リンクからどうぞ。
ちなみに最低限AWS使った事ある人(EC2くらい起動した事ある人)向けの記事です
前回まで
terraform cloudとgitlabとawsでVPC
を作成しました。具体的にはこんな定義になっていると思います。
1resource "aws_vpc" "vpc" {
2 cidr_block = "192.168.0.0/16"
3 tags = {
4 Name = local.workspace
5 }
6}
VPCとは
さて、これでVPCが出来ていると思うんですが、VPCとは何なんだという説明をする前に手を動かしちゃった方が早いんじゃないかという感じがします。とにもかくにも上記の設定で
1192.168.0.0/16
が出来ているという事です。ネットワークの説明はできるだけ省きたいですが、これは
1192.168.0.0 から 192.168.255.255
までのアドレス空間を使えるという事になります。ネットワークとかブロードキャストとかそういうのはちょっとここでは置いときますよっと。
サブネットを作ってみる
192.168.0.0/16
とかいうそれなりに巨大な空間をそのまま使ってもいいけど、基本的にサブネットを切って使います。これをやってみましょう。
network.tfに以下を追記してみます。
1resource "aws_subnet" "pub" {
2 vpc_id = aws_vpc.vpc.id
3 cidr_block = "192.168.1.0/24"
4
5 tags = {
6 Name = local.workspace
7 }
8}
でcommit & pushとかします
1% git commit -m 'add example subnet'
2% git push
このように適当にcommit&pushしたら、terraform cloudからapplyします。
これがここからずっと同じような一連の作業になります(ミスっていれば修正)
Applyした後AWSコンソールでみるとsubnetが出来てますね。
今回の記事では使いませんがアベイラビリティーゾーン
ってやつ一応気にしておいてください。ここではap-northeast-1a
が(勝手に)割り当てられています。
ちなみに現状「a」「c」「d」という3つのゾーンがあります。これはロードバランシングとかする時効いてきます
ルートテーブルの関連付け
今の状態を示すと
1VPC: 192.168.0.0/16
2 |
3 +- subnet: 192.168.1.0/24
とまあこういう状態になっているんですが、上図では意図的に繋げてあるように書いてあるけど実際ネットワーク的には何も繋がっていません。とりあえず枠だけ作ったって感じです。これを接続せにゃなりません。
なのですが、上図だとちょっとうまく表せないので難しい所なんですが、これをコードでちょとちょっと理解していきましょう。
インターネットゲートウェイを設置する
まず、実はこの状態だとそもそもインターネットに出ていけません(何と)。なので、ネットワークがインターネットに出られる状態を作り出します。これにはまずインターネットゲートウェイ
って奴を設置します。設置はめちゃくちゃ簡単です。
1resource "aws_internet_gateway" "igw" {
2 vpc_id = aws_vpc.vpc.id
3
4 tags = {
5 Name = local.workspace
6 }
7}
これを追記します。最初のうちは細かくcommitしてapplyしてもよいでしょう。
さて、設置したらVPCのネットワークがこのインターネットゲートウェイを通じて外に出られるようにする必要があります。ここでルートテーブル
を作成します。
1resource "aws_route_table" "pub" {
2 vpc_id = aws_vpc.vpc.id
3
4 route {
5 cidr_block = "0.0.0.0/0"
6 gateway_id = aws_internet_gateway.igw.id
7 }
8
9 tags = {
10 Name = local.workspace
11 }
12}
これはちょっとよく見て欲しいんですが、routeのcidr_blockが0.0.0.0/0
となっている時のゲートウェイを先程設置したインターネットゲートウェイのIDに充てています。
vpc_id = aws_vpc.vpc.id
の事
0.0.0.0/0
は「全ての出ていくパケット」という意味になります。細工すれば特定のアドレスだけインターネットに出すとかいう運用もありえますが、とにかくシンプルにやります。
これで 「インターネットに出ていく事が可能なVPC」が出来ました。
subnetを関連付ける
subnetをインターネットに出す関連付けはこの作成したルートテーブルでやります。
1resource "aws_route_table_association" "pub" {
2 subnet_id = aws_subnet.pub.id
3 route_table_id = aws_route_table.pub.id
4}
これにより、subnetは↑のルートテーブルを通じてインターネットゲートウェイからインターネットに出られるようになりました!
EC2ホストを起動する
これはterraformでやってもいいんですが、ここだけwebでやってみましょう(記事の枠の関係上)。
適当なイメージを選んでt2.microとか適当に選択します
ここで「確認と作成」でなく「次のステップ: 」にします
ここ。作成したVPCがあるはずですし、作成したsubnetもあるはずです。自動割り当てのパブリックIPは無効になっているはずですんで無理矢理有効にします。まああとキーペアは何とかしてください(切望)。
EC2ホストが起動した
ここでこのへんのアドレスに着目し、パブリックIPv4アドレスにSSHを仕掛けます。debianならadminっていうユーザで入るので以下のようにします。
1% ssh admin@54.248.168.78
するとうまく入れるはずです
1admin@ip-192-168-1-70:~$ ip addr
21: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
3 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4 inet 127.0.0.1/8 scope host lo
5 valid_lft forever preferred_lft forever
6 inet6 ::1/128 scope host
7 valid_lft forever preferred_lft forever
82: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
9 link/ether 06:7c:d3:5f:b1:b2 brd ff:ff:ff:ff:ff:ff
10 inet 192.168.1.70/24 brd 192.168.1.255 scope global dynamic eth0
11 valid_lft 3449sec preferred_lft 3449sec
12 inet6 fe80::47c:d3ff:fe5f:b1b2/64 scope link
13 valid_lft forever preferred_lft forever
このように先程作成したsubnetの192.168.1.0/24
の範囲のアドレスがeth0に当たってるのを確認します。この場合は192.168.1.70
であります。
このようにaptコマンドなど使って外に出られる事を確認しときます。まあ、何というか意図した通りにネットワークはできた感じがしますよね。というわけで今回はここまで。確認用に適当に作成したEC2は 「終了」してサヨナラしましょう。
ここまでで
最低限の
- VPCと
- サブネットと
- インターネットゲートウェイと
- ルートテーブル
をterraformから構築してEC2を通じてインターネットに出られる事を確認できたと思います。
次回はEC2でも整えていきますか、ディスクとかも。