Amazon VPC エンドポイント の GatewayとInterface


#1.GatewayとInterface#

下記の通り、VPCエンドポイントの方式には、GatewayとInterfaceがある。Gatewayはs3とdynamodのみ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/297f4b87-dc94-9c49-c057-52c4a9bce1b7.png)

##Gateway##
VPCのルートテーブルを書き換えてVPCエンドポイントのゲートウェイ経由でAWSのAPIエンドポイントへアクセスする。
ゲートウェイVPCエンドポイントではAWSのAPIへはパブリックIPへ向いており、*アクセス制御はゲートウェイのアクセスポリシーで行います。

[Feb 2, 2021]S3がInterface型にも対応しました。

https://qiita.com/leomaro7/items/162024b2ddec25e121ca

##Interface##
サービスのエンドポイントとENIをPrivateLinkと呼ばれるものでリンクされます。
DNSを使ってENIのプライベートIPに<サービス名>.<リージョン>.amazonaws.comのようなAレコードが設定されます。
インターフェイスVPCエンドポイントではENIに対してアクセスするため、*アクセス制御はセキュリティグループで行います。*

##比較##

||Gateway型|PrivateLink(Interface型)|
|---|---|---|
|アクセス制御|エンドポイントポリシー。IAM Policyと同じ構文でアクセス先のリソースを制限可能。|セキュリティグループ。セキュリティグループでアクセス元IP、ポートを制御可能。対象のサービスの特定のリソースへのアクセス制御は不可。|
|利用料金|無料|有料|
|冗長性|ユーザー側で意識する必要なし|マルチAZで配置するように設定する|


詳しくは下記のページが参考になりました。

https://devlog.arksystems.co.jp/2018/05/11/4896/#toc_id_1

#2.Gateway#
ここでは、[com.amazonaws.ap-northeast-1.s3]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a7ae41dd-c610-98d8-f932-49c34b43a080.png)

エンドポイントにアクセスできるVPCとサブネットを指定します。
ここでは、わざとカスタムで特定のバケットに対し、GetとPutのみ許可するようなポリシーを設定しています。詳細は、[Amazon S3 のエンドポイントポリシーの使用
](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints-s3.html#vpc-endpoints-policies-s3)を参考にしてください。

```
{
  "Statement": [
    {
      "Sid": "Access-to-specific-bucket-only",
      "Principal": "*",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::naata-vpcep",
                   "arn:aws:s3:::naata-vpcep/*"]
    }
  ]
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7eae57e2-8826-be03-437f-45e4f8ea4afc.png)

なお、ルートテーブルに以下のとおり、追加されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a921bcf6-6670-14b4-6d29-4e141d291d94.png)

検証してみます。

特定のバケットへのGetとPutのみ許可しているので、これはもちろんアクセスできません。

```
aws s3 ls --region ap-northeast-1
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
```

下記のとおり、特定のバケットへのputが成功していることがわかります。

```
aws s3 cp test.txt s3://naata-vpcep
upload: ./test.txt to s3://naata-vpcep/test.txt
```


#3.Interface#

ここでは、プライベートサブネットに配置してあるEC2インスタンスから、sshを利用せずセッションマネージャーを利用して接続したいと思います。

エンドポイントは同じように4つ作成すればよい。
com.amazonaws.ap-northeast-1.ssm
com.amazonaws.ap-northeast-1.ssmmessage
com.amazonaws.ap-northeast-1.ec2
com.amazonaws.ap-northeast-1.ec2messages
[Systems Manager 用 VPC エンドポイントを作成する](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/setup-create-vpc.html)

「com.amazonaws.ap-northeast-1.ssm」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/666792ad-afdb-468c-392f-e4baad2cd0cd.png)

VPCエンドポイントを設定するVPCを選択して、ENIを配置するサブネットを選択します。
[プライベート DNS 名を有効にする]で「このエンドポイントで有効にする」にチェックを入れます。
【注意】
「このエンドポイントで有効にする」でチェックを入れている場合、VPCの設定で**DNS 解決**と**DNS ホスト名**を有効にしておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/1325a199-5d77-f2b5-042d-56655177e4f2.png)
ENIに設定するセキュリティグループを選択します。※対象のEC2からHTTPS(443)を受け取れるセキュリティグループとするのが基本です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c010db3b-7e51-8d7e-38cc-82480101f7ea.png)

作成されたら、DNS Namesが3つ作成されと思います。
 <エンドポイントID>-XXXXXXXX.ssm.<リージョン>.vpce.amazonaws.com
 <エンドポイントID>-XXXXXXXX-<AZ>.ssm.ap-northeast-1.vpce.amazonaws.com
 ssm.ap-northeast-1.amazonaws.com
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7f081f95-3cb4-da20-661a-8cdf8906a839.png)

セッションマネージャを確認し、接続できるか確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c86408b8-0522-b6cc-cb9d-ae68616cb95f.png)

コマンドを打てるコンソールまでは開いたが、何も反応しない。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/ca20cd1e-744d-0f60-6e39-255c8915aa0e.png)

そこで、[こちら](https://qiita.com/takarake/items/04e4b4f853229d8ca926)のページにある内容で解決！
セッションマネージャーのログの出力先として設定されている s3やCloudWatch Logsのロググループの設定を確認し、接続することができた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/cee4e313-2ea5-1dc0-a8c4-48481fc4fc30.png)