VPCに関わる技術練習

## 初めに
今回、AWS VPC周り主な機能について、ご説明させていただきます。

## 主な内容
- Internet GateWay(IGW)
- Virtual Private GateWay
- Routing Table
- Network Access Control lists(NACL)
- Security Group(SG)
- Public Subnets
- Private Subnets
- Nat Gateway
- Customer GateWay
- VPC Endpints

## 構成図
![截屏2022-04-06 19.15.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/e7e5ca58-73fd-3f67-6771-140ea7a6e15f.png)


## VPCを構築
　以下の項目を設定する
- vpc名前
- Ipv4CIDRブロック
※ AWSルールによりipv4CIDRの設定範囲は16〜28間の数字です。
![截屏2022-04-05 00.03.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/ded8ec6f-3e93-8d6a-210f-0c0bbf8d8453.png)

```
IPv4 CIDR
10.0.0.0/27
ネットマスク:11111111.11111111.11111111.11100000
使用可能なIP:2^5=32個

```
### VPCのルートテーブルとNACL確認
VPCを作成すると自動的にvpcのメインルートテーブルとメインネットACLが作成してくれる
![截屏2022-04-04 19.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/d1355cca-1fea-da10-229e-ff9af7ad1ce4.png)

#### ルートテーブル
各ルートテーブルには、VPC 内で通信を有効にするローカルルートが含まれます。このルートは、デフォルトですべてのルートテーブルに追加されます。ルートを変更または削除することはできません。

![截屏2022-04-04 19.05.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/8d0c00e8-3d60-9022-3177-4c1e26f3b2e5.png)
#### NACL(Network Access Control List)
デフォルトのネットワーク ACL は、すべてのトラフィックが、関連するサブネットを出入りすることを許可するように設定されます。各ネットワーク ACL にも、ルール番号がアスタリスクのルールが含まれます。このルールによって、パケットが他のいずれの番号のルールとも一致しない場合は、確実に拒否されます。
##### NACLインバウンドルール

![截屏2022-04-04 19.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/d584b30d-b4cf-167c-b636-a41229924850.png)
##### アウトボウンドルール
![截屏2022-04-04 19.20.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/eb481fd6-fbca-bd35-026a-9d4e54ff0f42.png)

## インターネットゲートウェイを作成

![截屏2022-04-05 00.23.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/becd09eb-d05a-eb2f-5960-186334533362.png)

### インターネットゲートウェイをVPCにアタッチ
![截屏2022-04-04 19.25.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/781bde5e-a1f0-7267-88cb-8bd1600408f5.png)

### インターネットゲートウェイをvpcルートテーブルにルート追加
![截屏2022-04-04 19.28.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/58c07b53-d840-d5d4-0652-d52cf9434d24.png)

## サブネットを作成
```
vpc ipv4CIDR
ネットマスク:11111111.11111111.11111111.11100000
使用可能IP範囲
11111111.11111111.11111111.11100000から
11111111.11111111.11111111.11111111まで
全部32個IPが使用可能です。
二つサブネットを作成します。半分半分で分けていきます。
```
### private subnet
```
private subnet
11111111.11111111.11111111.11100000から
11111111.11111111.11111111.11101111まで
使用可能IP数:2^4 =16個
ブネットに割り当てる IP アドレスをすべて使用できません、各サブネットにおいて、Amazon が先頭の 4 つの IP アドレスを確保し、最後の 1 つの IP アドレスは、IP ネットワーキングの目的で確保されます。 
使用できるIPアドレス数は11個です
ネットマスク：10.0.0.0/28
```
![截屏2022-04-05 00.42.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/7bc9f9e8-9d03-ceb4-5bab-671fea2d65f3.png)
### public subnet
```
11111111.11111111.11111111.11110000から
11111111.11111111.11111111.11111111まで
ネットマスク：10.0.0.16/28
論理使用可能IP数:2^4 =16個,AWSに5個専用IPを引いて、実は使用可能のIP数は11個です。
```
![截屏2022-04-05 13.01.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/1ee21bdd-43f5-a92f-590f-0616d4bba001.png)

### サブネットのルートテーブルを設定
パブリックサブネットとプライベートサブネットの違いは、インターネットゲートウェイとルーティングできるかどうかです。

#### private subentの専用ルートを設定
##### ルート
![截屏2022-04-05 13.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/c674bda4-2da9-9e12-377b-7bd0afa0c09a.png)

![截屏2022-04-05 13.09.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/0d79a58c-10a8-f517-f328-d571470882b6.png)

#### public subnetの専用ルートを設定


![截屏2022-04-05 13.23.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/a8d81239-3ae7-3057-e5bc-0278f376571f.png)

### public subnetにEC2を起動するために、準備こと

- SG(security group)


デフォルトの VPC および作成した VPC には、デフォルトのセキュリティグループが適用されます。リソースによっては、リソースの作成時にセキュリティグループを関連付けない場合、デフォルトのセキュリティグループが関連付けられます。例えば、EC2 インスタンスを起動時にセキュリティグループを指定しない場合、デフォルトのセキュリティグループが関連付けられます。

デフォルトのセキュリティグループのルールは変更できます。デフォルトのセキュリティグループを削除することはできません。デフォルトのセキュリティグループを削除しようとした場合、Client.CannotDelete エラーが発生します。

今回カスタマイズセキュリティグループを使用させていただきます。
#### SG情報
##### アウトバウンドルール
![截屏2022-04-05 13.56.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/fcbaf256-4007-71d1-a13b-2b5d63ace8b6.png)
##### アウトバウンドルール
![截屏2022-04-05 13.57.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/94e1bba3-842a-91b5-b517-e982d5b6f2ef.png)

#### public subnetにEC2を起動
- ゴール：EC2にApacheをインストールして、デフォルトページを切り替え

#### user data

```
#!/usr/bin/env bash
su ec2-user
sudo yum install httpd -y
sudo service httpd start
sudo su -c "cat > /var/www/html/index.html <<EOL
<html>
<head>
	<meta charset="utf-8">
	<title> call to Arms</title>
	<style type="text/css"></style>
</head>
<body>
	<img src="https://media.giphy.com/media/rgTB82z9P63fTGhxQo/giphy.gif" height="100%">

</body>
</html>
EOL"
```

##### 1.AMIの選択

今回1番目のAMIを選択します
![截屏2022-04-05 14.56.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/5ddd864f-87df-d8ce-979c-3964a163e2b9.png)

##### 2.インスタンスタイプを選択

t2.microを選択して、次のステップに移します。
![截屏2022-04-05 15.40.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/65b36c1b-d827-4aa7-f5b0-56fa3e00bd19.png)

##### 3.インスタンスの設定
- ネットワークにvpcを選択
- サブネットに作成したpublic subnetを選択
- 高度な詳細に事前に用意したユーザーデータを貼付します。
- 他の設定は全部デフォルトにします。
![截屏2022-04-05 16.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/e49365ed-6956-0d98-9e8d-26080d004295.png)


![截屏2022-04-05 15.54.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/2646bd34-57d4-53be-37ba-41875f0e3f33.png)

##### 4.ストレージの追加
- 全ての設置はデフォルトにします。
![截屏2022-04-05 15.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/01d0ac68-a68b-5884-1c91-9363ceb776c8.png)

##### 5.タグの追加
- 全ての設置はデフォルトにします。

##### 6.セキュリティグループの設定
- 事前に作成したセキュリティグループを選択

![截屏2022-04-05 15.59.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/07ba2c4c-4424-14c3-5877-42dd5a829de5.png)

##### 7.確認
- 各設定項目をチェックして、起動ボタンをクリックします。
- キーペアを選択（既存のキーペアを選択するか、新しいキーペアを作成するか）
- インスタンスの作成ボタンをクリックする
※ 自分は以前キーペアがあるので、既存のキーペアを選択します。

![截屏2022-04-05 16.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/75847e10-ee00-069f-9472-848a44fe43b6.png)
![截屏2022-04-05 16.05.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/c9edec28-8928-2de8-189c-cc6596d336fa.png)

##### public subnetに起動したec2状況を確認

![截屏2022-04-05 17.42.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/077f79f3-41bd-7d92-d9e3-168db42e3491.png)

パブリックIPv4アドレスでアクセスしてみます。以下のgif表示されています。成功！
![截屏2022-04-05 17.44.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/4cfa1232-ae48-bab5-40b0-e37baf440eca.png)

### private subnetにEC2を起動
今回EC2がprivate subnetにいるので、公開IPv4アドレスがなくて、直接sshアクセスできないです。今回Systems Manager セッションマネージャーでアクセスします。
以下の記事を参照させていただきました。


https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-systems-manager-vpc-endpoints/?nc1=h_ls

####  EC2用IAMロールを作成
マネジメントコンソールから「iam」と検索して、「IAM」を選択します。

![截屏2022-04-05 18.16.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/6c3312d6-ce2a-e9f9-17e9-aa23ad120482.png)
ロール作成ボタンをクリックする

![截屏2022-04-05 18.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/eb3a1e76-d451-2831-65d8-4e24015b3c31.png)
ユースケースの選択で「EC2」を選択して,他のAWSのサービスユースケースに「Systems Manager」を選択して次に進めます。

![截屏2022-04-05 18.20.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/08229de3-189b-7b49-8b75-d677796b87ca.png)

ポリシーの検索欄に、「AmazonSSMManagedInstanceCore」と入力し、表示されたポリシーを選択して次に進みます。

![截屏2022-04-05 18.23.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/d1c87400-7311-773f-6d69-871792705939.png)

今回はタグなしで次に進みます。
名前と詳細を確認してロールを作成します。
![截屏2022-04-05 18.25.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/00dbf42c-f09e-fe13-9339-a1108fb4b332.png)

#### private subnetにEC2を起動
マネジメントコンソールから「ec2」と検索して、「EC2」を選択します。
![截屏2022-04-05 18.29.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/aa6fa833-f61e-b82d-0f1e-c9419839ba19.png)
EC2ダッシュボードから「インスタンスを起動」をクリックします。
![截屏2022-04-05 18.30.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/9423cb2e-6e68-aebf-8b9e-9a0461570c8b.png)
AMIはAmazon Linux 2 AMI (HVM)を選択します。
![截屏2022-04-05 18.31.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/ce85ec3c-8d38-67bd-2c68-2b914a8d96b8.png)
インスタンスタイプはt2.microを選択します。
![截屏2022-04-05 18.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/89586ed2-1bc1-4b71-4f03-e4a90362a166.png)
インスタンスの詳細の設定では、ネットワーク、サブネット、IAMロールを編集します。
![截屏2022-04-05 18.33.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/ebdeda54-aa36-41fb-fb11-0e098fbfac9a.png)
ストレージの追加とタグの追加はデフォルトにする
セキュリティグループは作成ずみの「SG-for-ec2-in-vpc-02」にします。
![截屏2022-04-05 18.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/2e0bc605-3d88-6e30-8848-4c6cbec34f0c.png)

セッションマネージャーでアクセスするため、キーペアは不要です。

![截屏2022-04-05 18.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/f35162d9-6d50-473e-e11a-a98058b8fbec.png)


#### Systems Manager の VPCエンドポイントを作成します。
VPCエンドポイントにはセキュリティグループをアタッチする必要があるため、先にセキュリティグループを作成します。
マネジメントコンソールから「vpc」と検索して、「vpc」を選択します。
![截屏2022-04-05 18.52.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/94b7c970-b018-d275-fa52-41ba31c64315.png)

- インバウンドルールを設定（HTTPSをVPC CIDRで許可）
- アウトバンドルールを設定（デフォルトの全許可のまま）
- vpcを選択


![截屏2022-04-06 15.58.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/82f92593-2abb-03a3-e82f-5d849183993d.png)
![截屏2022-04-06 15.59.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/a584f7ee-1bb3-05ec-f08d-495608bab80d.png)

「エンドポイント」をクリックします。
![截屏2022-04-06 16.01.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/eaa17a3d-45cd-546d-79cd-a90c910ce4de.png)

今回作成するエンドポイントは以下の3つです。
・com.amazonaws.ap-northeast-1.ssm
・com.amazonaws.ap-northeast-1.ssmmessages
・com.amazonaws.ap-northeast-1.ec2messages

ひとまずcom.amazonaws.ap-northeast-1.ssmのエンドポイントを作成していきます。
エンドポイントの名前を入力します。
![截屏2022-04-06 16.07.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/1d0b1c41-aa57-676d-84ef-514d7a48bf8c.png)
サービスにcom.amazonaws.ap-northeast-1.ssmを検索して、com.amazonaws.ap-northeast-1.ssmサービスを選択します。
![截屏2022-04-06 16.06.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/7830cc5a-871d-f238-acb6-986ca66a9b26.png)

今回作成したvpcを選択します。
プライベートDNS名の有効はデフォルトでチェックがついているので、そのままにしておきます。
![截屏2022-04-06 16.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/45e3eee0-54ce-3aaf-bb76-c9f91f4110cc.png)


プライベートサブネットを選択

![截屏2022-04-06 16.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/34d338ee-f6e4-0cab-dbe0-1a8df8fbaa02.png)
ポリシーでアクセス制御もできますが、
今回はフルアクセスのままにしておきます。
![截屏2022-04-06 16.14.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/6a0e1dea-06fb-1185-cac4-d69c45341641.png)
作成直後は「保留中」となりますが、しばらくすると「使用可能」に変わります。 
![截屏2022-04-06 16.19.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/19ebcd4d-7427-075c-6cc8-ca2bccf5b95d.png)
あとは残りのエンドポイントも同様の手順で作成します。
エンドポイントの選択以外は同様の手順なので、選択箇所以外は省略します。

## 問題
全てのエンドポイントを正しく作成した後、EC2にsession managerでアクセスしようと思いますが、接続ボタンが押せなかった。
以下の記事を調べたところ、デフォルトでは、SSM Agent は 2017.09 以降の Amazon Linux ベースの Amazon マシンイメージ (AMI) にインストールされます。SSM Agent は、Amazon Linux 2 AMI および Amazon Linux 2 ECS に最適化されたベース AMI にもデフォルトでインストールされます。最新の Amazon EKS 最適化 AMI では、SSM Agent が自動的にインストールされます。


https://aws.amazon.com/jp/premiumsupport/knowledge-center/install-ssm-agent-ec2-linux/

今回プライベートサブネットに起動されたec2のインスタンスAMIはAmazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Typeです。
デフォルトでは、ec2にSSM Agentをインストールされてるはずなんです。なんで接続できないのは謎です。

プライベートサブネットなので、EC2に入れないから、確認もできなかった。
## 改善策
s3 エンドポイントの経由でプライベートサブネットにいるec2にSSM Agentをインストールさせます。

s3エンドポイントを作成
![截屏2022-04-06 17.24.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/571b8af5-2305-acae-4345-266619505f04.png)

プライベートサブネットにいるec2のユーザーデータ

```
#!/bin/bash
cd /tmp
sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
```

上のprivate subnetにEC2を起動手順と全部同じ、ユーザーデータだけを初期設定します。

ec2を起動後、セッションマネージャーで接続ボタンが押せるようになりました

![截屏2022-04-06 17.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/e1490a93-1327-21bf-73b2-8152265e764e.png)
セッションを開始してみます。
![截屏2022-04-06 17.32.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/8f5a4f96-629a-4109-6dea-5a888d4f64be.png)
接続できました！

## s3エンドポイントでプライベート　EC2からs3に接続

せっかくS3エンドポイントを作成したので、この部分S3エンドポイントを利用して、プライベート　EC2からs3に接続していこうと思います。

セッションマネージャーでec2に接続し、既存s3リストを確認

![截屏2022-04-06 18.30.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/d2da6b3d-6590-b2f4-7a58-8a6363c20f55.png)

```
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
```
以上のエラーが返してくれました。原因としてはec2のルールにs3のアクセス権限がないため、ec2のロールを修正します。

ロールを確認

![截屏2022-04-06 18.34.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/b1d109a4-4b45-3b3f-1ffb-313023c0b504.png)
ロール名は「private-ec2-role」です、ロールリンクをクリックして、s3アクセス権限を追加します。

![截屏2022-04-06 18.37.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/f6349bf8-4216-6e2a-231a-d4ed9b6d31f6.png)
アクセス許可を追加ボタンをクリックします。ポリシーをアタッチする。
[s3]を検索して、一旦[AmazonS3FullAccess]ポリシーを追加します。
![截屏2022-04-06 18.41.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/9a2fcb99-8126-5213-4721-7e977425c706.png)

セッションマネージャーでもう一回コマンドを実行します。
![截屏2022-04-06 18.42.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/1bb36248-46fb-ea6f-c6b3-01355d3791ab.png)

既存のs3リストが全部表示できるようになりました。成功！

## NATを使用して、プライベートEC2を外部アクセス
日常の仕事でプライベートサブネット内のインスタンスのソフトウエア、ライブラリをインストールしたり、開発言語環境を構築したり、するなどタスクがあると思います。
NAT ゲートウェイは、ネットワークアドレス変換 (NAT) サービスです。NAT ゲートウェイを使用すると、プライベートサブネット内のインスタンスは VPC 外のサービスに接続できますが、外部サービスはそれらのインスタンスとの接続を開始できません。
プライベートEC2なので、googleにpingして、通らないことを確認しました。
![截屏2022-04-06 18.46.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/e5042cf9-9174-363e-93d4-00f249eca50e.png)
### NAT　ゲートウェイを作成
vpc画面にNAT ゲートウェイをクリックする
![截屏2022-04-06 18.49.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/b3af6b83-a4f7-8adc-b2b9-36c2cf5c633c.png)

- NAT ゲートウェイ名前を入力する
- サブネットを選択（必ずパブリクサブネットを選択）
- 接続タイプ：パブリック
- Elastic IPを割り当てる

![截屏2022-04-06 19.02.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/9e43faf2-3a51-e8f6-93e3-e766f3e31598.png)
NAT ゲートウェイを作成しました。

### プライベートサブネットのルートテーブルを更新

NATゲートウェイができたらプライベートサブネットのルートテーブルにNATゲートウェイのルーティングを追加します。

![截屏2022-04-06 19.07.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/fc78aa78-a14d-6bfa-8060-62577aa236b7.png)


### 確認
googleをpingしたら、通るようになりました。成功！
![截屏2022-04-06 19.08.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531066/3a6d87a3-f174-652e-bfb9-d4e3f79e7c35.png)