オブジェクト・ストレージのプライベート・エンドポイント機能がリリースされました。
https://docs.oracle.com/ja-jp/iaas/releasenotes/objectstorage/private_endpoints.htm
これまでVCN内のプライベート・サブネットのインスタンスからオブジェクト・ストレージを利用するためには、サービス・ゲートウェイ(またはNAT GW)経由でパブリックIPを持つオブジェクト・ストレージのサービスにアクセスする必要がありました。
プライベート・エンドポイントを使用すると、パブリックのエンドポイントを使わず、指定したサブネット内のプライベートIPに紐づいたFQDNを使ってオブジェクト・ストレージにアクセスできるようになります。
ちなみにプライベート・エンドポイントを設置しただけでは既存のサービス・ネットワークでのアクセスは利用可能なままなので、もしVCN以外からのアクセスを拒否したいような場合には、IAMポリシーでネットワーク・ソースを利用して対象のバケットに対するアクセスを制限する必要があります。(今日はここは実施しません。)
まずはプライベート・ネットワーク内のインスタンスからプライベート・エンドポイントを使ってオブジェクト・ストレージにアクセスができるかを試してみます!
ドキュメントは利用前に読んでおきます。
1. オブジェクト・ストレージのプライベート・エンドポイントの作成
対象のオブジェクト・ストレージとしてはすでに作成済みのバケットやオブジェクトを利用するので、さっそくプライベート・エンドポイントを作ります。
-
メニューの「オブジェクト・ストレージとアーカイブ・ストレージ」→「プライベート・エンドポイント」を開きます。
-
以下の項目を入力して「作成」ボタンをクリックします。アクセス・ターゲットは絞り込まなくてもよいですが、今回は特定のバケットのみに使えるプライベート・エンドポイントとしました。
-
ステータスが「作成中」から「アクティブ」になったら作成完了です。できあがったプライベート・エンドポイントを確認するため、名前のリンクをクリックします。
-
プライベート・エンドポイントに、指定したIPアドレスとFQDNが割り当てられていることが分かります。アクセス・ターゲットも指定したコンパートメントやバケットが設定されています。これで作成は完了です!
2. プライベート・エンドポイント経由でオブジェクト・ストレージを利用してみる
さっそくできあがったプライベート・エンドポイントを使ってインスタンスからオブジェクト・ストレージにアクセスしてみます。ここではOCI CLIを使ってバケット内のオブジェクトを参照してみます。
比較のために通常のパブリック・エンドポイントに対してのサービス・ゲートウェイ経由のアクセスと、プライベート・エンドポイントへのアクセスを両方実施してみます。
-
サブネットのセキュリティ・リストでは、エグレスは全て許可されています。イングレス・ルールではプライベート・エンドポイントがHTTPSのリクエストを受け付けられるように、プロトコル:TCP、宛先ポート:443のルールを追加しています。
-
まずはインスタンスから通常のエンドポイントに対してCLIでアクセスします。問題なくアクセスできることがわかります。今回はこのようなオブジェクトのheadコマンドを利用しました。
oci os object head --name <オブジェクト名> --bucket-name <バケット名> --namespace <ネームスペース名>
-
続いて、CLIの
--endpoint
オプションでエンドポイントのURLをプライベート・エンドポイントに上書きして同じコマンドを発行してみます。さきほどと同様の結果が返ってきましたのでアクセスできたことが確認できました!oci os object head --name <オブジェクト名> --bucket-name <バケット名> --namespace <ネームスペース名> --endpoint https://<プライベート・エンドポイントのFQDN>
-
これだけだとわかりにくいので、サービス・ネットワーク側には通信できない状態を作ります。一度サービス・ゲートウェイ経由のルート・ルールを削除してから再度同じことを試してみます。
-
先ほどと同様に、パブリック・エンドポイントとプライベート・エンドポイント両方宛てにコマンドを発行してみます。
プライベート・エンドポイント宛ては問題なく結果が返ってきます。oci os object head --name <オブジェクト名> --bucket-name <バケット名> --namespace <ネームスペース名> --endpoint https://<プライベート・エンドポイントのFQDN>
ただし、エンドポイントを指定しない場合は、宛先に到達できないので結果がなかなか返ってきません。かなり待ってから、connection timeoutのエラーが返ってきました。
oci os object head --name <オブジェクト名> --bucket-name <バケット名> --namespace <ネームスペース名>
以上で、プライベート・エンドポイントを使えば完全にプライベート・ネットワーク内に閉じた状態でオブジェクト・ストレージにアクセスが可能なことがわかりました!