Oracle Cloud Infrastructure Object Storageでホストされている静的WebサイトをCloudflareに公開



## 1.1. 概要

このチュートリアルで、OCI オブジェクト ストレージと Oracle API Gateway を使用して、HTTP 経由で静的 Web アプリケーションのホスティングを構成する手順を説明します。また、パフォーマンス、セキュリティおよび信頼性を向上させるには、静的Webサイトをコンテンツ配信ネットワーク(CDN)と統合する手順を説明します。同じ手順に従って、任意のCDNプロバイダにWebサイトを追加できます。このチュートリアルでは、Cloudflareに静的にホストされたWebサイトを追加する手順について説明します。

同じアプローチでリッチなコンパイル済みのAOT 準拠のJavaScript Web アプリケーション (サポートされているフレームワークとライブラリは、Angular 2+、ReactJs、NestJs、VueJs、Ionic など) を構成することも可能です。


## 1.2. 前提条件

1. このチュートリアルでは、Oracle Cloud へのアクセスが必要です。無料アカウントにサインアップするには、「[OCI Cloud Free Tier](https://www.oracle.com/jp/cloud/free/)」を参照してください。

2. 静的Webサイト アプリケーションが必要です。このチュートリアルでは、HTMLファイル、Javascriptファイル、CSSファイルそれぞれ１つを含むサンプル・アプリケーションを利用しています。AOT 準拠のサンプル・アプリケーション (サポートされているフレームワークとライブラリは、Angular 2+、ReactJs、NestJs、VueJs、Ionic など)も利用可能です。

3. Cloudflareアカウントが必要です。無料アカウントにサインアップするには、「[Cloudflareポータルサイト](https://www.cloudflare.com/ja-jp/plans/)」を参照してください。

4. 独自ドメイン名が必要です。今回は、有料のNameSiloドメインを利用しています。

## 1.3. Oracle Object Storageバケットを作成する

まず、OCI オブジェクト ストレージに新しいバケットを作成します。このバケットは、静的 Web サイトのホストに使用されます。

![](./images/01_create_bucket_01.png)![01_create_bucket_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/b7949b6b-b1e4-1614-2d18-aa406c178168.png)



## 1.4. 配布ファイルをバケットにアップロードする

前のタスクで作成したバケットにアプリケーション配布ファイルをアップロードします。こちらのチュートリアルで利用する[サンプルアプリケーション](https://github.com/shengjun-zh/SampleStaticWebApplication)のファイル構成がこちらになります。

```bash
├── css
│   └── style.css
├── index.html
└── js
    └── script.js
```

1. HTMLファイルをバケットのルートディレクトリにアップロードします。

    ![](./images/02_upload_file_01.png)![02_upload_file_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/79faabef-cf71-4d18-0bce-b5c0a9bb1bae.png)

2. CSSファイルを`css/`の下にアップロードします。

    ![](./images/02_upload_file_02.png)![02_upload_file_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/c70dd0b1-893d-9470-cbaa-c6528f143362.png)


3. Javascriptファイルを`js/`の下にアップロードします。

    ![](./images/02_upload_file_03.png)![02_upload_file_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/51593601-8b7c-a902-3c63-8c8a041876d2.png)

4. すべてのファイルをアップロードしました。

    ![](./images/02_upload_file_04.png)![02_upload_file_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/43c6155e-4672-c890-dfc7-576a701366f8.png)

## 1.5. 事前認証済みリクエストを作成する

Oracle API Gateway がインターネット経由で配布ファイルを提供できるようにするには、配布ファイルが保存されているオブジェクト ストレージ バケットに対して事前認証されたリクエストPARを作成する必要があります。

API ゲートウェイを構成するときにこれを使用します。


1. オブジェクト・ストレージのバケット詳細画面で、「事前認証済リクエスト」に移動します。「事前認証済リクエストの作成」をクリックします。
    
    ![](./images/03_create_par_01.png)![03_create_par_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/0f239f8b-99f0-3883-c037-8cd5da4b45d0.png)

2. 事前認証済リクエスト・ターゲットを「バケット」と指定します。アクセス・タイプ及び有効期限を指定し、「事前認証済リクエストの作成」をクリックします。
    
    ![](./images/03_create_par_02.png)![03_create_par_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/605dfb23-186f-79c4-533e-250c106b5b88.png)


3. 事前認証リクエストのURLをコピーして、他の場所に保存します。

    ![](./images/03_create_par_03.png)![03_create_par_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/ca3eed1c-e93b-fa49-1ebb-b3a88e1a880f.png)


5. オブジェクト・ストレージにアップロードしたHTMLファイルのURL（オブジェクトの詳細画面でURLを取得できます）をブラウザに入力して、サイトの表示を確認します。

    ![](./images/02_upload_file_05.png)![02_upload_file_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/ed3655ee-7d8d-3cd7-547b-87b274626f98.png)


## 1.6. VCNの作成

Oracle API Gatewayを作成する前に、VCNを作成する必要があります。

1. ナビゲーションメニューからネットワーキング、仮想クラウド・ネットワーキングの順に移動します。「VCNウィザードの起動」をクリックします。「インターネット接続性を持つVCNの作成」を選択します。

    ![](./images/04_create_vcn_01.png)![04_create_vcn_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/cd0ec70c-7006-97b3-d3dc-86e941c23646.png)


2. VCN名を指定します。

    ![](./images/04_create_vcn_02.png)![04_create_vcn_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/cb1dd2e6-7692-21cd-9ef7-f5e7d4755dd9.png)


3. 作成をクリックします。

    ![](./images/04_create_vcn_03.png)![04_create_vcn_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/2e9af9e5-a5fb-352f-1b7e-da84a8483174.png)



    ![](./images/04_create_vcn_04.png)![04_create_vcn_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/442037e3-13cf-3e6d-34bb-5e6584a6127b.png)

4. HTTPS用のポート433を開放するために、セキュリティ・リストを更新します。デフォルトセキュリティリストを開きます。

    ![](./images/04_create_vcn_05.png)![04_create_vcn_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/1d9d56f0-a0ca-2cbd-10dc-a352eafda12b.png)


5. イングレス・ルールを追加します。

    ![](./images/04_create_vcn_06.png)![04_create_vcn_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/1768f2c2-ad53-9920-10d6-38bf28a1d157.png)


    ![](./images/04_create_vcn_07.png)![04_create_vcn_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/36d21451-68d3-f0ae-fbd9-dbcdf5eac969.png)


## 1.7. Oracle API Gatewayを作成する

Oracle API Gateway サービスを使用すると、プライベート エンドポイントを持つ API を公開できます。また、インターネット トラフィックを受け入れる場合は、パブリック IP アドレスで公開できます。エンドポイントは、API 検証、リクエストとレスポンスの変換、CORS、認証と認可、およびリクエストの制限をサポートします。詳細については、「[Oracle API Gateway の概要](https://docs.oracle.com/ja-jp/iaas/Content/APIGateway/Concepts/apigatewayoverview.htm)」を参照してください。

1. OCI メニュー、開発者サービス、API ゲートウェイに移動し、「ゲートウェイの作成」をクリックします。ゲートウェイの作成画面で次のように入力します。

    - タイプ：パブリック
    - ネットワーク：作成したVCNとパブリック サブネットを選択します。
    
    ![](./images/05_create_api_gateway_01.png)![05_create_api_gateway_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/b13fb0dc-3240-7d33-155a-e92bf6343bc7.png)


2. 作成したゲートウェイの詳細画面が次のようです。

    ![](./images/05_create_api_gateway_02.png)![05_create_api_gateway_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/6c59ccc0-abea-cb7f-fba7-09fda74e6ce7.png)


## 1.8. Oracle API Gatewayのデプロイメントを設定する

1. Oracle API Gateway が正常に作成されたら、「デプロイメント」に移動して新しいデプロイメントを作成します。

    ![](./images/06_create_api_gateway_deployment_01.png)![06_create_api_gateway_deployment_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/0896f8c7-6ba4-a72f-8242-ce5b390212cb.png)


1. 「最初から作成」を選択し、パス接頭辞を「/」と設定します。これが URL のベースパスになります。ほかの設定はデフォルト値を受け入れ、[次へ]をクリックします。

    ![](./images/06_create_api_gateway_deployment_02.png)![06_create_api_gateway_deployment_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/2fe363d3-ffb2-5afe-dbb3-efdaead19c68.png)


1. 「認証なし」を選択し、「次へ」をクリックします。静的 Web サイトには認証を追加する必要はありません。

    ![](./images/06_create_api_gateway_deployment_03.png)![06_create_api_gateway_deployment_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/8b156f6b-bc9c-c5d4-0544-7a64a985dba8.png)


1. API デプロイメント ウィザードで、デプロイメントのベース パスを拡張するルーティングを追加します。

    - パスフィールドに`/{req*}`と入力します。
    - 「メソッド」ドロップダウンリストから「GET」を選択します。
    - 複数のバックエンドの追加を選択します。
    - セレクター フィールドでパスを選択します。
    - パス名フィールドで`req`と入力します。
    - バックエンドの定義をクリックします。

    ![](./images/06_create_api_gateway_deployment_04.png)![06_create_api_gateway_deployment_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/8dbe9b29-d246-30df-559c-36ce6373ea28.png)


    > :::note info
    > パス・パラメータおよびワイルドカードの追加方法は、ドキュメント[「ルート・パスへのパス・パラメータおよびワイルドカードの追加」](https://docs.oracle.com/ja-jp/iaas/Content/APIGateway/Tasks/apigatewayaddingparamswildcards.htm)をご参照ください。
    > :::

2. バックエンド・ルールを作成します。まずは、デフォルトのルールを作成し、「名前」に `default` 、「一致タイプ」に`いずれかの`と入力し、「デフォルトに設定」チェックボックスをオンにして、「バックエンド・タイプ」に`HTTP`を選択し、 [URL]フィールドに `index.html` ページのオブジェクト ストレージ URL（例えば、https://objectstorage.ap-tokyo-1.oraclecloud.com/p/OueoOQA_-doEbIpCKoC8fi9HPFJUjd68inmYbfWerlMQrobd4SYIGOLvCthxRIzB/n/sehubjapacprod/b/Static-Web-Site-Demo/o/index.html） を入力して、[定義] をクリックします。

    > :::note info
    > バックエンド・ルール照合に関するノート
    > 
    > 使用するバックエンドを決定するルールを作成するときに、特定のバックエンドにルーティングするリクエストに対して、コンテキスト変数値が特定の値と一致する必要がある程度を指定できます。完全一致を要求することも、ワイルドカードで始まる値を指定することもできます。APIゲートウェイは、指定した順序(完全一致ルールが最初に、ワイルドカード・ルールが続く)でルールを評価し、最初の一致ルールを使用します。コンテキスト変数値がバック・エンド・ルールと一致しない場合に使用するデフォルト・ルールを指定することもできます。デフォルトとしてルールが指定されておらず、受信リクエストのコンテキスト変数値がバック・エンド・ルールと一致しない場合、リクエストはエラーを返します。どのバックエンド・ルール(およびどのバックエンド)を使用するかを決定する優先順位は、次のように要約できます。
    > 
    > - コンテキスト変数値がルールの値と完全に一致する場合は、そのルールを使用します。
    > 
    > - それ以外の場合、コンテキスト変数値がワイルドカードで開始または終了するルールの値と一致する場合は、一致するワイルドカードを含む最初のルールを使用します。
    >     
    > - それ以外の場合は、ルールがデフォルト・ルールとして指定されている場合は、そのルールを使用します。
    > 
    > - そうでない場合は、エラーを返します。
    :::

    ![](./images/06_create_api_gateway_deployment_05.png)![06_create_api_gateway_deployment_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/98abb9ca-4303-1ece-fef1-995f4d976eeb.png)


3. 次は、htmlファイルのルールを作成します。

    ![](./images/06_create_api_gateway_deployment_06.png)![06_create_api_gateway_deployment_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/51a1f5a1-795e-66fa-959e-4f31e20f7280.png)


4. 名前に`html`、一致タイプに`ワイルドカード`、ワイルドカード式に`*.html`と入力し、バックエンドに`HTTP`を選択し、「URL」フィールドにオブジェクトストレージバケットのURLとリクエスト・コンテキスト変数（`${request.path[req]}`）を連結したURLを入力して、定義をクリックします。URLは次のようになります。
   
    `https://{namespace}.objectstorage.{region}.oci.customer-oci.com/n/{namespace}/b/{bucket-name}/o/${request.path[req]}`

    例えば、

    `https://objectstorage.ap-tokyo-1.oraclecloud.com/p/OueoOQA_-doEbIpCKoC8fi9HPFJUjd68inmYbfWerlMQrobd4SYIGOLvCthxRIzB/n/sehubjapacprod/b/Static-Web-Site-Demo/o/${request.path[req]}`

    これによって、API Gateway デプロイメントのエンドポイントへのリクエスト（例えば、https://n3lqcn3dvrctaclen2rxu7wmha.apigateway.ap-tokyo-1.oci.customer-oci.com/index.html ）をオブジェクトストレージ バケットのHTMLファイル（例えば、https://objectstorage.ap-tokyo-1.oraclecloud.com/p/OueoOQA_-doEbIpCKoC8fi9HPFJUjd68inmYbfWerlMQrobd4SYIGOLvCthxRIzB/n/sehubjapacprod/b/Static-Web-Site-Demo/o/index.html ）へ転送されます。URLの中にある`index.html`部分は、リクエスト・コンテキスト変数（`${request.path[req]}`）より取得されます。

    ![](./images/06_create_api_gateway_deployment_07.png)![06_create_api_gateway_deployment_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/5e49b3f9-146b-cb8c-a11a-eabb4c19685a.png)


3. 必要に応じて、css、js ファイルに同様のルールを作成します。

    ![](./images/06_create_api_gateway_deployment_08.png)![06_create_api_gateway_deployment_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/38560683-074a-6f4f-3ff3-05764f81c218.png)


    ![](./images/06_create_api_gateway_deployment_09.png)![06_create_api_gateway_deployment_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/7f2aed73-5826-2e24-d346-27a57f5e50b6.png)


    > :::note info
    > API Gateway デプロイメントのエンドポイントへのリクエスト（例えば、https://n3lqcn3dvrctaclen2rxu7wmha.apigateway.ap-tokyo-1.oci.customer-oci.com/js/script.js ）をオブジェクトストレージ バケットのJavascriptファイル（例えば、https://objectstorage.ap-tokyo-1.oraclecloud.com/p/OueoOQA_-doEbIpCKoC8fi9HPFJUjd68inmYbfWerlMQrobd4SYIGOLvCthxRIzB/n/sehubjapacprod/b/Static-Web-Site-Demo/o/js/script.js ）へ転送されます。URLの中にある`js/script.js`部分は、リクエスト・コンテキスト変数（`${request.path[req]}`）より取得されます。
    > Webアプリケーションのフォルダ構成によって、URLを適当に変更してください。
    > :::

1. すべてのルールを定義しましたら「次」をクリックします。

    ![](./images/06_create_api_gateway_deployment_10.png)![06_create_api_gateway_deployment_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/2ebd4254-6a97-f68c-853f-005b2805509e.png)


1. 確認画面で作成をクリックします。

    ![](./images/06_create_api_gateway_deployment_11.png)![06_create_api_gateway_deployment_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/5ba74982-3240-f24f-4807-0191241b88af.png)


1. 作成したAPI GatewayのデプロイメントのエンドポイントURLを確認し、コピーをクリックします。
    
    ![](./images/06_create_api_gateway_deployment_12.png)![06_create_api_gateway_deployment_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/f253bbed-50d6-2c2c-032d-6a621b7453e1.png)


1. コピーしたエンドポイントURLとHTMLファイル名を連携したURL（例えば、https://n3lqcn3dvrctaclen2rxu7wmha.apigateway.ap-tokyo-1.oci.customer-oci.com/index.html をブラウザでアクセスすると、アプリケーションが表示されます。

    ![](./images/06_create_api_gateway_deployment_13.png)![06_create_api_gateway_deployment_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/e40a0601-bb8e-ba9c-7ad9-cd79776c92f6.png)



    > [!TIP]
    > バックエンド定義に、アプリケーションに含まれるさまざまなファイル タイプをすべて追加することを忘れないでください。
    > 
    > この手法を使用して設定できるのは、AOT (Ahead of Time) コンパイルされたアプリケーションと静的 Web サイトのみです。アプリケーションがネイティブの JavaScript コードでコンパイルされていることを確認してください。

## 1.9. Cloudflare へ Webサイトの追加

OCI Object Storageバケットで静的にホストされているWebサイトをCloudflareに追加します。詳細は、[Cloudflareへのサイトの追加](https://developers.cloudflare.com/fundamentals/setup/manage-domains/add-site/)を参照してください。

このチュートリアルでは、`shengjun.top`という名前のドメインを使用します。

1. Cloudflareにログインし、「ドメインを追加する」をクリックします。

    ![](./images/07_create_cloudflare_domain_01.png)![07_create_cloudflare_domain_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/7a454c83-70b7-2c87-ff3c-42d95b4343e6.png)


2. Webサイトのドメイン名を入力します。CloudflareはDNSレコードを自動的にスキャンしようとします。

    ![](./images/07_create_cloudflare_domain_02.png)![07_create_cloudflare_domain_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/88416dbd-c952-68a5-01ea-65143a70ddf6.png)


## 1.10. ネーム・サーバーの更新

Cloudflareからドメインを購入していない場合は、ドメインレジストラのCloudflareネームサーバーを更新する必要があります。

1. Cloudflareは、一連のネームサーバーを提供します。作成したWebサイト詳細画面から[DNS] > [レコード]タイルを選択します。ドメインの DNS 管理が表示されます。Cloudflare ネームサーバーを確認します。

    ![](./images/08_update_name_server_01.png)![08_update_name_server_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/99b6152e-4113-968a-ac7d-01ddfe4a062a.png)


1. ドメイン・レジストラのWebサイトにログインし、Cloudflareが提供するドメイン・ネーム・サーバーを更新します。詳細は、[Change nameservers](https://developers.cloudflare.com/automatic-platform-optimization/get-started/change-nameservers/)を参照してください。

    ![](./images/08_update_name_server_02.png)![08_update_name_server_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/83fee32c-8b4e-7f39-01d2-60d2e9af502c.png)


## 1.11. DNSレコードの追加

OCIのAPIゲートウェイのエンドポイントをCNAMEレコードとして Cloudflare DNSレコードに追加します。

1. レコードの追加をクリックします。
    
    ![](./images/09_add_dns_record_01.png)![09_add_dns_record_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/6eecdf92-1e49-6485-056e-5c057dc0f78e.png)


2. 次の情報を入力し、保存をクリックします。
    
    - タイプ: CNAME。
    - Name: @
    - ターゲット: `<Your API Gateway Hostname>`は、OCIコンソールからAPIゲートウェイのホスト名を取得できます。

    ![](./images/09_add_dns_record_02.png)![09_add_dns_record_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/a33f1ac3-4025-9292-c5f7-0e7b5c8e827a.png)


3. 追加したレコードを一覧に表示していることを確認します。

    ![](./images/09_add_dns_record_03.png)![09_add_dns_record_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/495543f0-3f5d-2e40-96d1-aa9628fada42.png)



## 1.12. DNS伝播の待機

ネームサーバーおよびDNSレコードを更新すると、DNS伝播が発生します。このプロセスには時間がかかることがあります。通常は数分から数時間です。

## 1.13. SSL/TLS暗号化の構成

DNSの伝播が完了したら、「SSL/TLS」および「概要」に移動します。SSL/TLS 暗号化モードは、 Cloudflare が 2 つの接続を管理する方法を制御します。1 つは訪問者と Cloudflare の間、もう 1 つは Cloudflare とオリジン サーバーの間です。このチュートリアルでは、「フル」を選択します。

![](./images/10_cloudflare_ssl_tls_01.png)![10_cloudflare_ssl_tls_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/4ce2ac05-088d-d44f-ebed-d6cb54f9f516.png)


> :::note info
> Cloudflare 暗号化モードの詳細については、[ドキュメント](https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/)を参照してください。
> 
> デフォルトでは、Cloudflare は、 Cloudflareに追加されアクティブ化されたすべてのドメインに対して、無料で共有されない、公的に信頼された SSL 証明書（[ユニバーサルSSL証明書](https://developers.cloudflare.com/ssl/edge-certificates/universal-ssl/)）を発行し、更新します。独自の SSL 証明書を使用したいビジネスおよびエンタープライズ ユーザーは、[カスタム証明書](https://developers.cloudflare.com/ssl/edge-certificates/custom-certificates/)をアップロードできます。
> :::

## 1.14. ドメインURLのテスト

ドメインURLを取得し、ブラウザに入力してください。このチュートリアルでは、`https://shengjun.top/index.html`を入力します。これにより、指定したドメインでアプリケーションがオープンします。

![](./images/11_confirm_domain_01.png)
![11_confirm_domain_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534261/9557ebac-a94a-f716-289b-1c9688d764ec.png)

## 1.15. 参考資料

Oracle Cloud Infrastructure Object Storageでホストされている静的WebサイトをCloudflareに公開

https://docs.oracle.com/ja/learn/static-websites-to-cloudflare/index.html

Set Up OCI Object Storage and Oracle API Gateway for Static Website Hosting

https://docs.oracle.com/en/learn/oci-api-gateway-web-hosting/index.html