Amazon S3のVPCエンドポイントゲートウェイ型・インターフェース型を使ってみた

#はじめに

2021/2にVPCエンドポイントインターフェース型（PrivateLink）にAmazon S3が追加されました！
（AWS公式サイトより）
https://aws.amazon.com/jp/blogs/aws/aws-privatelink-for-amazon-s3-now-available/

これにより**Amazon S3サービスのみ** ゲートウェイ型・インターフェース型両方のVPCエンドポイントが使用できるようになりました。そのため今回は2つの接続の違いを実際にサービスを触りながら理解したいと思います:hugging:


#目的

■VPCエンドポイントのゲートウェイ型・インターフェース型について理解する。
■両方のVPCエンドポイントを使用して、同じS3バケットへの接続を試してみる。


#参考サイト

理解するにあたって、以下のサイトを参考にさせていただきました。
とても分かりやすくまとめられているため、まずはこちらを一読していただきたいです。

https://dev.classmethod.jp/articles/vpc-endpoint-gateway-type/
https://dev.classmethod.jp/articles/private-link-for-s3/
https://blog.serverworks.co.jp/privatelink-for-amazon-s3_

#VPCエンドポイントとは

VPC およびサポートされている AWS のサービスと、AWS PrivateLink を利用した VPC エンドポイントサービスとの間のプライベート接続を可能にします。VPC エンドポイントは、インターネットゲートウェイ、NAT デバイス、VPN 接続、または AWS Direct Connect 接続を必要としません。VPC のインスタンスは、サービスのリソースと通信するためにパブリック IP アドレスを必要としません。VPC と他のサービス間のトラフィックは、Amazon ネットワークを離れません。（公式サイトよりhttps://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints.html）

つまりインターネット経由で接続せず、AWS内のプライベートな空間だけでサービスに接続できるよ！っていうものです。
またVPCエンドポイントがあるAWSサービスであれば、オンプレ環境からも接続が可能になるため、安全性を高めることができます。

#ゲートウェイ型について
サポートされる AWS のサービスを宛先とするトラフィックのルートテーブルで、ルートのターゲットとして指定するゲートウェイ（S3とDynamoDBのみサポート）


![vpcエンドポイント(ゲートウェイ型）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/cb678488-2e74-59c2-b32b-3ac9c804a5eb.png)

Subnet1のroute tableにはS3のVPCエンドポイントが設定されていないため、インターネット経由でのS3接続となりますが、Subnet2にはS3のVPCエンドポイントが設定されているため、エンドポイント経由での接続が可能です。
この時Subnet2はプライベートサブネットですが、エンドポイントがS3に接続するために**グローバルIPアドレス**に変換してくれるため、接続時にはグローバルIPアドレスで接続をしてくれます。



#インターフェース型について
サポートされるサービスを宛先とするトラフィックのエントリポイントとして機能するサブネットの IP アドレス範囲のプライベート IP アドレスを持つ Elastic Network Interface （ENI）


![vpcエンドポイント(インターフェース型）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/d9731994-8e3e-08ab-fa65-9f83b32e6c53.png)

ENIを利用してVPC内部にサービスのエンドポイントが作成されるため、接続時にはエンドポイントが**プライベートIPアドレス**で接続をしてくれます。



他にもこのようにな違いがあります。

| 観点 | ゲートウェイ型 | インターフェース型 |
|:------------|:------------|:------------|
| サービスのアクセスに利用するIPアドレス     | グローバル IPアドレス       | パブリック IPアドレス       |
| 接続先     | サービス DNS 名（例 s3.ap-northeast-1.amazonaws.com ） | エンドポイント固有の DNS ホスト名(例 vpce-xxxxxxxx-xxxxxxx.s3.ap-northeast-1.vpce.amazonaws.com)       |
| オンプレから利用可能      | 不可       | 可能        |
| リージョンをまたいだ利用        | 不可          | 可能           |
| 料金    | 無料     | 有料 |



#実際にやってみた！


まずは検証用に以下の構成を作成します。
![20210207-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/8af1aabc-9b27-d19f-e73b-554db86eabcb.png)

（※作成方法の詳細は割愛させて頂きますが、以下の手順で作成しました。）
①VPC内にパブリック・プライベートサブネットを１つずつ作成し、各サブネット毎にルートテーブルを作成
②インターネットゲートウェイを作成し、VPCにアタッチ後、パブリックサブネット側のルートテーブルにインターネットゲートウェイを設定
③各サブネットにEC2を配置
④接続用のS3バケットを作成（※今回は接続確認だけなので、「パブリックアクセスをすべてブロック」をオフで作成しています）
⑤プライベートサブネットのEC2からS3バケットに接続できるようIAMロール（IAMポリシー：AmazonS3FullAccess）を作成し、EC2にアタッチ

#ゲートウェイ型での接続

まずはゲートウェイ型のVPCエンドポイントを作成し、プライベートサブネットのEC2からS3バケットに接続できることを確認します。

![20210207-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/c3c6fd62-bdb3-d2e1-9a96-7b0b68ed4dad.png)

①VPCサービスより「エンドポイント」を選択し、「エンドポイントの作成」を選択します。
![１.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/94a07d03-348f-ec88-c48a-aad96f54d89f.png)

②サービス名で「S3」を検索すると、「Gateway」「Interface」両方のエンドポイントがヒットします。ここでは**「Gateway」**を選択します。あとは以下の設定をし、「エンドポイントの作成」を選択します。
　VPC：作成したVPC名
　ルートテーブル：作成したプライベートサブネット
　
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/a2f1978e-7763-99c4-7d84-e2fde431549f.png)
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/eca891fc-f9e0-2f28-d5b2-68248c72c613.png)

③エンドポイントが作成され、プライベートサブネットのルートテーブルにエンドポイントのルートが作成されていることが確認できます。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/ad2f6b8a-3e45-d17d-8811-055d51e4343f.png)
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/f81f69d1-b41f-3458-4fb8-7e1a85118fa4.png)

④プライベートサブネットのEC2よりS3に接続できるか確認します。接続には**サービス DNS 名**を使用します。
　※プライベートサブネットのEC2へログインする時は、パブリックサブネットのEC2を踏み台に利用してプライベートサブネットのEC２に接続しています。分からないよ！って方は前回私が書いたこちらの記事ををぜひご覧下さい。（https://qiita.com/AWS11077/items/8aaa37b7568cf07577f8）

 コマンド：**aws s3 ls --region ap-northeast-1**
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/a42f017e-6ace-61b4-1b94-1187829ac1a0.png)

S3バケットに接続できました。
またnslookupによりサービスのアクセスに利用するIPアドレスが**グローバルIPアドレス**になっていることを確認できます。

#インターフェース型での接続

次にインターフェース型のVPCエンドポイントを作成し、S3バケットに接続できることを確認します。

![20210207-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/8652c540-b115-1a42-2c01-85751567b27f.png)

①「エンドポイントの作成」よりサービス名で「S3」を検索し、**「Interface」**を選択します。あとは以下の設定をし、「エンドポイントの作成」を選択します。
　VPC：作成したVPC名
　ルートテーブル：作成したプライベートサブネット
　**セキュリティグループ：インバウンドにHTTPSのポートが空いたものを選択(※要注意※)**

![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/f3b9afd8-35c0-d8f5-547c-8515e1b5c078.png)
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/4c7fb7f2-10cb-9b5e-e30d-9f92260eb98c.png)
![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/8c093c50-df5f-82ae-5a58-88f610da64cc.png)

②エンドポイントが作成されたことを確認できました。
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/914643c4-3f9d-8a03-7e8b-e851f3a528fb.png)

④プライベートサブネットのEC2よりS3に接続できるか確認します。接続には**エンドポイント固有の DNS ホスト名**を使用します。
 コマンド：**aws s3 --region ap-northeast-1 --endpoint-url https://bucket.vpce-XXXXXXXXX-XXXXXXX.s3.ap-northeast-1.vpce.amazonaws.com ls**

![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/26268389-727c-72b4-f309-a289f4da90f7.png)


S3バケットに接続できました。
またnslookupによりサービスのアクセスに利用するIPアドレスが**プライベートIPアドレス**になっていることを確認できます。
またこの時、nslookupで出てきたプライベートIPアドレスとAWSマネージメントコンソールのエンドポイントのIPアドレスが一致することを確認できます。

※はまったポイント※
インターフェース型のエンドポイントに接続する場合もオプションで「--region ap-northeast-1」を指定する必要があります。


#最後に

今回2種類のVPCエンドポイントを使用し、同じS3バケットに接続する方法を試してみました。
インターフェース型・ゲートウェイ型各々の特徴をつかむことができたのではないかなと思います:grin:
実際に手を動かしながらやってみることは大事ですね！！

またこの記事はAWS初学者を導く体系的な動画学習サービス「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com

動画形式でいつでも学ぶことができて、とても分かりやすくサービスを知ることができます。
興味がある方は、一緒にAWSを学んでいきましょう～～！