[1章]Play Framework(Scala)をAWS(EC2)にデプロイしてWelcome to Play!を表示させる

takahiko tominaga
nextbeat-engineering
19 min readMar 10, 2021

はじめに

お久しぶりです。ネクストビートの富永です。
今回は、AWSに関する内容となっており、1章、2章の2部構成になっております。

2つの章を通してタイトルの通り、Play Framework(Scala)をAWS(EC2)にデプロイして、「Welcome to Play!」を表示させるまでを行っていきます。

主に1章では、ネットワーク及びセキュリティーレイヤーの構築を行い、2章ではアプリケーションレイヤーの構築を行います。

  1. ネットワーク(セキュリティー)レイヤーの構築
  2. アプリケーションレイヤーの構築

本ブログのネットワーク(セキュリティー)レイヤーの構築では、以下のような構成を完成させます。

構成図

AWSにデブロイしようと思った理由

毎週金曜日に弊社では、夕学という勉強会を実施しています。
その勉強会で、TerraformというAWSの設定をまとめておく機能を勉強させて頂きました。

勉強会1回目を終えて、『そもそもPlay FrameworkってどうやってAWSにデプロイするのだろう?』と思ったのが きっかけです。

また、筆者自身ネットワークに関する知識が足りていないと感じており、AWSを扱うことで、ネットワークに関する知識も合わせて勉強したいと思ったからです。
ウェブサーバーとかIPの番号とか全く理解できていません。
なので、少しでもここら辺の知識も向上させたいと思っています。

ネットワークに関して、下記でざっと読むと基本は学べたので、よかったです。

実装内容

本ブログでは、以下の6項目を行います。

  1. Virtual Private Cloudの設定
  2. サブネットの設定
  3. インターネットゲートウェイの設定
  4. NATゲートウェイの設定
  5. ルートテーブルの設定
  6. セキュリティーグループの設定

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を作る際にハードウェアを占有するかどうかを選択できる(占有すると追加料金がかかる)

IPv4とIPv6の違いは?ここを参照してください

今回は、下記のような設定にしました。

  • 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にあげるまで

--

--