AWS初心者がググりながらWebアプリを構築してみた

## はじめに

AWSについてこれまで自分で何かを構築したことがなかったので、
無料枠を利用して、実践してみました。

実践にあたり、様々な記事を参考にさせていただいたので、
今後の自分用のメモとして残しておきたいものです（ブラウザがタブだらけにならないよう・・・）。

## やりたいこと

- EC2インスタンス上に、Rocket Chatをインストールしたい。
- 独自ドメインを取得して、https通信に対応したい。

## アカウント作成

<dl>
 <dt>1.AWSアカウント作成</dt>
  <dd>まずは<a href="https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsm.page-all-free-tier=1&awsf.Free%20Tier%20Categories=categories%23storage">公式サイト</a>にて、AWSアカウントを作成します。</dd>

 <dt>　</dt>

 <dt>2.初期設定</dt>
  <dd>以下を参考に、IAMユーザ作成、CloudWatchの設定などを行いました。</dd>
  <dd>・<a href="https://qiita.com/tmknom/items/303db2d1d928db720888">AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ</a></dd>
</dl>

＜補足＞

- CluodTrailの設定ついて

記事の通り設定することで、S3に作成したバケットにCloudTrailからログが出力されます。
それが影響して、アカウント作成から3日後にAWSからS3の無料枠「2,000 Put, Copy, Post or List Requests of Amazon S3」に対して85%超過したという警告メールを受信しました。

まさに、[AWSを使い始めて2日目に無料枠限度アラームがきた話](https://qiita.com/Ki2neudon/items/aefaa9edb435b4945c3a)の通りでした。

## VPC作成

<dl>
 <dt>1.用語やサービスの詳細の確認</dt>
  <dd><a href="https://aws.amazon.com/jp/vpc/">公式サイト</a>の各種ドキュメントを確認します。</dd>

 <dt>　</dt>

 <dt>2.VPC作成、サブネット作成、ルートテーブル作成、IGW作成</dt>
  <dd>以下を参考に、VPC環境の構築を行いました。</dd>
  <dd>・<a href="https://qiita.com/hiroshik1985/items/9de2dd02c9c2f6911f3b">0から始めるAWS入門①：VPC編</a></dd>
  <dd>・<a href="https://miyabi-lab.space/blog/14">AWSでWebサーバー構築！専門用語の解説とVPC環境を構築する手順（第2回）</a></dd>
</dl>

## EC2インスタンス作成

<dl>
 <dt>1.用語やサービスの詳細の確認</dt>
  <dd><a href="https://aws.amazon.com/jp/ec2/">公式サイト</a>の各種ドキュメントを確認します。</dd>

 <dt>　</dt>

 <dt>2.VPC作成、サブネット作成、ルートテーブル作成、IGW作成</dt>
  <dd>以下を参考に、EC2インスタンスにRocket Chatをインストールし、httpでアクセスできるようにしました。</dd>
  <dd>・<a href="https://miyabi-lab.space/blog/15">AWSでWebサーバー構築！EC2を作成してSSH接続する（第3回）</a></dd>
  <dd>・<a href="https://qiita.com/hiroshik1985/items/f078a6a017d092a541cf">0から始めるAWS入門②：EC2編</a></dd>
</dl>

なお、AMIは、Rocket Chatの要件に合わせて選択し、インストール手順もRocket Chatの[公式サイト](https://rocket.chat/docs/installation/manual-installation/centos/)で示される内容に従いました。

## https通信対応

<dl>
 <dt>1.https化のパターンの確認</dt>
  <dd>パターンをまとめていただいている記事があったのでまずは学習します。</dd>
  <dd><a href="https://recipe.kc-cloud.jp/archives/11067">AWSでWebサイトをHTTPS化 全パターンを整理してみました</a></dd>
  <dd>今回は、記事中の「パターン1：ELB(+証明書)→EC2」を選択しました。</dd>

 <dt>　</dt>

 <dt>2.無料ドメイン取得、Route53でホストゾーン作成、Elastic IP取得、ACMで証明書取得、ALB作成</dt>
  <dd>以下を参考に、httpsでアクセスできるようにしました。</dd>
  <dd>・<a href="https://qiita.com/hosa_progs/items/484b567e19ed11508ee3">独自ドメインを取得し、Route53 と ELB を使ってEC2上のWebアプリをHTTPS(SSL)通信に対応させてみる</a></dd>
</dl>

＜補足＞

- ターゲットのヘルスチェックについて

ALB作成後、ターゲットグループメニューの「登録済みターゲット」のステータスが「unhealthy」(説明欄にはTime outと記載あり)で、EC2インスタンスに対するヘルスチェックが不合格となってしまいました。

原因はALBとEC2インスタンスそれぞれのセキュリティグループの設定不備でした。
以下のように整理してヘルスチェックに合格しました。

①ALBのセキュリティグループで許可したタイプ(Inboundのみ記載)

-  HTTPS 

②EC2インスタンスのセキュリティグループで許可したタイプ(Inboundのみ記載)

-  SSH
-  カスタムTCP(ソースは①のセキュリティグループ)

原因特定までにだいぶ時間を要しましたが、以下を参考に解決に至りました。
[Application Load Balancer のトラブルシューティングを行い、ヘルスチェックの失敗を修正する方法を教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/elb-fix-failing-health-checks-alb/)

[Application Load Balancer のセキュリティグループ](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-update-security-groups.html)

## その他

本編とは直接関係ないですが、ご紹介です。

<dl>
 <dt>1.Rocket Chatとは</dt>
   <dd>今回インストールしたのはOSSのチャットツールです。slackライクなUIと機能を兼ね備えています。</dd>
   <dd>Jitsiとの連携することで、ビデオ会議も可能になります。</dd>
   <dd>・<a href="https://rocket.chat/">Rocket Chat</a></dd>
</dl>

<dl>
 <dt>2.draw.ioを使って構成図を描いてみる</dt>
   <dd>自身が構築しようとしている環境を可視化したい時に、以下のサービスが簡単に利用できました。</dd>
   <dd>「draw.io」は、ブラウザ上でフローチャート、UML図、ER図などを記述できます。AWSアイコンも提供されています。</dd>
   <dd>・<a href="https://www.draw.io/">draw.io</a></dd>
</dl>