[CDN] AWS CloudFront に変わる構成を、OCIでも考えてみた [ Cloudflare + ObjectStorage ]

# はじめに
AWSにはCloudFrontというCDNサービスが在る
Oracle Cloud Infrastructure でこれに変わる構成として、任意のCDNプロバイダとのかけあわせが考えられる
本記事では、Object Storageでホストされている静的WebサイトをCloudflareに公開する方法について、それに関連する資料を纏める

# CloudFrontとは
## 概要
https://aws.amazon.com/jp/cloudfront/
(引用抜粋)
Amazon CloudFront は、高いパフォーマンス、セキュリティ、デベロッパーの利便性のために構築されたコンテンツ配信ネットワーク (CDN) サービスです。

## 設定流れ
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Introduction.html
(引用抜粋)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/2edbf66d-7346-ae21-e0fa-ab80c10db656.png)

1. Amazon S3 バケットや独自の HTTP サーバーなどのオリジンサーバーを指定
2. ファイルをオリジンサーバーにアップロード
3. ディストリビューション作成
4. ディストリビューションにドメイン名を割り当て
5. CloudFrontがEdge Locationにディストリビューション構成を送信


# OCIで考えられる類似構成
冒頭記載の通り、Cloudflare + ObjectStorageを考えてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/3321ecb0-12d4-73c9-1677-d3ea079590d6.png)

## Cloudflareとは
https://www.cloudflare.com/ja-jp/
Cloudflareは、サイトのパフォーマンス向上と安全性の確保を目的とした、グローバルなContent Delivery Network（CDN）サービスのひとつです。ウェブサイトを高速化し、DDoS攻撃などの脅威から保護するための機能を提供しています。

## なぜCloudflareなのか?
https://www.cloudflare.com/ja-jp/press-releases/2021/cloudflare-and-oracle-join-forces-to-help-eliminate-data-transfer-fees/

Oracleは、Cloudflareと共同でBandwidth Allianceに加盟し、データ転送料金の削減に取り組むことを発表しました。
これにより、両社のサービスを利用する企業は、高額なデータ転送料金を回避でき、コスト削減が可能になります。
Bandwidth Allianceは、データ転送料金の割引や免除を提供するクラウドプロバイダーのグループで、現在19社が参加しています。
Oracleは、特にデータ転送に関する料金を無料にすることで、企業がより効率的にクラウドサービスを利用できるよう支援します。




# 実装の流れ

下記に実装の流れを示します
今回の検証では、object storageに静的コンテンツ(html)を配置し、Cloudflare->API gateway->object storage経由でコンテンツが見えることをゴールとしています





## 下準備
https://docs.oracle.com/ja/learn/oci-api-gateway-web-hosting/index.html#objectives

### Oracle Cloudへのアクセス/アカウントサインナップ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/96d6d8aa-dcd3-5925-5046-e5971f99a20c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/3a7b2fa0-c208-2e22-d4f7-e6754919c0c8.png)

### 静的Webサイトの準備

html , javascript , css 等、静的コンテンツを用意します
私の検証ではシンプルに index.html のみ用意しました

### OCI上でのObject Storageバケット用意
- オブジェクト・ストレージの画面から「バケットの作成」をクリック
- バケット名 : 任意
- デフォルト・ストレージ総 : 標準
- 暗号化 : Oracle管理キーを使用した暗号化 (デフォルトのまま
- 「作成」クリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/214197ff-5930-2332-9eb9-d4273bf27c07.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/ceb10378-1693-c1c8-9305-4e9eb91903cb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/7c38ca70-9e75-3f8a-6eb1-94fa6b629d0a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/5dee7419-52a8-707a-f5d8-cd3c3c9c46a9.png)

### バケットへの配布ファイル(html,js,css等)のアップロード
- リソース「オブジェクト」から、オブジェクトの「アップロード」をクリック
- オブジェクト名の接頭辞 : 任意
- ストレージ層 : 標準
- ファイルを選択
- 「アップロード」
-  Object StorageにアップロードしたhtmlファイルのURLをブラウザで入力し、サイト表示できることを確認しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/cdb9e306-6845-ab81-7e33-33418dd71f66.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/c3e38796-db3f-7de5-7d89-7bc4e073f50f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/383d5736-2673-c77d-d691-017054f01b11.png)

コンテンツが少し寂しいですが、シンプルhtmlだとこのような感じです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/2f1aa187-0343-3495-0745-695dc06a4850.png)





### 事前認証済リクエストの作成
- 名前 : 任意
- 事前承認リクエスト・ターゲット : バケット
- アクセス・タイプ : オブジェクトの読み取りを許可

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/49ba80a1-0871-96eb-2f83-2f16a3b9d937.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/992f443c-ba7f-8a7a-a1cc-7bd813f46849.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/7b65c955-8d9e-a3e4-2f04-a903be78a804.png)





### VCN作成

「仮想クラウド・ネットワーク」クリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/2f730f35-edf6-9e9d-1f3e-c55f42a1fe64.png)

「VCNの作成」クリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/f8afa84f-cc6e-06fe-0a2b-81d1b1ea05f9.png)

名前 : 任意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/8fccb30f-ad7a-65ca-6c2b-81a5c8b782ce.png)

IPv4 CIDR blocks : 任意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/05277cf5-1b6f-bf68-86a0-36e45ac339b0.png)

DNS関連->デフォルトのまま
IPv6 Prefixes : 任意
「VCNの作成」クリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/eef0350e-d8e9-b9f9-71c6-15770868521a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/76a319e6-9512-e025-d58d-6a5211303327.png)

### セキュリティ・リストでポート433を許可
- 左ツリーより、「セキュリティ・リスト」を選択
- 「Default Security List for ～」クリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/7085d323-d713-700f-2c4c-ae12cea3b190.png)

「イングレス・ルールの追加」クリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/dd8214a0-a11b-e539-fddf-a1df47bf3feb.png)

ソース・タイプ : CIDR
ソースCIDR : 0.0.0.0/0
IPプロトコル : TCP
ソース・ポート範囲 : 443
宛先ポート範囲 : All (デフォルトのまま
「イングレス・ルールの追加」クリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/fb1840c9-7756-61c5-4d57-2e8a9555d413.png)







### Oracle API Gatewayの作成
- 開発者サービス -> API管理 -> ゲートウェイ
- ゲートウェイの作成
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/8c0722de-91ba-1aa0-adc2-baeec3402028.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/37ae517f-f779-4c20-0916-55188401f035.png)

- 名前 : 任意
- タイプ：パブリック
- ネットワーク：作成したVCNとパブリック サブネットを選択
- 証明書 : デフォルト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/706a3138-be3e-f46c-4a36-5c2ec6f7cedc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/a2077b50-c2bc-a254-b1ca-bb4e845079e7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/d1b5a287-042c-1843-c48a-f41cb2f97455.png)






### Oracle API Gatewayデプロイメントの設定
- 「デプロイメントの作成」
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/216daba4-a900-92bb-0cbf-556fb65e3f7e.png)

- 「最初から作成」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/2f133039-5750-9e6a-c79b-c0bf7b1e67d2.png)

- パス接頭辞を「/」と設定
- APIリクエスト・ポリシー 以降は操作せずに「次」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/2a6eaef4-efd0-8d64-1cc8-b4c778269f3a.png)


- 「認証なし」を選択
- 「次」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/4c0fbb5f-1722-8aad-9c69-d59450966f8b.png)


- パスフィールドに/{req*}と入力
- 「メソッド」ドロップダウンリストから「GET」を選択
- 複数のバックエンドの追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/3d505b60-fdda-a7a0-36e9-1cd59a481a36.png)

- セレクター フィールドでパスを選択
- パス名フィールドでreqと入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/7369d353-1a05-f67d-ad69-420192729a58.png)

- バックエンドの定義をクリック
- 「名前」に default

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/13be0bb9-d2ce-f6c3-c5b6-75aefdd81977.png)

- 「一致タイプ」に「いずれかの」を選択
- 「デフォルトに設定」チェックボックスをオン
- 「バックエンド・タイプ」にHTTPを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/cd253b00-8337-15a5-5612-d5d3ec6189bd.png)

- [URL]フィールドに index.html ページのオブジェクト ストレージ URLを入力
    - 例 : https://objectstorage.ap-tokyo-1.oraclecloud.com/p/OueoOQA_-doEbIxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbd4SYIGOLvCthxRIzB/n/xxxx/b/Static-Web-Site-Demo/o/index.html
- 「定義」


次にhtmlファイルのルールを作成します

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

必要に応じて、css , js ファイルに同様のルールを作成します
すべてのルールを定義しましたら「次」をクリックします
確認画面で作成をクリック
作成したAPI GatewayのデプロイメントのエンドポイントURLを確認します
ブラウザで上記URLへアクセスしコンテンツが表示できることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/a69abeff-1294-47c5-02f6-38c09203dc70.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/a0aef5bb-6e51-7722-d9f4-2a9ecb37e84c.png)







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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/d1cb75f9-d455-c579-49dc-8c22dd44683f.png)

- CloudflareにWebサイトの追加
    - 「ドメインを追加する」
    - 既存のドメインを入力に、ドメイン名を入力 （ドメインを取得しましょう）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/6f03a723-0e55-690d-0715-dc3d4ed4b170.png)

### ネーム・サーバーの更新
- [DNS] > [レコード]タイルを選択
- Cloudflare ネームサーバを確認する
- ドメインの管理元で、Nameserverの設定に上記のネームサーバを設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/46acb7b2-66fb-ab95-f32e-703549db2ae6.png)

### DNSレコードの検証
- OCIのAPIゲートウェイのエンドポイントをCNAMEレコードとして Cloudflare DNSレコードに追加
    - タイプ: CNAME
    - Name: @
    - ターゲット: APIゲートウェイのホスト名

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/25454d8a-35ce-8621-fd9e-08f3642a6aa4.png)

### DNS伝播の待機
- 通常は数分から数時間、とのこと

### SSL/TLS暗号化の構成
- 「SSL/TLS」および「概要」
- カスタムSSL/TLS : フル

### ドメインURLテスト
- 取得/設定したドメインをブラウザに入力し想定のコンテンツが表示されることを確認します
- 例 : https://hogehoge.nnn.top/index.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567355/9303a3d2-48a7-8004-6e78-4493c0cc1f44.png)