[1章]Play Framework(Scala)をAWS(EC2)にデプロイしてWelcome to Play!を表示させる
はじめに
お久しぶりです。ネクストビートの富永です。
今回は、AWSに関する内容となっており、1章、2章の2部構成になっております。
2つの章を通してタイトルの通り、Play Framework(Scala)をAWS(EC2)にデプロイして、「Welcome to Play!」を表示させるまでを行っていきます。
主に1章では、ネットワーク及びセキュリティーレイヤーの構築を行い、2章ではアプリケーションレイヤーの構築を行います。
- ネットワーク(セキュリティー)レイヤーの構築
- アプリケーションレイヤーの構築
本ブログのネットワーク(セキュリティー)レイヤーの構築では、以下のような構成を完成させます。
構成図
AWSにデブロイしようと思った理由
毎週金曜日に弊社では、夕学という勉強会を実施しています。
その勉強会で、TerraformというAWSの設定をまとめておく機能を勉強させて頂きました。
勉強会1回目を終えて、『そもそもPlay FrameworkってどうやってAWSにデプロイするのだろう?』と思ったのが きっかけです。
また、筆者自身ネットワークに関する知識が足りていないと感じており、AWSを扱うことで、ネットワークに関する知識も合わせて勉強したいと思ったからです。
ウェブサーバーとかIPの番号とか全く理解できていません。
なので、少しでもここら辺の知識も向上させたいと思っています。
ネットワークに関して、下記でざっと読むと基本は学べたので、よかったです。
実装内容
本ブログでは、以下の6項目を行います。
- Virtual Private Cloudの設定
- サブネットの設定
- インターネットゲートウェイの設定
- NATゲートウェイの設定
- ルートテーブルの設定
- セキュリティーグループの設定
1. Virtual Private Cloud(以降VPC)の設定
VPCの設定では、下記を行います。
・ VPCの名前を決める
・ VPCのIPアドレス範囲を決める
VPCとは
公式で下記のように説明されています。
Amazon Virtual Private Cloud (Amazon VPC) では、AWS クラウドの論理的に分離されたセクションをプロビジョニングし、お客様が定義した仮想ネットワーク内の AWS リソースを起動することができます。[1]
つまりどういうこと?
簡単に言うと、AWS内に自分専用のネットワーク環境を構築して、その中でアプリを動かせるようにするためのものです。
今まで自分が開発していた環境をAWS内で作ると考えると、イメージしやすいと思います。
VPCの設定を行うことで、AWS内でEC2とかRDSとかのサービスが使用できるようになります。
Amazon VPC の特徴を見てみるとイメージしやすいと思います!
VPCの作成
まずは下記画像のように、AmazonマネジメントコンソールからVPCを選択します。
VPCを選択すると下記のようにVPCで行える設定の一覧が表示されます。
一覧の中からVPCを選択します。
下記画像右上の「VPCの作成」を選択します。
起動しているVPCがあればここに表示されます。
※初めて起動する場合は、何も表示されていません。
「VPCの作成」を選択すると作成画面が表示されます。
下記4つの設定を行い、VPCの設定を完了させます。
- 名前タグ-オプション
作成したいVPCの名前 - IPv4 CIDR ブロック
VPCのプライベートIPアドレスの範囲を定義 - IPv6 CIDR ブロック
Amazon が提供する IPv6 CIDR ブロックを関連付けるよう指定 - テナンシー
VPCを作る際にハードウェアを占有するかどうかを選択できる(占有すると追加料金がかかる)
今回は、下記のような設定にしました。
- VPCの名前は、Sample VPC
- IPv4は下記のルールから10.0.0.0/16で設定します。
- IPv6はCIDR ブロックなしを選択
- テナンシーはデフォルト
VPCの作成を行い、下記画像のように表示されたら、VPCの作成は完了です。
2. サブネットの設定
サブネットの設定では、下記を行います。
・サブネットの名前を決める
・紐付けるVPCを決める
・サブネットをどのアベイラビリティゾーンに置いておくか決める
・サブネットのIPアドレス範囲
サブネットとは
サブネットとは、作成したVPCの役割を「外部との通信だけを行う」「内部との通信だけを行う」という風に、役割を分けることができる設定です。
サブネットを作成するときに、アベイラビリティゾーンとIPアドレスの範囲を設定します。
アベイラビリティゾーンとは
アベイラビリティゾーンとは、各リージョン内の複数の独立した場所のことです。
アベイラビリティゾーンは、各リージョンごとに2つ以上存在しています。
なぜ2つ以上存在しているのか?
アベイラビリティゾーンは複数のデータセンターで構成されています。
もしアベイラビリティゾーンが存在していなかった場合、停電や自然災害が起きてデータセンターが機能しなくなった場合に、公開しているアプリなりサイトも完全に停止してしまいます。
AWSは、Design for Failure(故障に備えた設計)に基づいて設計されているため、1つのアベイラビリティゾーンが機能を停止しても、別のアベイラビリティゾーンでサイトやアプリを公開できるようにしています。
このため各リージョンには、2つ以上のアベイラビリティゾーンが用意されているのです。
自然災害意外にも、それぞれのリージョン内の各データセンターが連携し合うことで、バックアップを取ったり、アクセスが急増した際に別のサーバーにアクセスするよう調整したり(別途設定が必要)といったことが出来ます。
このためAWSでは、耐障害性の高いシステムを構築することができます。
サブネットの作成
まずナビゲーションペインからサブネットを選択します
次に「サブネットの作成」を選択し、サブネットの設定を行います。
どのVPCにサブネットを作成するかを指定します。
(先ほど作成したVPCを選択します。)
サブネットの設定で、サブネット名とアベイラビリティーゾーンの設定、CIDRの設定を行います。
今回は以下画像のように、2つのアベイラビリティーゾーンに、Public用とPrivate用の系4つのサブネットを作成します。
上記構成のイメージとしては、以下のような感じです。
- Public1 AZ1a SampleとPublic2 AZ1c Sampleが外部との通信用
- Private1 AZ1a SampleとPrivate2 AZ1c Sampleが内部との通信用
- アベイラビリティゾーン1aで、障害などが発生したら、アベイラビリティゾーン1cを使用
サブネットはCIDRブロックに、明確なルールを持たせると運用がしやすいみたいです。
今回は、128以降をPrivateとしそれより前は、Publicというルールで作成を行っています。
運用サービスを分ける場合は、10.0../10.1../10.2..みたいな感じで分けるといいみたいです!
作成が完了したら、サブネットの設定は完了です。
3. インターネットゲートウェイの設定
インターネットゲートウェイの設定では、下記を行います。
・インターネットゲートウェイの名前を決める
・VPCへのアタッチ
インターネットゲートウェイとは
インターネットゲートウェイとは、VPC とインターネットとの間の通信を可能にする VPC コンポーネントであり、冗長性と高い可用性を備えており、水平スケーリングが可能となる機能です。
簡単にいうと、AWS内で作成したVPCを外部と接続できるようにするためのものです。
VPCを家に例えた場合、インターネットゲートウェイは玄関になります。玄関がないと中にも入れないですし、外に出ることもできなくなります。
なので、外部と接続するためにはインターネットゲートウェイが必要になります。
インターネットゲートウェイ自体の設定は、名前を決めてVPCと紐付けるだけなので、サクッと終わらせてしまいましょう!
インターネットゲートウェイの作成
ナビゲーションペインからインターネットゲートウェイを選択し、右上の「インターネットゲートウェイの作成」を選択します
インターネットゲートウェイの作成画面に遷移するので、インターネットゲートウェイの名前を入力し、「インターネットゲートウェイの作成」を選択します。
作成が完了すると下記画像のように表示されます。
表示されていれば、右上の「VPCにアタッチ」を選択します。
先ほど作成した、VPCを選択して「インターネットゲートウェイのアタッチ」を選択します。
状態の欄が緑色で「Attached」に変化しているのが確認できたら、インターネットゲートウェイの設定は完了です。
4. NATゲートウェイの設定
NATゲートウェイの設定では、下記を行います。
- NATゲートウェイの名前を決める
- サブネットへのアタッチ
- Elastic IPの付与
NATゲートウェイとは
NATゲートウェイとは、VPC内に構成した「プライベートサブネット」からインターネットに接続するためのゲートウェイのことです。プライベートサブネット、つまり、インターネットに接続できないサブネットの中に配置したシステムが、これを経由することでインターネットに安全に出れるようになります。
今回EC2は、Privateサブネットに配置を行うのでEC2がネットワークと接続できるようにするための設定です。
NATゲートウェイの作成
ナビゲーションペインからNATゲートウェイを選択し、右上の「NATゲートウェイの作成」を選択します
- 名前: NATゲートウェイの名前
- サブネット: NATゲートウェイを置く場所
今回は、Privateサブネットに作成 - Elastic IP 割り当て ID: NATゲートウェイにIPアドレスを紐づける
「Ekastic IP の割り当て」を選択すると自動生成してくれる
以下のように作成されれば、NATゲートウェイの作成は完了です。
5. ルートテーブルの設定
ルートテーブルの設定では、下記を行います。
・ルートテーブルの名前を決める
・VPCへのアタッチ
・インターネットゲートウェイとの接続を行う
ルートテーブルとは
VPC には暗黙的なルーターがあり、ルートテーブルを使用してネットワークトラフィックの送信先を制御します。VPC の各サブネットをルートテーブルに関連付ける必要があり、ルートテーブルはサブネットのルーティング(サブネットルートテーブル)を制御します。[3]
簡単にいうと、ルートテーブルとは、サブネット内の通信がどの宛先のネットワークに対して、どのコンポーネント(IGWとかEC2とか)に転送されて欲しいかを設定するためのものです。
1つのサブネットに1つのルートテーブルを用意できますが、指定がない場合は、VPC作成時に自動生成されるメインルートテーブルがサブネットに割り当てられます。
ルートテーブルの作成
まずナビゲーションペインからルートテーブルを選択します。
次に左上の「ルートテーブルの作成」を選択します。
ルートテーブルの名前を入力し、設定したVPCを選択します。
設定が完了したら、「作成」を選択します。
今回は、Public用とPrivate用2つのルートテーブルを作成します。
作成が完了したら、ルートテーブルの作成は完了です。
インターネットゲートウェイとの接続
次に、インターネットゲートウェイとの接続を行っていきます。
※接続を行うのは、Public用のルートテーブルのみです。
作成したルートテーブルにチェックを入れて、画面下のタブから「ルート」を選択します。
続いて「ルートの編集」を選択します。
送信先は、どのIPv4 アドレスに送りたいかを設定します。
ターゲットは、先ほど作成したVPCを選択します。
今回は、送信先を0.0.0.0/0に設定し、すべての IPv4 アドレスに送信できるようにします。
設定が完了したら、「ルートの保存」を選択します。
下記画像のように表示されたら、ルートテーブルのルーティング先を、先ほど作成したインターネットゲートウェイに設定することが出来ました。
NATゲートウェイとの接続
次に、NATゲートウェイとの接続を行っていきます。
※接続を行うのは、Private用のルートテーブルのみです。
作成したルートテーブルにチェックを入れて、画面下のタブから「ルート」を選択します。
続いて「ルートの編集」を選択します。
送信先を0.0.0.0/0に設定し、すべての IPv4 アドレスに送信できるようにします。
設定が完了したら、「ルートの保存」を選択します。
サブネットとの紐付け
続いて、先ほど作成したサブネットにもルートテーブルを紐付けていきます。
サブネットの一覧画面に戻り、先ほど作成したサブネットにチェックを入れます。
チェックを入れると、画面下にタブが表示されるので、ルートテーブルを選択します。
そして、「ルートテーブルの関連付けの編集」を選択します。
ルートテーブルの関連付けの編集画面に遷移するので、ルートテーブルIDに、先ほど作成したルートテーブルを入力して、「保存」を行います。
※Publicサブネットは、Public用ルートテーブル、Privateサブネットは、Private用ルートテーブルに紐付けてください。
下記画像のように表示されたら、サブネットとルートテーブルの関連付けは完了です。
6. セキュリティグループの設定
セキュリティグループの設定では、下記を行います。
・セキュリティグループ名を決める
・セキュリティグループの説明を記入
・設定したいVPCを決める
・インバウンドルールを決める
・アウトバウンドルールを決める
セキュリティグループとは
セキュリティグループとは、同一グループ外のインスタンスと、通信を行う際のトラフィックを制御するファイアウォールです。
VPC内でインスタンスを立ち上げた場合、同時に最大5つまでのセキュリティグループを設定することができます。
セキュリティグループは、サブネットレベルではなく、インスタンスレベルで設定します。
つまり、サブネットの中でインスタンス毎にセキュリティグループが設定でき、「この通信は許可をする」といったセキュリティにルールを設定できます。
※許可は出来ても「この通信は拒否する」と言った拒否の設定は出来ないみたいです。
セキュリティグループの設定をする際に、下記2つのルールを設定します。
インバウンドルール -> どんな通信が来たら許可するのか
アウトバウンドルール -> どんな通信を送ると許可されるのか
インバウンドルールとは
インバウンドルールとは、簡単にいうとEC2インスタンスにアクセスできるトラフィックに、制限をするためのルールです。
EC2インスタンスを起動する場合には、セキュリティグループをEC2インスタンスに対して設定を行います。
その際に、インバウンドルールを最低限必要なIPアドレス、ポート番号にのみ限定することでEC2インスタンスを安全に運用できるようになります。
EC2インスタンスを安全に使う際は、セキュリティグループのインバウンドルールをできる限り最小限に限定することが、一番重要な対策のようです。
インバウンドルールの設定項目は下記の通りです。
- タイプ -> 許可する通信の種類
- プロトコル -> 通信を行う際の手順やルール
- ポート範囲 -> コンピュータが通信に使用するプログラムを識別するための番号
- ソース -> IPv4やIPv6の設定
- 説明 — オプション -> インバウンドルールの説明
アウトバウンドルールとは
アウトバウンドルールは、インバウンドルールがサイトからの通信許可なので、その逆になるサイトへの通信許可設定です。
設定する項目もインバウンドルールと同じです。
今回EC2は、Privateサブネットに配置を行いNATゲートウェイでインターネットとの接続を行えるように設定を行っています。
今回は、そのインターネットとの通信をどの通信でもできるように、すべえてを許可する設定にしています。
EC2作成後、Play Framework(Scala)の環境をEC2内に構築していきます。
その際に、wgetなどで外部からScalaをダウンロードしたりしますので、アウトバウンドルールの設定で、外部と通信できるようにしておく必要があります。
セキュリティグループの作成
ナビゲーションペインからセキュリティグループを選択します。
次に、右上の「セキュリティグループを作成」を選択します。
セキュリティグループ名と設定したいVPCを選択します。
次に、インバウンドルール設定項目で、「ルールを追加」を選択し、各項目を設定します。
今回は、HTTPを選択して、80番ポートからアクセスを許可するように設定しました。
各項目の設定が完了すれば、右下の「セキュリティグループを作成」を選択しましょう。
作成が完了すれば、これでセキュリティグループの設定は完了です。
今回は、「VPCの設定」から「セキュリティーグループの設定」までを行いました。
次回は、EC2やALBなどのアプリケーションレイヤーの構築を行っていきます!
まとめ
今回AWSのネットワーク(セキュリティー)レイヤーの設定を行っていきましたが、やはりAWSがわからないというよりもネットワークに関する知識が足りていないと感じました。
ただ、今回の実装である程度理解を深めることができたので、他の実装も試してさらに理解を深めていきたいと考えています。
実装自体はすごく楽しく出来ました!
自分で1から環境を作ってアプリを表示させるのは、なんとなく家を建ててる感じがしてワクワクしました!
わからないことを調べていく内に、どんどん知らないことが出てきて、また調べて脱線して、実装に戻って、この繰り返しが楽しかったです!
長くなってしまいましたが、最後まで読んで頂き、ありがとうございました!
次は、EC2やELBの設定を行っていく予定です!
それでは、次回のブログでお会いしましょう!
参考文献
[AWS]
[1]Amazon Virtual Private Cloud
[2]VPC とサブネット
[3]ルートテーブル
[4]EC2
[その他]
【2020年最新】AWSでPublic DNS(パブリックDNS)が割り当てられない時の解決法
【初心者向け】仮想サーバーとは?物理サーバーと比較したメリットを紹介
EC2のプレイスメントグループを活用するとネットワークパフォーマンスを向上したりハードウェア障害を軽減できます
【AWS IAMとは?】初心者にもわかりやすく解説
(デプロイ編①)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで