S3のSSL通信

2019/07/11：コメント欄のご指摘を受け実験結果を一部削除。(HTMLのパスを間違っており変な実験結果を載せてました。お恥ずかしい・・・）

# S3は HTTPSをサポートしていない？

「 <b>S3は、HTTPS通信できないですよね？</b> 」と言う話しが会話ででてくる事がよくあり「あれ、実際HTTPS通信問題なく使えているのに、その話し良く聞くけどなんでだっけ」と思う事があるので、メモしておきます。(この記事中のテスト用のリンクは予告なく削除される事がありますのでご了承下さい)

結論としては、

- S3デフォルト(「REST APIエンドポイント」)では HTTPS通信可能。
- 「ウェブサイトエンドポイント」としての設定(ドメイン名のフォーマットが「REST APIエンドポイント」と異なってくる)をした場合は、「ウェブサイトエンドポイント」用のドメインでは、HTTPS通信できない　(但し、デフォルトで使える「REST APIエンドポイント」のドメイン型式であれば、HTTP/HTTPSで引き続きアクセスできる）。

がこの記事作成時の答えです。

普段意識せずにS3を構成した時に使っているのが「<b>REST APIエンドポイント</b>」です。ドメイン名のフォーマット形式としては、バケット名をパスに入れる<b>パス型式</b>と、バケット名をホスト名として使用する<b>仮想ホスト形式</b>の2種類があります。
さらにS3の設定項目をよく見ると「Static Web Siteホスティング」という項目があり、その設定をすると使用できるようになるのはが「<b>ウェブサイトエンドポイント</b>」です。

もう少し別の言い方でまとめると、S3では、3パターンのドメイン名が使えます。

1) https://s3-ap-northeast-1.amazonaws.com/<バケット名>/sample1.jpg (デフォルト(「REST APIエンドポイント」)で使える、パス形式のバケットへのアクセス方法)
2) https://<バケット名>.s3-ap-northeast-1.amazonaws.com/sample1.jpg (デフォルト(「REST APIエンドポイント」)で使える、仮想ホスト型式のバケットへのアクセス方法)
3) http://<バケット名>.s3-website-ap-northeast-1.amazonaws.com/sample.html（ウェブサイトエンドポイントを構成をした時のみ使える)

この内3)のドメインフォーマットでは、https 通信が使えません。

## HTTPSが使えないという話の出所は？

HTTPSが使えない。という話しの元になっているのは、以下のドキュメントで「ウェブサイトエンドポイント」は HTTPS 接続をサポートしていないと書かれているのが発端だと思われます。

http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteEndpoints.html#WebsiteRestEndpointDiff

一方で特に何も設定しない時のデフォルトアクセス方法（「REST API エンドポイント」と呼ばれているようです）に関しては、HTTPS でアクセスが可能です。

ですので、例えば
https://s3-ap-northeast-1.amazonaws.com/yuhkih/sample1.jpg
https://yuhkih.s3-ap-northeast-1.amazonaws.com/sample1.jpg
というドメイン名（「REST API エンドポイント」)は普通に HTTPS アクセス可能です。

# 「ウェブサイトエンドポイント」を設定してみる

設定自体はとても簡単です。
![image](https://qiita-image-store.s3.amazonaws.com/0/99425/68042f15-df4c-5282-188c-d3137fed5b6f.png)
「Static website Hosting」を選びます。

![image](https://qiita-image-store.s3.amazonaws.com/0/99425/107d63fc-250e-9a6a-c254-0b439fa32d29.png)
「このパケットを使用してウェブサイトをホストする」を選びます。

![image](https://qiita-image-store.s3.amazonaws.com/0/99425/51bac4c0-cff5-d81f-80bb-ff199ed081d4.png)
後は、インデックスドキュメントを選びます。
以上で設定は完了です。非常に簡単です。
また設定項目を見るとわかるように、リダイレクトルールやエラードキュメントも作る事ができ、動的なコンテンツの生成が必用無いのであれば、"Webサイトぽい”使い方ができるようになっているのがわかります。

# 「ウェブサイトエンドポイント」にアクセスしてみる

「ウェブサイトエンドポイント」にアクセスする前に・・・それまでのURLにもアクセスできるのかどうか確認してみます。
「ウェブサイトエンドポイント」を構成しても、デフォルトのドメイン名（「APIエンドポイント」）を使ったURLは、そのままアクセスできます。

- https://s3-ap-northeast-1.amazonaws.com/yuhkih/path_sample.html (「REST APIエンドポイント」パス形式 )

```path_sample.html
<html>
<head>
<title>test html</title>
</head>
<body>
<img src="/yuhkih/sample1.jpg" alt="sample"> <!-- パス方式の場合 /yuhkih/ が必要 -->
</body>
</html>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/5a185225-c7ca-123c-ae41-f225097c3337.png)



- https://yuhkih.s3-ap-northeast-1.amazonaws.com/sample.html (「REST APIエンドポイント」仮想ホスト型式 ) 

```sample.html
<html>
<head>
<title>test html</title>
</head>
<body>
<img src="/sample1.jpg" alt="sample">
</body>
</html>
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/99425/90f98137-20ab-aa0c-7a1f-ebdabb1046e1.png)


HTMLが表示できないと思ったら何故かできます・・・これができるなら「ウェブサイトエンドポイント」の存在意義は微妙になる気がしますが・・一方で、インデックスファイルを置いたり、エラーファイルを作ったり、リダイレクトルールを作成できたり。という点は「ウェブサイトエンドポイント」だけの特徴になります。ですのでHTTPSを捨てても、Webサイトとして良くあるこれらの機能が使いたければ「Webサイトエンドポイント」を選択する事になるのかと思います。

一方で、「ウェブサイトエンドポイント」を構成すると「ウェブサイトエンドポイント」用のドメインも新たに使えるようになります。
「ウェブサイトエンドポイント」のドメイン名は、以下のフォーマットになります。"s3-website-"と入ってる所がこれまでのドメインとの違いの識別点です。

```ウェブサイトエンドポイント
<bucket-name>.s3-website-<AWS-region>.amazonaws.com　
```

ですので、私の実験環境では

http://yuhkih.s3-website-ap-northeast-1.amazonaws.com/sample.html

になります。上記のリンクにアクセスすると、Webサイトとして機能するので普通にページが表示されます。

```sample.html
<html>
<head>
<title>test html</title>
</head>
<body>
<img src="/sample1.jpg" alt="sample">
</body>
</html>
```
![image](https://qiita-image-store.s3.amazonaws.com/0/99425/882dea92-2da4-c9c2-e6cb-25482fbfcc43.png)

これまでの S3のドメイン名とは別の、Webサイト機能を持ったドメイン(ウェブサイトエンドポイント）を経由させて、S3のオブジェクトにアクセスしているように見えます。

さて、HTTPアクセスでは Webサイトぽく動いているように見えるので、今度は、このドメイン名にHTTPSでアクセスしようとすると・・・

https://yuhkih.s3-website-ap-northeast-1.amazonaws.com/sample.html

![image](https://qiita-image-store.s3.amazonaws.com/0/99425/919340e6-cdb6-e1ac-b91c-b27299ecb419.png)

デフォルトのS3のドメイン(「REST APIエンドポイント」)とは違い、HTTPSのエラーも返さず、タイムアウトしてしまいます。
どうやらこの「ウェブサイトエンドポイント」のドメインは HTTPSのアクセスに対応していないようです。

ちなみにこの状況でも、「ウェブサイトエンドポイント」としては、HTTPSアクセスできませんが、個別のオブジェクト自体は、通常のS3ドメイン名(「REST APIエンドポイント」)ではHTTP/HTTPSのアクセスが可能です。