VPCエンドポイントを試してみた

vpcエンドポイントのハンズオンを体験したので、概要と作成方法の記録です。
勉強途中のため一部理解が追いついていない部分がありますが、ご了承ください。

# vpcエンドポイントとは
vpcエンドポイントは、グローバルIPを持つAWSサービスに対して、vpc内から直接アクセスするための出口のこと。

オンプレだと、専用線で自社サーバと、別地域のサーバやらストレージを接続するイメージです。(うん百万かかるのに・・・)

今回は、プライベートサブネット内のインスタンスから、S3へ直接アクセスするための、vpcエンドポイントを作成します。

以下の順に進んでいきますので、よろしくお願いいたします。
間違っている箇所があればコメントで教えていただけると大変助かります:pray_tone1:

+ [利用環境] (#利用環境)
+ [S3の作成] (#S3の作成)
+ [IAMロールの作成・インスタンスへ割当] (#IAMロールの設定・インスタンスへ割当)
+ [VPCエンドポイントの作成・設定] (#VPCエンドポイントの作成・設定)
+ [動作確認] (#動作確認)
+ [VPCエンドポイントを使用しない場合のS3接続方法] (#VPCエンドポイントを使用しない場合のS3接続方法)
+ [VPCエンドポイント諸々] (#VPCエンドポイント諸々)

# 利用環境
今までに作成したVPCやサブネット、インスタンスをそのまま利用しました。
下図の赤線ルートでS3へアクセスできることが目的です。(黒線はVPCエンドポイントを使用しない場合のアクセス例)

|![vpcエンドポイント利点.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/659e747f-30fe-e789-c54f-c53d44201c3e.png)
|:-:|

# S3の作成
今までS3は作成してこなかったため、最初にS3の作成を行います。
AWSマネジメントコンソールから「S3」と検索し、「S3マネジメントコンソール」に移動します。

|![img 2020-09-15 19.19.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/ea638dba-b72c-58a2-b265-e58ab6fdba9f.png)
|:-:|

S3マネジメントコンソールに移動したら、「バケットの作成」を選択します。
私はいくつかバケットを作成しているのでバケット名が表示されていますが、初回であれば何も表示されません。

|![img 2020-09-15 19.19.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/1e0122b9-142c-e157-7a34-35297302f7b2.png)
|:-:|

S3バケットに名前をつけたら、今回は他に設定をしないので「作成」を選択します。
S3バケット名は一意の値である必要があるため、日付等を名前の後に付与すると良いようです。

|![img 2020-09-15 19.20.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/c3088466-f2cf-6ad6-a5a6-71f634027ad2.png)
|:-:|

# IAMロールの作成・インスタンスの割当
続いて、インスタンスがS3へアクセスするためのIAMロールを作成します。
(S3を作成しただけでは使えません!!まずはインスタンスがS3へアクセスできるよう権限設定をします)

AWSマネジメントコンソールから「IAM」と検索し、「IAMマネジメントコンソール」に移動します。
IAMマネジメントコンソールの左ペイン、「ロール」を選択し、「ロールの作成」を選択します。

|![img 2020-09-15 19.45.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/886f5ef1-55e9-5838-06f1-21dddb922f8e.png)
|:-:|

ユースケースは「EC2」を選択し「次のステップ」を選択します。

|![img 2020-09-15 19.46.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/c135f622-ddbc-c9c3-5d25-2a113c7065bc.png)
|:-:|

「AmazonS3FullAccess」を選択し、「次のステップ」を選択します。
※「ポリシーのフィルタ」で「S3」を入力すると良きです。

|![img 2020-09-15 19.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/dc9fbce0-0628-bbd9-bff5-bf6ad742ad07.png)
|:-:|

設定しなくても大丈夫ですが、「Name」キーの設定を行いました。

|![img 2020-09-15 19.47.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/6a13abda-504d-c32b-33dd-1907e5e99b4f.png)
|:-:|

「ロール名」、「ロールの説明」を入力し、「ロールの作成」を選択します。
※ロール名は先ほどの「Name」キーと同様の値にしています。ロールの説明は適当でも大丈夫です。

|![img 2020-09-15 19.47.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/f178558f-3424-e63a-7a1f-ba16558005c7.png)
|:-:|

ここまでで、S3へのアクセス権を持った、IAMロールの完成です。

続けて、作成したIAMロールをインスタンスへ割り当てます。

「EC2マネジメントコンソール」に移動して、インスタンスを選択後、「アクション」、「インスタンスの設定」、「IAMロールの割り当て/置換」を選択します。

なお、インスタンスが停止していると割り当てに失敗しますので、起動状態でお願いします。
下の画面はインスタンスが停止しているので、この後失敗します。

|![img 2020-09-16 9.11.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/88f32865-dc42-bbf3-f3bd-22b4b4042376.png)
|:-:|

先ほど作成したロールを選択して、「適用」を選択します。

|![img 2020-09-16 9.11.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/42e364d3-5cf8-d9c0-fd92-7668208b494b.png)
|:-:|

これでIAMロールに準じたアクセス権限がインスタンスにされたことになります。
今回は、「AmazonS3FullAccess」がインスタンスに付与されたことになります。

また、プライベートサブネット内のインスタンスに割り当てたので、VPCエンドポイントもNATゲートウェイもない今の状態では、S3へは接続できません。

実際にプライベートサブネット内のインスタンスに接続して確認してみます。

```
# 自分のPCから
$ ssh ec2-user@18.177.121.50 -i my-key.pem

# パブリックサブネットのインスタンスから
[ec2-user@10.0.1.10 ~]$ ssh ec2-user@10.0.2.10 -i DBserver.pem

# プライベートサブネットのインスタンスから
[ec2-user@10.0.2.10 ~]$ aws s3 ls
```
下図のようにプロンプトが戻ってきませんので、「Ctrl」＋「C」でAbortしましょう。

|![img 2020-09-17 20.28.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/15434560-872e-acf8-39ca-88364660c763.png)
|:-:|

# VPCエンドポイントの作成・設定
続いてVPCエンドポイントを作成します。

VPCダッシュボードから、左ペインの「エンドポイント」を選択します。

|![img 2020-09-17 20.51.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/a08fbc6a-8b61-d498-b06b-8b0714c4d1a1.png)
|:-:|

「S3」でフィルタをかけて、表示されたサービスを選択します。

|![img 2020-09-17 20.53.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/4a1a9200-3f9c-f061-2b8d-f8b73fc3069c.png)
|:-:|

vpcは自身で作成したvpcを選択します。

|![img 2020-09-17 20.53.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/112a6c3f-50d1-0961-ae0f-89da82140117.png)
|:-:|

プライベートサブネットに属しているルートテーブルを選択します。

|![img 2020-09-17 20.53.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/846eaae0-4a7b-4700-f204-dffc77466c48.png)
|:-:|

ポリシーは変更せず、「エンドポイントの作成」をすると完成です！！
先ほどと同様の手順で確認をしてみると。。。

|![img 2020-09-17 20.54.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626270/ef57171f-0538-7b2a-6201-7683a9cbb4e7.png)
|:-:|

「aws s3 ls」コマンドで応答が帰ってこなかったため、以下コマンドを使用しています。

```
$ aws s3 ls --region ap-northeast-1
```

# 少し補足
VPCエンドポイントには２種類あり、今回使用したのは無料のGateway型です。
Privatelink型は有料だそうです。

| 名前 | 実装方法 |
| ---- | ---- |
| Gateway型 | エンドポイントポリシーをルートテーブルに設定することで直接アクセスする |
| Privatelink型 |サブネットがエンドポイント用のIPを持ち、それをDNSが名前解決することでルーティングする |

# 参考文献
+ [これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版](https://www.udemy.com/course/aws-associate/)
+ [そのトラフィック、NATゲートウェイを通す必要ありますか？適切な経路で不要なデータ処理料金は削減しましょう](https://dev.classmethod.jp/articles/reduce-unnecessary-costs-for-nat-gateway/#vpc-%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AE%E5%88%A9%E7%94%A8)
+ [AWSの公式ドキュメント VPCエンドポイント](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints.html)

最後までお付き合いいただきありがとうございました:couplekiss: