AWSクラウド環境の構築からSpring Bootアプリのデプロイまで(初心者向け)

アプリケーションエンジニアとして、普段の仕事でインフラ設計をなかなか経験したことがないですが、AWSを通じてインフラ知識がほぼZeroの私でもインフラ基盤を気軽に構築できて感動しました。今回は、私と同じの初心者に向け、AWSクラウド環境の構築からSpring Bootアプリのデプロイまでの手順を共有します。

環境構成図

AWS構成について、東京リージョン内で2つのアベイラビリティゾーン(AZ)を使用した冗長構成を採用します。EC2インスタンスはその2つのAZに分散配置し、ALB(ロードバランサ)経由でアクセスを分散する構成とします。また、RDSインスタンスはEC2と同様に2つのAZに分散配置するようMulti-AZの構成とします。
この構成はAWSの無料利用枠を超えているため、料金がかかります!ご注意ください。
全体構成図.jpg

まず、VPCを構築します!

外部ネットワークからAWS内のインスタンスに到達できるように、AWS内の各インスタンスにIPアドレスが割り振られ、適切にルーティングされる必要があります。このような仮想ネットワークを提供しているサービスをAmazon Virtual Private Cloud(VPC)と言います。

VPCの構成について

練習とは言え、実戦に近いVPC環境を目指しています。今回のVPCは、インターネット通信用のパブリックサブネットとインターネットから遮断されるプライベートサブネットの2種類で構成されます。その2種類のサブネットへのアクセスを制御するために、それぞれに異なるセキュリティグループを適用します。APサーバーはパブリックサブネット上に構築し、DBサーバーはプライベートサブネット上に構築します。
VPC構成詳細.jpg

VPC作成

AWSアカウントを新規登録した後に、デフォルトのVPC環境が既に作られていましたが、今回はそれを利用せずに、一から以下のVPCを新規構築します。
vpc構成図.jpg

1.AWSマネジメントコンソールVPCをクリック⇒左のメニューからVPCを選択⇒VPCの作成ボタンを押下します。
2.VPCの作成画面に適当な名前を入力し、CIDRブロック欄にIPアドレス範囲に入力します。(今回は「10.0.0.0/16」を入力します。)
3.はい、作成するボタンを押下します。
VPC作成.jpg

サブネット作成

上記のVPCの中にサブネットを作成します。サブネットは複数のAZに跨って作成することはできないので、必ず1つのAZを指定して作成します。負荷分散と冗長化のために、APサーバー用サブネットとDBサーバー用サブネットをそれぞれ2つずつ構築します。
subnet構成.jpg

1.左のメニューからサブネットを選択⇒サブネットの作成ボタンを押下します。
2.サブネットの作成画面に、適当な名前入力し、上記作成されたVPCを選んでCIDRブロックを入力します。(Subnet1は「10.0.0.0/24」とします。)
subnet1作成.jpg
3.上記と同じの手順で、Subnet2、Subnet3、Subnet4を構築します。

Subnet AZ IPv4 CIDRブロック
public-subnet1 ap-northeast-1a 10.0.0.0/24
public-subnet2 ap-northeast-1c 10.0.1.0/24
private-subnet1 ap-northeast-1a 10.0.2.0/24
private-subnet2 ap-northeast-1c 10.0.3.0/24

完成後サブネット一覧画面
subnetList.jpg

インターネットゲートウェイ(IGW)とルートテーブルの作成

インターネットゲートウェイ(IGW)は、名前の通りにインターネットとの出入口であり、VPCと外部ネットワークの間で通信を行うために設置します。
また、上記作成されたサブネットがパブリックサブネットなのか、あるいはプライベートサブネットなのかは、そのサブネットに適用されているルートテーブルによって決まります。
送信先:0.0.0.0/0のターゲットとしてIGWが設定されているルートテーブルが適用されているサブネットはパブリックサブネットです。一方、送信先:0.0.0.0/0のターゲットとしてIGWが設定されていないルートテーブル(デフォルトのまま)が適用されているサブネットはプライベートサブネットです。
igw&rtb.jpg

1.左のメニューからインターネットゲートウェイを選択⇒インターネットゲートウェイの作成ボタンを押下します。
2.適当な名前を入力し、はい、作成するのボタンを押下します。
igw.jpg
3.VPCにアタッチのボタンを押下し、VPCとの紐付けを行います。
igw attache.jpg
4.左のメニューからルートテーブルを選択⇒ルートテーブルの作成ボタンを押下します。
5.パブリックサブネットであるSubnet1のルートテーブルを作成するために、適当な名前を入力し、VPCとの紐付けを行い、はい、作成するのボタンを押下します。
rtb1.jpg
6.上記と同様の手順で、public-rtb2を構築します。今回はプライベートサブネット用ルートテーブルを作成せずに、デフォルトのルートテーブルを使用します。
7.パブリックサブネット用のルートテーブルに、デフォルトゲートウェイ(送信先0.0.0.0/0)のターゲットにIGWを登録します。
route.jpg
ルートテーブル内の「10.0.0.0/16 local」というルート情報は、デフォルトの設定で変更・削除することができません。このデフォルト設定は、VPC内の通信はルートテーブルでは制御できないということで、同じVPC内のサブネットであればサブネット間の通信が可能なっていることを意味しています。

セキュリティグループの作成

セキュリティグループは、AWS内各インスタンスごとのファイアウォールで、受信(インバウンド)と送信(アウトバウンド)のアクセス制御ができます。各インスタンスには少なくとも1つのセキュリティグループを適用する必要があります。
VPC構成詳細.jpg
1.左のメニューからセキュリティグループを選択⇒セキュリティグループの作成ボタンを押下する。
2.APサーバー用セキュリティグループを作成するために、適当な名前を入力し、VPCへの紐付けを行い、はい、作成するのボタンを押下します。
sg作成.jpg
3.上記と同じの手順でDBサーバー用のセキュリティグループを作成します。
private sg.jpg
4.それぞれのセキュリティグループに受信(インバウンド)と送信(アウトバウンド)のルールを作成します。デフォルトでインバウンドは許可されているルールがないため、どこからのアクセスも受け付けません。一方、アウトバウンドは、デフォルトで全ての宛先/ポート番号に対するアクセスを許可するルールが設定されています。
外部からアクセスできように、APサーバー用セキュリティグループでSSHの22ポートとウェブアプリの8085ポートを開けておきます。
public inbound.jpg
一方、DBサーバー用セキュリティグループは、APサーバーからDBアクセスのみを許可するために、Auroraの3306ポートを開けておきます。
private sg rule.jpg

以上でVPCの構築が完了しました。

RDSインスタンスの構築

RDSは、リレーショナルデータベースのマネージャーサービスのことです。RDSで選択できるデータベースエンジンは、以下の6種類です。
・Amazon Aurora
・MySQL
・MariaDB
・PostgreSQL
・Oracle
・MS SQL Server
今回はAurora DBを構築します。Auroraは、MySQLと互換性のあるAWS独自のリレーショナルDBエンジンで、最大で MySQL の5倍のスループットおよび3倍の PostgreSQL スループットのパフォーマンスを持つと言われます。
RDS.jpg

サブネットグループの作成

DBインスタンス作成の前提条件として、VPC内でDBサブネットグループを指定する必要があります。
DB サブネットグループには、特定のリージョン内の少なくとも 2 つのアベイラビリティーゾーンにサブネットが必要です。 VPC に DB インスタンスを作成するときに、DB サブネットグループを選択する必要があります。Amazon RDS は、その DB サブネットグループと優先アベイラビリティーゾーンを使用し、サブネットとそのサブネット内の IP アドレスを選択して DB インスタンスに関連付けます。
1.AWSマネジメントコンソールRDSをクリック⇒左のメニューからサブネットグループを選択⇒サブネットグループの作成ボタンを押下します。
2.名前等を適当に入力し、2つのDB用サブネット(private subnet1、private subnet2)を追加し、作成ボタンを押下します。
db subnet group1.jpg

DBインスタンスの作成

1.左のメニューからインスタンスを選択⇒DBインスタンスの起動ボタンを押下します。
2.エンジンの選択画面にAmazon Auroraを選択します。
db1.jpg
3.DB詳細画面にて、DBインスタンスクラスなどを指定し、次のステップボタンを押下します。
※マルチAZ配置を選んだ場合、料金2倍かかります!
db2.jpg
4.VPC、DBサブネットグループ、優先AZ、およびセキュリティグループを指定します。
db3.jpg
5.設定完了後にDBインスタンスが作成中の状態であることを確認できます。
db4.jpg

EC2インスタンスの構築

やっと、EC2まで辿り着きました。Amazon Elastic Compute Cloud(EC2)は、AWSにおける仮想サーバのことです。今回負荷分散のために、2つのインスタンスを構築します。
EC2.jpg

EC2インスタンスの作成

1.AWSマネジメントコンソールEC2をクリック⇒左のメニューからインスタンスを選択⇒インスタンスの作成ボタンを押下します。
2.インスタンスの種類にAmazon Linuxを選択します。
ec21.jpg
3.インスタンスタイプ選択画面に、無料利用枠対象のタイプを選択します。
ec22.jpg
4.詳細設定画面に、VPCとサブネットを指定します。
ec23.jpg
5.ストレージを追加します。
ec24.jpg
6.APサーバー用セキュリティグループを指定します。
ec25.jpg
7.最後に、EC2にログインするためのキーペアをダウンロードし、インスタンスの作成ボタンを押下し、インスタンス作成が完了です。
ec26.jpg

ELASTIC IPの関連付け

上記のEC2インスタンスに対して、静的なパブリックIPアドレスを付与するために、ELASTIC IPの割り当てが必要です。
1.左のメニューからELASTIC IPを選択⇒新しいアドレスの割り当てボタンを押下します。
eip1.jpg
2.EC2インスタンスに関連付けを行います。
eip2.jpg

EC2環境の初期設定

Tera TermなどのSSHクライアントを使って上記のELASTIC IPを入力し、EC2インスタンスにアクセスします。
ec27.jpg
「ec2-user」ユーザーを使って、先ほどダウンロードしたキーでログインします。
ec28.jpg

tera term.jpg

無事にログインできたら、EC2の初期設定を行います。

# 最新のソフトウェアにアップデート
$ sudo yum update -y
# ホスト名変更
$ sudo hostname ec2-1-cinpo1
$ sudo vim /etc/sysconfig/network
HOSTNAME=ec2-cinpo1;
# ホストファイルを編集し、AWSから払い出された<Private IP>を書く。
$ echo "17X.XX.X.X30 ec2-cinpo1" |sudo tee -a /etc/hosts
# ホスト名確認
$ hostname -f
# タイムゾーン変更
# /etc/sysconfig/clockの編集
$ echo -e 'ZONE="Asia/Tokyo"\nUTC=false' | sudo tee /etc/sysconfig/clock
# タイムゾーンファイルの変更
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# 結果確認
$ date
# Java 8のインストール
$ sudo yum install java-1.8.0-openjdk.x86_64
# Java 8の選択
$ sudo alternatives --config java
# 結果確認
$ java -version

2台目のEC2を構築します。

上記と同じの手順で、2台目のEC2インスタンスを構築します。

Aurora環境へのデータ移植

# Auroraサーバーに接続するために、MySQLクライアントをインストールします。
$ sudo yum install mysql
# Auroraサーバーに接続し、データベースの新規作成やデータの移植を行います。
$ mysql -h <RDSインスタンスのエンドポイント> -u username -p
$ create database sampleDB

...下記省略...

mysql.jpg

Spring Bootアプリのデプロイ

1.Tera TermのSSH SCP転送を利用し、Spring Bootアプリをローカルから上記2つのEC2インスタンスにアップロードします。
2.完了後に、従来通りにSpring Bootアプリを起動します。

$ java -jar XXXXXXXX.jar

boot.jpg

3.この時点で、ELASTIC IP:8085 にアクセスしてみれば、アプリ画面が表示されるはずです。

ロードバランサーの作成

最後に、ロードバランサー(Application Load Balancer [ALB])を適用し、APサーバーの負荷分散を実現します。
ALB.jpg

ターゲットグループの構築

ALB適用の前提条件として、EC2インスタンスをターゲットとしてターゲットグループに登録する必要があります。ALBは、クライアントにとって単一の通信先として機能し、登録済みターゲットに受信トラフィックを分散します。
1.AWSマネジメントコンソールEC2をクリック⇒左のメニューからターゲットグループを選択⇒ターゲットグループの作成ボタンを押下します。
ALB1.jpg
2.ターゲットグループ一覧画面にて選択済みのターゲットグループにターゲットの登録を行います。
ALB2.jpg
3.EC2インスタンスをターゲットとしてターゲットグループに登録します。
ALB3.jpg

ALBの構築

1.左のメニューからロードバランサーを選択⇒ロードバランサーの作成ボタンを押下し、Application Load Balancerを選択します。
ALB4.jpg
2.名前を適当に指定し、リスナーとサブネット等を指定します。
ALB5.jpg
3.セキュリティグループを指定します。
ALB6.jpg
4.先ほど作成されたターゲットグループを指定します。
ALB7.jpg
5.作成中のステータスとなり、1~2分後に利用可能となります。
ALB8.jpg

動作確認

以上、AWS環境の構築からアプリのデプロイまで完成しました。
http://:ポート/にアクセスすれば、アプリ画面が表示されたら完成です。
final1.jpg