さくらのウェブアクセラレータ（CDN）のオリジンにAmazon S3を利用する


## 概要
ウェブアクセラレータ（CDN）の配信設定で、「オリジン種別：オブジェクトストレージ」で「**Amazon S3**」を指定する方法です。
* [高速・安定CDN ウェブアクセラレータ | さくらインターネット](https://www.sakura.ad.jp/services/cdn/)
* [Amazon S3（拡張性と耐久性を兼ね揃えたクラウドストレージ）｜AWS](https://aws.amazon.com/jp/s3/)

## 注意事項
ウェブアクセラレータの「オリジン種別：オブジェクトストレージ」の公式サポートは、**さくらの「[オブジェクトストレージ](https://cloud.sakura.ad.jp/specification/object-storage/)」のみ**です。
オリジンにAmazon S3 を利用する場合、公式サポートはされていないので、あくまで**自己責任**での利用になります。

## Amazon S3の設定

### 1. 配信対象バケットの作成
[バケットの作成 - Amazon Simple Storage Service](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/create-bucket-overview.html) の手順でバケットを作成します。

**＜バケットの作成例＞**
* バケット名：webaccel-test
* AWSリージョン：アジアパシフィック (東京) ap-northeast-1

### 2. IAMのポリシー・グループ・ユーザーの作成（ウェブアクセラレータ連携用）
参考 : [IAM ユーザー - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users.html)

IAM管理画面より、「ポリシー」を作成します。

**＜ポリシーの作成例（対象バケットの読み取り専用）＞**
* 名前 : WebaccelTestReadOnly
* 設定内容 : 
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "WebaccelTestReadOnly",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::webaccel-test",
                "arn:aws:s3:::webaccel-test/*"
            ]
        }
    ]
}
```

IAM管理画面より、「ユーザーグループ」を新規作成します。

**＜ユーザーグループの作成例＞**
* ユーザーグループ名 : webaccel-read-only
* ポリシー : WebaccelTestReadOnly
* グループ : webaccel-read-only

IAM管理画面より、「ユーザー」を作成します。

**＜ユーザーの作成例＞**
* ユーザー名 : webaccel-read-only-user
* AWS アクセスの種類 : アクセスキー - プログラムによるアクセス

※ ここで作成されたユーザーの「**アクセスキーID**」「**シークレットアクセスキー**」をメモします。

### 3. IAMのポリシー・グループ・ユーザーの作成（コンテンツアップロード用）

IAM管理画面より、「ポリシー」を作成します。

**＜ポリシーの作成例（対象バケットの読み書き）＞**
* 名前 : WebaccelTestReadWrite
* 設定内容 : 
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "WebaccelTestReadWrite",
            "Effect": "Allow",
            "Action": [
                "s3:*Object",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::webaccel-test",
                "arn:aws:s3:::webaccel-test/*"
            ]
        }
    ]
}
```

IAM管理画面より、「ユーザーグループ」を新規作成します。

**＜ユーザーグループの作成例＞**
* ユーザーグループ名 : webaccel-read-write
* ポリシー : WebaccelTestReadWrite
* グループ : webaccel-read-write

IAM管理画面より、「ユーザー」を作成します。

**＜ユーザーの作成例＞**
* ユーザー名 : webaccel-read-write-user
* AWS アクセスの種類 : アクセスキー - プログラムによるアクセス

※ ここで作成されたユーザーの「**アクセスキーID**」「**シークレットアクセスキー**」をメモします。

### 4.コンテンツのアップロード

「3. IAMのポリシー・グループ・ユーザーの作成（コンテンツアップロード用）」で用意した
たwebaccel-read-write-userユーザーの「**アクセスキーID**」「**シークレットアクセスキー**」を使ってコンテンツをアップロードします。

※ 本手順では、Ubuntu 18.04 の環境にて、awscliで準備しました。

* 設定例 : s3-webaccel-test-read-write というプロファイルの作成
```
$ aws configure --profile s3-webaccel-test-read-write
AWS Access Key ID [None]: 「webaccel-read-write-user」のアクセスキーを入力
AWS Secret Access Key [None]: 「webaccel-read-write-user」のシークレットアクセスキーを入力
Default region name [None]: "ap-northeast-1" を入力
Default output format [None]: "json" を入力

$ tail -3 ~/.aws/config

[profile s3-webaccel-test-read-write]
region = ap-northeast-1
output = json
```

* 接続確認
```
$ aws --profile s3-webaccel-test-read-write --endpoint-url=https://s3.ap-northeast-1.amazonaws.com s3 ls s3://webaccel-test/
$
```
→ 「webaccel-test」バケットにアクセス可能なことを確認します。まだ空の状態だと、このような状態です。

※「An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied」の応答が表示された場合、ポリシー設定を見直す必要があります。


* 配信用テストファイルのアップロード
```
$ mkdir webaccel-test
$ cd webaccel-test
~/webaccel-test $
~/webaccel-test $ vim index.html

<html>
<head>
<title>配信テストページ</title>
</head>
<body>
配信テストページです。<br/>
</body>
</html>

~/webaccel-test $ aws  --profile s3-webaccel-test-read-write --endpoint-url=https://s3.ap-northeast-1.amazonaws.com s3 sync ~/webaccel-test s3://webaccel-test/
upload: ./index.html to s3://webaccel-test/index.html
```

* アップロード済みなことを確認します
```
$ aws --profile s3-webaccel-test-read-write --endpoint-url=https://s3.ap-northeast-1.amazonaws.com s3 ls s3://webaccel-test/
2022-04-26 17:22:26        125 index.html
```

* 直接HTTPSアクセスした際に、閲覧できないことを確認します。
```
$ curl https://s3.ap-northeast-1.amazonaws.com/webaccel-test/index.html

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>...(略)...</HostId></Error>
```

## ウェブアクセラレータの設定

参考(1) : [初期設定（オブジェクトストレージ・独自ドメイン利用） | ウェブアクセラレータ | さくらのクラウド ドキュメント](https://manual.sakura.ad.jp/cloud/webaccel/manual/settings-objectstorage-domain.html)
参考(2) : [Let's Encrypt 自動更新証明書の利用 | ウェブアクセラレータ | さくらのクラウド ドキュメント](https://manual.sakura.ad.jp/cloud/webaccel/manual/settings-lets-encrypt-auto-cert.html)

* 【さくらのクラウド ホーム】 から 【ウェブアクセラレータ（CDN）】を選択

* 【サイト追加】 から 「サイト新規新規追加」に必要情報を入力して、【保存】で追加します。

設定例 : 
```
ドメイン種別 : 独自ドメイン
サイト名 : S3テスト
公開ドメイン名 : ***.example.jp
リクエストプロトコル : httpsにリダイレクト
オリジン種別：オブジェクトストレージ 
バケット名: webaccel-test
S3エンドポイント: s3.ap-northeast-1.amazonaws.com
S3リージョン : ap-northeast-1
アクセスキーID : 【「webaccel-read-only-user」のアクセスキーID】
シークレットアクセスキー :【「webaccel-read-only-user」のシークレットアクセスキー】
デフォルトのキャッシュ期間: 有効 2600秒
ドキュメントインデクス: 有効
Varyサポート: 無効
```
※ 今回の記事では、オリジンに、STEP1で用意した、「webaccel-test」バケット、「webaccel-test」バケットのみのREAD(読み込み)権限のパーミッション「webaccel-read-only-user」のアクセスキーID・シークレットアクセスキーを指定します。

*「サイト新規設定追加完了」画面に表示された「CNAME先|サブドメイン	********.user.webaccel.jp.」をメモします。

* 対象ドメインのCNAMEを設定し、確認します。

確認例 : 
```
$ dig ***.example.jp

(略)

;; ANSWER SECTION:
***.example.jp.           60      IN      CNAME   ********.user.webaccel.jp.
********.user.webaccel.jp.   3599 IN      CNAME   ********.gslb1.sakura.ne.jp.
********.gslb1.sakura.ne.jp.    9 IN A    ********

(略)
```

* 「サイト一覧」サイト一覧→「対象サイト」→「設定」から、「有効にする」を選択し、サイトを有効化します。
* 「サイト一覧」サイト一覧→「対象サイト」→「設定」から、「SSL証明書」の「Let's Encrypt 自動更新証明書を使用する（無料）」を「自動更新を有効にする」を選択し、Let's Encrypt自動更新証明書を有効化します。（この記事ではこちらを使っていますが、持ち込み証明書の利用も可能です。）


## 配信確認

* 再度、直接HTTPSアクセスした際に、閲覧できないことを確認します。
```
$ curl https://s3.ap-northeast-1.amazonaws.com/webaccel-test/index.html

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>...(略)...</HostId></Error>
```

* ウェブアクセラレータ経由で、HTTPSアクセスした際に、閲覧できる（配信されている）ことを確認します。
```
$ curl https://***.example.jp/index.html

<html>
<head>
<title>配信テストページ</title>
</head>
<body>
配信テストページです。<br/>
</body>
</html>
```

* 複数回アクセスをした際に、キャッシュより配信されていること（x-cacheヘッダの値がHITになっていること）を確認します。( 参考 : 【必読】ファイルがキャッシュされているかを確認したい | [トラブルシューティング | ウェブアクセラレータ | さくらのクラウド ドキュメント](https://manual.sakura.ad.jp/cloud/webaccel/manual/troubleshooting.html#troubleshooting-01) )

```
$ curl -v https://***.example.jp/index.html

(略)

< x-cache: HIT

(略)

```


以上、さくらのウェブアクセラレータ（CDN）のオリジンにAmazon S3を試してみた紹介でした！

※ 繰り返しになりますが、オリジンにAmazon S3 を利用する場合、公式サポートはされていないので、あくまで**自己責任**での利用になります。

## 参考記事
この記事と同等の内容を、**さくらの「[オブジェクトストレージ](https://cloud.sakura.ad.jp/specification/object-storage/)**」で実施する場合の参考記事
* [ウェブアクセラレータとオブジェクトストレージでサイト公開 – blog.masa23.jp](https://blog.masa23.jp/posts/2021/04/15/webaccel-objectstorage/)