3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(AWS) 静的Webサイトを S3 + CloudFront でHTTPS公開できるようにする

背景

アクセス数が少ない静的Webサイトをさくらインターネットレンタルサーバーで運用してたんですが、このご時世で値上げに。。
コスト減をするためにAWS S3で静的Webコンテンツを公開することにしました。運用レベルのアクセス数(数百リクエストであればほぼ$0.00で運用出来そうでしたので。。

最初、S3 のみで静的Webサイトホスティングを考えていました。
しかし、S3は HTTP アクセスのみ可で HTTPS アクセスはできないようです。

 Client ---(http)--- S3

ところが、S3 に CloudFront を組み合わせることでHTTPSアクセスができる事が分かりました。(CloudFrontにHTTPでアクセスした際も、HTTPSにリダイレクトできます。)

 Client ---(https)--- CloudFront ----- S3

ということで、S3 + CloudFront でHTTPS静的Webサイトを構築することにしました。

S3 側の設定

バケットの作成

まず、バケットの作成を行います。

バケット名は、グローバルで一意にする必要があります。

いったん[パブリックアクセスをすべてブロック]のチェックを外します。
後でCloudFrontからのみアクセスするようにしますが、今回はHTTPアクセスのテストをするため、パブリックアクセス許可にしておきます。

ファイルアップロード

バケットを作成したら、作成したバケットからファイルをアップロードします。
今回は、htmlとそこで使うjpeg,cssをアップしました。

静的ウェブサイトホスティング を有効に

作成したバケットの[プロパティ]から[静的ウェブサイトホスティング]を有効にします。

バケットポリシー を追加

まだこのままでは、ポリシーがないためインターネット側からはアクセスが不可です。
作成したバケットから、[アクセス許可]で、以下のバケットポリシーを追加します。
以下ポリシーの[hoge-test-bucket]の所は、作成したバケット名になります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::hoge-test-bucket/*"
            ]
        }
    ]
}

これで、バケットの[プロパティ]→[静的ウェブサイトホスティング]にあるURLにブラウザからアクセスするとHTTPでコンテンツが表示できます。
URLは http://バケット名.s3-website-リージョン.amazonaws.com という書式になるようです。

↑のように正しく表示されました。

CloudFront の設定

S3によるHTTPアクセスは出来たので、今度はCloudFront経由でのアクセスを設定してみます。

ディストリビューションの作成

CloudFrontから、[ディストリビューションの作成]を押下します。

[Origin domain]項目は、クリックするとS3バケットを選べれるので、そこからS3で作成したバケットを選択します。
[Web サイトのエンドポイントを使用]というのが表示されますが、これは無視で。。
[オリジンアクセス]を[Origin access control settings (recommended)]にします。これによりS3アクセスのポリシーを作成できます。

[Origin access control]がブランクになると思うので、[Create new OAC]をクリックします。
以下の画面になりますが、デフォルトのままで[Create]。

[ビューワープロトコルポリシー]は、[Redirect HTTP to HTTPS]にします。これにすることで、HTTPアクセスがあった場合、HTTPSにリダイレクトします。

[デフォルトルートオブジェクト - オプション]には、[index.html]を設定します。
[ウェブアプリケーションファイアウォール (WAF) ]は[セキュリティ保護を有効にしないでください]にしておきます。

S3側へのバケットポリシーの設定

CloudFront→[ディストリビューション]から上記で作成したディストリビューションを選択し[オリジン]でオリジンをチェックし[編集]を押下。

[オリジンアクセス]の[Origin access control]にある、[ポリシーをコピー]を押下します。

次に、S3のバケットの[アクセス許可]の[バケットポリシー]に、上記でコピーしたポリシーを貼り付け設定します。

なお、このポリシーの設定により、S3直へのHTTPアクセスはポリシー違反で不可となります。
(S3 へ直HTTPアクセスすると、403 Forbidden になります。)

S3 静的ウェブサイトホスティングを無効に

ポリシーでHTTPからのアクセスはできなくなっていますが、S3 バケットの設定、静的ウェブサイトホスティングを無効にしておきます。 (静的ウェブサイトホスティングを無効にすると、HTTPアクセスした時に、404 Not Found となります。)

また、[ブロックパブリックアクセス (バケット設定)]も、[パブリックアクセスをすべて ブロック]としておきます。

表示確認

最後に確認です。
CrotdFrontのディストリビューションドメイン名でアクセスすると、CroudFront経由でS3の静的Webサイトが見れるようになります。

参考:
S3のWEBサイトをCloudFrontからのみアクセス可能にする
【AWS】S3+CloudFront+Route53+ACMでSSL化(https)した静的Webサイトを公開する
【AWS】CloudFrontを使ってS3の静的WebサイトをHTTPSで表示する
CloudFrontでS3のウェブサイトをSSL化する