プライベートサブネットにEC2を置いたWebアプリケーションを作成する①

前章: [プライベートサブネットにEC2を置いたWebアプリケーションを作成する ーイントロー](https://qiita.com/RHIC-0819/items/76f14f82c6d6c7aadb68)

## プライベートサブネットにEC2インスタンスを配置してSession Managerで接続する

今回作成するアプリケーションは、組織内部のみでの利用を想定しており、外部からのアクセスをできる限り許可しないような形でEC2インスタンスを配置していきます。

ここで作成するゴールはEC2にSession Managerからアクセスするところまでがゴールとなっています。

![aws-qiita-ec2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821799/94d4dd69-ddb1-8f39-6c46-76901e79aab8.png)


## VPCの用意
まずマネジメントコンソールにログインし、VPCの作成を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821799/ba8128b0-d238-312e-5592-e4280592cad5.png)

作成するリソースは、VPCなどを選択することとでサブネットまで一度に作成することが可能です。CIDRブロックは、VPCでは極力大きく用意することが推奨されているため、`10.0.0.0/16`を選択します。

最終的に2つのAZにまたがってWebサーバーを配置し負荷分散を行うため、デフォルトのまま作成を行います。

## EC2インスタンスの作成
作成したプライベートサブネットにEC2インスタンスを配置していきます。

Session Managerを用いて接続するためにはEC2インスタンスにSSMエージェントのインストールが必要ですが、そこまで説明しないのでAmazon Linuxのように事前にインストールされているものを推奨します。

ネットワーク設定では、右上の編集を押し新しいセキュリティグループを作成します。この時に、インバウンドセキュリティグループのルールはデフォルトでSSHのものが設定されていますが、削除してください。

また、これはオプションですがEBS上に機密情報を載せる場合にはEBSの暗号化を行うのでストレージのアドバンストを選択し、暗号化済みに設定します。KMSはデフォルトのものを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821799/078cb03d-5327-3359-aeb8-abafae166ee3.png)


## IAMロールの作成
Session ManagerがEC2インスタンスにアクセスするために必要なIAMロールを以下の公式ドキュメントのガイドに従って作成します。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-instance-profile.html

### IAMポリシーの作成
`AmazonSSMManagedInstanceCore`というポリシーを利用すれば簡単に設定できますが、今回はローカルマシンとの通信をKMSキーで暗号化するために、最小限の権限を付与したポリシーを作成します。

IAMからポリシーの作成を選択し、「ポリシーエディタ」でJSONを選択します。その中に以下を書き込みます。
```JSON
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:UpdateInstanceInformation",
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "key-name"
        }
    ]
}
```

Statementの前半はSSMに権限を与えるポリシーで、後半がKMSでの暗号化の設定になっています。`key-name`はKMSのARNに置換してください。

### ロールのアタッチ

ロールの作成をクリックし、
「信頼されたエンティティタイプ: `AWSのサービス`」→「ユースケース: `EC2`」
と進んだら先ほど作成した許可ポリシーを選択しロールを作成します。

次に、作成済みのEC2インスタンスの詳細へ移動し、「アクション」→「セキュリティ」→「IAMロールを変更」から今作成したものを選択して完了です。

## NATゲートウェイを配置する
EC2インスタンスにmysqlやjavaをインストールするためにインターネットへの接続が必要になります。そのために、NATゲートウェイを設置します。

マネジメントコンソールのVPCダッシュボードからNATゲートウェイを選択しEC2インスタンスを置いているのと同じAZ内の**パブリックサブネット**に作成します。

作成したNATゲートウェイはプライベートサブネットのルートテーブルに送信先を`0.0.0.0/0`として関連付けてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821799/c4359203-f559-fa94-b852-5ef6e7ae6159.png)

このようにプライベートサブネットのルートテーブルが設定されていればOKです。

NATゲートウェイの作成には数分時間を要するので、ステータスがactiveになったら次のステップへ進んでください。

## Session ManagerでEC2インスタンスに接続する
ここまで長い道のりでしたが、これでようやく接続する準備が完了しました。

EC2の詳細画面を開き、接続をクリックすると4つのタブがあり、セッションマネージャーを選択すると、右下に接続ボタンが表示されているはずです。

セッションマネージャーが有効化されるまで、テスト時には20分程度要したので、待ってみてください。

もし1時間以上待っても、エラーが表示されていたり、接続ボタンがグレーアウトしている場合はIAMロールが正しくアタッチされているか、HTTPSのアウトバウンドが許可されているか、ルートテーブルが正しく設定されているかを確認してください。

接続すると以下のような背景が真っ黒の画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821799/4dfe1386-4ecb-d128-42fe-1f98759db0a4.png)

表示している通り、session managerでログインすると、初めはssm-userというユーザーでログインしていることがわかります。

一方で、EC2インスタンスにSSH等で接続したことがある方は、ec2-userというユーザ名でログインしたと思います。このままではデフォルトで作成されているec2-userのファイルにアクセスできないため、ログインをし直す必要があります。

```shell
sudo su --login ec2-user
```
とすることでec2-user権限で入りなおします。


これで今回のゴールである、Session Managerでの接続が完了です！

次の章では、RDSとALBを配置してそれぞれの接続を行っていきたいと思います。


---
**記事一覧**
[プライベートサブネットにEC2を置いたWebアプリケーションを作成する ーイントロー](https://qiita.com/RHIC-0819/items/76f14f82c6d6c7aadb68)
[プライベートサブネットにEC2を置いたWebアプリケーションを作成する①](https://qiita.com/RHIC-0819/items/25bff36c3aacf92af28e)
[プライベートサブネットにEC2を置いたWebアプリケーションを作成する②](https://qiita.com/RHIC-0819/items/f3755e02e16694792c4e) <- 次はこちら
[プライベートサブネットにEC2を置いたWebアプリケーションを作成する③](https://qiita.com/RHIC-0819/items/ab4883b6fa958b3d908b)