AWS S3エンドポイント インターフェース型でローカルから直接S3にアクセスする

# ゲートウェイ型とインターフェース型の違い

S3エンドポイントには、ゲートウェイ型とインターフェース型があります。インターフェース型は PrivateLink とも呼ばれます。ゲートウェイ型ではエンドポイントを作成するとルートテーブルにルートが追加されます。一方インターフェース型では、エンドポイントのネットワークインターフェースが作成され、プライベートアドレスが割り当てられます。つまり、両者の大きな違いはエンドポイントを通る際にIPアドレスの変換が起こるかどうかだと認識しております。間違い等ございましたらご指摘頂けますと幸いです。

| Amazon S3 のゲートウェイエンドポイント| Amazon S3 のインターフェイスエンドポイント|
|---|---|                                                       |
| Amazon S3 パブリック IP アドレスを使用する| VPC のプライベート IP アドレスを使用する|
| オンプレミスからのアクセスできない| オンプレミスからアクセスできる|
| 別のリージョンからアクセスできない| 別の AWS リージョンからのアクセスできる|

# S3エンドポイントを作成する

「エンドポイントの作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/e73a768a-26ef-948b-7f0a-016b01274769.png)

フィルターのテキスト部分に「s3」と入力し、エンターを押します。表示される2つのエンドポイントのうち、タイプが「Interface」となっているものを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/f8d6d8ec-3d38-fb52-fbb3-4ac9e320ae6c.png)

VPC と AZ（アベイラビリティゾーン） を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/49a6fdd9-7f53-6365-1f16-1bbcbd0fbd92.png)

セキュリティグループを選択します。ここでは VPC のデフォルトのセキュリティグループを選択しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/e2b6eda9-24bc-69f2-e27f-dd88f109754c.png)

ポリシーを設定します。ここではフルアクセスを選択しています。なお、このポリシーはエンドポイント作成後に変更することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/9715132f-0994-65fd-6eba-c59e53e69a79.png)

「エンドポイントの作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/04e15a44-c087-4f4e-f29d-61e0b89474e0.png)

# S3にアクセス

`--endpoint-url` には以下のDNS名のいずれも利用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/a7fdc94e-e1ab-6f6e-575e-33d85640e715.png)

```
PS C:\WINDOWS\system32> aws s3 --region ap-northeast-1 --endpoint-url https://bucket.vpc-endpoint-id-o16cnn3y.s3.ap-northeast-1.vpce.amazonaws.com cp C:\Users\user\Documents\test_upload.txt  s3://bucket-name/
upload: ..\..\Users\user\Documents\test_upload.txt to s3://bucket-name/test_upload.txt
```

# ポリシーを設定

次にポリシーを設定してエンドポイントを経由しているか確認してみます。私の環境ではポリシーを設定してから反映されるまで少し時間がかかりました。

```
{
    "Id": "Policy1623456633533",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1623456631884",
            "Action": "s3:GetObject",
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::bucket-name/*",
            "Principal": "*"
        }
    ]
}
```

以下のようにオブジェクトをダウンロードすることができました。

```
PS C:\WINDOWS\system32> aws s3 --region ap-northeast-1 --endpoint-url https://bucket.vpc-endpoint-id-o16cnn3y.s3.ap-northeast-1.vpce.amazonaws.com cp s3://bucket-name/test_upload.txt C:\Users\user\Documents
download: s3://bucket-name/test_upload.txt to ..\..\Users\user\Documents\test_upload.txt
```

一方、アップロードは Access Denied になり失敗しました。

```
PS C:\WINDOWS\system32> aws s3 --region ap-northeast-1 --endpoint-url https://bucket.vpc-endpoint-id-o16cnn3y.s3.ap-northeast-1.vpce.amazonaws.com cp C:\Users\user\Documents\test_upload.txt s3://bucket-name/
upload failed: ..\..\Users\user\Documents\test_upload.txt to s3://bucket-name/test_upload.txt An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
```

エンドポイントを作成したユーザーでも使用するためには明示的な許可が必要だということがわかりました。

# 参考記事

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/privatelink-interface-endpoints.html