S3,HTTPS

S3のSSL通信

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

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

結論としては、

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

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

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

もう少し別の言い方でまとめると、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 アクセス可能です。

「ウェブサイトエンドポイント」とは何か

ここでHTTPSアクセスができない「ウェブサイトエンドポイント」とは何かを理解するために、以下のようなシンプルな HTMLファイル (sample.html)を作成してS3にアップしてみます。

<html>
<head>
<title>test html</title>
</head>
<body>
<img src="/sample1.jpg" alt="sample">
</body>
</html>

こちらにアクセスしてみると、

image

同じS3上にある画像ファイルを参照できません。これはS3がWebサーバーとしての機能を持っていないためです。単純にHTMLを解釈するだけだと、S3のデフォルトのドメインでもできる場合があるのですが、「ウェブサイトホスティング」をS3に構成すると、エラードキュメントを置けたり、リダイレクトルールを設定できるようになり、Webサイトぽい使い方ができるようになります。

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

設定自体はとても簡単です。
image
「Static website Hosting」を選びます。

image
「このパケットを使用してウェブサイトをホストする」を選びます。

image
後は、インデックスドキュメントを選びます。
以上で設定は完了です。非常に簡単です。
また設定項目を見るとわかるように、リダイレクトルールやエラードキュメントも作る事ができ、動的なコンテンツの生成が必用無いのであれば、"Webサイトぽい”使い方ができるようになっているのがわかります。

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

「ウェブサイトエンドポイント」を構成しても、デフォルトのドメイン名(「APIエンドポイント」)を使ったURLは、そのままアクセスできます。

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

  • https://yuhkih.s3-ap-northeast-1.amazonaws.com/sample.html (「REST APIエンドポイント」仮想ホスト型式 )
    image.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サイトとして機能するので HTML内に指定したS3上の画像が表示されるようになりました。

image

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

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

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

image

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

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