OCIオブジェクト・ストレージのプライベート・エンドポイントを試してみる。

オブジェクト・ストレージのプライベート・エンドポイント機能がリリースされました。
https://docs.oracle.com/ja-jp/iaas/releasenotes/objectstorage/private_endpoints.htm

これまでVCN内のプライベート・サブネットのインスタンスからオブジェクト・ストレージを利用するためには、サービス・ゲートウェイ（またはNAT GW）経由でパブリックIPを持つオブジェクト・ストレージのサービスにアクセスする必要がありました。

プライベート・エンドポイントを使用すると、パブリックのエンドポイントを使わず、指定したサブネット内のプライベートIPに紐づいたFQDNを使ってオブジェクト・ストレージにアクセスできるようになります。


![image-20240829093433676.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/9f618e92-abc3-834b-625a-df85aed4a580.png)



ちなみにプライベート・エンドポイントを設置しただけでは既存のサービス・ネットワークでのアクセスは利用可能なままなので、もしVCN以外からのアクセスを拒否したいような場合には、IAMポリシーでネットワーク・ソースを利用して対象のバケットに対するアクセスを制限する必要があります。（今日はここは実施しません。）



まずはプライベート・ネットワーク内のインスタンスからプライベート・エンドポイントを使ってオブジェクト・ストレージにアクセスができるかを試してみます！

ドキュメントは利用前に読んでおきます。

https://docs.oracle.com/ja-jp/iaas/Content/Object/Tasks/private-endpoints.htm



## 1. オブジェクト・ストレージのプライベート・エンドポイントの作成

対象のオブジェクト・ストレージとしてはすでに作成済みのバケットやオブジェクトを利用するので、さっそくプライベート・エンドポイントを作ります。

1. メニューの「オブジェクト・ストレージとアーカイブ・ストレージ」→「プライベート・エンドポイント」を開きます。

2. 「プライベート・エンドポイントの作成」をクリックします。
![image-20240829095028317.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/f654b055-226a-b03d-4ad6-7a41aa86e559.png)


3. 以下の項目を入力して「作成」ボタンをクリックします。アクセス・ターゲットは絞り込まなくてもよいですが、今回は特定のバケットのみに使えるプライベート・エンドポイントとしました。

   - 名前：任意の名前を入力

   - DNS接頭辞：任意の値を入力。FQDNの先頭の部分になります。ここではtkpeとしてみました。

   - VCNの選択：既存のVCNを選択

   - サブネットの選択：既存のVCNの中のプライベート・サブネットを選択

   - アクセス・ターゲット：（ワイルドカード（*）ですべてを指定することもできます）

     - ネームスペース：オブジェクト・ストレージのネームスペースを入力。不明な場合は「テナンシ詳細」から確認できます。
     - コンパートメントOCID：対象のバケットのコンパートメントのOCIDを入力。
     - バケット名：対象のバケット名を入力
      ![image-20240829095249436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/d91a3962-d42f-964b-c5e3-73cfdf0448e7.png)
      ![image-20240829095534974.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/28ee0ea8-7715-e0cf-b3e6-75b08108b9dd.png)


4. 作成が完了するまで少し待ちます。この画面は閉じてしまっても問題ありません。
   ![image-20240829100017987.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/a90a8f7e-4348-bf9a-6d52-309bb6abd46b.png)


5. ステータスが「作成中」から「アクティブ」になったら作成完了です。できあがったプライベート・エンドポイントを確認するため、名前のリンクをクリックします。
   ![image-20240829100146621.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/700a69e1-dacb-63e1-d9e2-2d3a8f2d1208.png)

   ↓
   ![image-20240829100228826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/6acf5c0a-fef1-fd13-3f49-bfd335f8cf0e.png)


6. プライベート・エンドポイントに、指定したIPアドレスとFQDNが割り当てられていることが分かります。アクセス・ターゲットも指定したコンパートメントやバケットが設定されています。これで作成は完了です！
  ![image-20240829100426376.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/188e5d19-b041-b4ea-f5b7-8a3dd298639d.png)
![image-20240829100522336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/f7f1cd95-5f85-27ac-48a8-fec219534ad5.png)




## 2. プライベート・エンドポイント経由でオブジェクト・ストレージを利用してみる

さっそくできあがったプライベート・エンドポイントを使ってインスタンスからオブジェクト・ストレージにアクセスしてみます。ここではOCI CLIを使ってバケット内のオブジェクトを参照してみます。

比較のために通常のパブリック・エンドポイントに対してのサービス・ゲートウェイ経由のアクセスと、プライベート・エンドポイントへのアクセスを両方実施してみます。
![image-20240829101012604.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/fdbc1614-2a83-e84a-10db-7cc43e8d9b9f.png)



1. サブネットのルート表には、シンプルにサービス・ゲートウェイ経由のルート・ルールだけを入れてあります。
   ![image-20240829101257291.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/bd8e70ef-c1f7-5d16-ce3d-4698e9d9005c.png)


2. サブネットのセキュリティ・リストでは、エグレスは全て許可されています。イングレス・ルールではプライベート・エンドポイントがHTTPSのリクエストを受け付けられるように、プロトコル：TCP、宛先ポート：443のルールを追加しています。
   ![image-20240829101450823.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/c30dc6cf-ea50-1466-25d3-2eddf7e27768.png)


3. まずはインスタンスから通常のエンドポイントに対してCLIでアクセスします。問題なくアクセスできることがわかります。今回はこのようなオブジェクトのheadコマンドを利用しました。

   ```
   oci os object head --name <オブジェクト名> --bucket-name <バケット名> --namespace <ネームスペース名>
   ```

   ![image-20240829101655001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/a4e3f3ba-d894-2034-d0ee-6d8fde203b77.png)


4. 続いて、CLIの `--endpoint` オプションでエンドポイントのURLをプライベート・エンドポイントに上書きして同じコマンドを発行してみます。さきほどと同様の結果が返ってきましたのでアクセスできたことが確認できました！

   ```
   oci os object head --name <オブジェクト名> --bucket-name <バケット名> --namespace <ネームスペース名> --endpoint https://<プライベート・エンドポイントのFQDN>
   ```

   ![image-20240829101943714.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/5976490d-4500-e964-6fa1-1ebecaa3062f.png)


5. これだけだとわかりにくいので、サービス・ネットワーク側には通信できない状態を作ります。一度サービス・ゲートウェイ経由のルート・ルールを削除してから再度同じことを試してみます。
   ![image-20240829102149830.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/62cf4288-1b92-c40d-b7b6-115216011d0b.png)


   ![image-20240829102244313.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/f878c1bd-7676-b60f-1dc4-877fd2733e3c.png)


6. 先ほどと同様に、パブリック・エンドポイントとプライベート・エンドポイント両方宛てにコマンドを発行してみます。
   プライベート・エンドポイント宛ては問題なく結果が返ってきます。

   ```
   oci os object head --name <オブジェクト名> --bucket-name <バケット名> --namespace <ネームスペース名> --endpoint https://<プライベート・エンドポイントのFQDN>
   ```

  ![image-20240829102455545.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/a27727e9-8b27-6b5d-b3d9-b01b40b5402d.png)


   ただし、エンドポイントを指定しない場合は、宛先に到達できないので結果がなかなか返ってきません。かなり待ってから、connection timeoutのエラーが返ってきました。

   ```
   oci os object head --name <オブジェクト名> --bucket-name <バケット名> --namespace <ネームスペース名>
   ```

   ![image-20240829102831177.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/18e541ad-d02a-f55d-b84f-c57ae88b27f6.png)


   

   

以上で、プライベート・エンドポイントを使えば完全にプライベート・ネットワーク内に閉じた状態でオブジェクト・ストレージにアクセスが可能なことがわかりました！