【AWS】HugoをS3・CloudFrontにデプロイする【サイト構築②】

【AWS】HugoをS3・CloudFrontにデプロイする【サイト構築②】

ローカルで構築したHugoのブログサイトをAWS S3にデプロイし、Amazon CloudFrontで配信するまでの流れをまとめていきます。

なお、ローカルでのHugoサイトの作成と、Route 53での独自ドメイン取得が出来ている前提で話を進めていきます。

HugoをS3にデプロイする

まずはS3のバケットを作成していきます。

バケットの作成1

バケットの作成1

サイトは独自ドメインで運用するので、最終的にはS3のパブリックアクセスはブロックしてホスティングします。その前にS3でホスティングしてサイトを確認したいので、一旦パブリックアクセスをすべてブロック」のチェックは外します。

バケットの作成2

バケットの作成2

その他の設定はいじらなくて良いので、そのままバケットを作成します。

続いて、ビルドしたファイルのアップロードを行っていきます。

バケットの作成3

バケットの作成3

Hugoのビルド時に生成されたファイルがpublicフォルダ内にあるので、それらを選択します。下にある「アップロード」をクリックすると選択されたファイルがバケットにアップロードされます。

バケットの作成4

バケットの作成4

続いて、プロパティからS3の「静的ウェブサイトホスティング」を有効にしていきます。

静的ウェブサイトホスティングの設定1

静的ウェブサイトホスティングの設定1

静的ウェブサイトホスティングの設定2

静的ウェブサイトホスティングの設定2

インデックスドキュメントにはindex.htmlを入力します。

静的ウェブサイトホスティングの設定3

静的ウェブサイトホスティングの設定3

次に、「アクセス許可」からバケットポリシーを設定します。ポリシーに以下を記述します。

バケットポリシー
 1{
 2    "Version": "2012-10-17",
 3    "Statement": [
 4        {
 5            "Sid": "PublicReadGetObject",
 6            "Effect": "Allow",
 7            "Principal": "*",
 8            "Action": [
 9                "s3:GetObject"
10            ],
11            "Resource": [
12                "arn:aws:s3:::バケット名/*"
13            ]
14        }
15    ]
16}

ここまでで、静的ウェブサイトホスティングが完了するので、「プロパティ」で発行されたURLからアクセスし、サイトが表示されるかを確認しましょう。

静的ウェブサイトホスティングの設定4

静的ウェブサイトホスティングの設定4

ACMでSSL証明書を発行する

S3へのデプロイが完了したので、S3へCloudFrontからでアクセスするように設定します。その前にACMでSSL証明書を発行していきます。CloudFrontにACMのSSL証明書を適用するにはリージョンを「米国東部 (バージニア北部) us-east-1」にする必要があります。1

SSL証明書の発行1

SSL証明書の発行1

「パブリック証明書をリクエスト」を選択します。

SSL証明書の発行2

SSL証明書の発行2

ドメイン名に取得ドメインを入力します。当サイトの場合、併せて*.取得ドメインも追加しています。

SSL証明書の発行3

SSL証明書の発行3

ここまでで証明書の発行手続きが完了するので、ドメインにCNAMEレコードを追加します。「Route53でのレコード作成」から作成を行います。

SSL証明書の発行4

SSL証明書の発行4

SSL証明書の発行5

SSL証明書の発行5

SSL証明書の発行6

SSL証明書の発行6

証明書の「状況」ステータスが「発行済み」になれば成功です。

SSL証明書の発行7

SSL証明書の発行7

CloudFrontからサイトにアクセスする

証明書の発行まで完了したので、S3へCloudFrontからでアクセスするように設定します。まずディストリビューションの作成から行っていきます。「オリジンドメイン」とOACの「名前」はS3のバケット名を入力します。

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

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

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

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

「カスタムSSL証明書」には先ほど作成した証明書を、「デフォルトルートオブジェクト」にはindex.htmlを入力し、ディストリビューションを作成します。

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

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

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

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

続いて、S3バケットのアクセス許可設定を変更します。作成したディストリビューションの「編集」をクリックし、ポリシーをコピーしてバケットポリシーを変更します。

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

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

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

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

バケットポリシーにはコピーしたものをそのまま差し替えればOKです。

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

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

ここまでで一旦ディストリビューションの設定は終わりです。しかし、このままだとルートオブジェクト以外へのリクエストにindex.htmlが付かないので、ルートオブジェクト以外にアクセスができない状態になってます。その為、CloudFrontの関数でリクエストを書き換える処理を設定します。

関数の作成1

関数の作成1

関数の作成2

関数の作成2

関数名を適当に設定し、以下のコードを貼り付けます。「発行」タブから「関数の発行」をクリックします。

関数
 1function handler(event) {
 2    var request = event.request;
 3    var uri = request.uri;
 4    if (uri.endsWith('/')) {
 5        request.uri += 'index.html';
 6    }
 7    else if (!uri.includes('.')) {
 8        request.uri += '/index.html';
 9    }
10    return request;
11}

関数の作成3

関数の作成3

関数の作成4

関数の作成4

関数の作成5

関数の作成5

関数は作成しましたので、ディストリビューションの「ビヘイビア」から作成した関数を関連付けします。

関数の作成6

関数の作成6

最後に、ドメインのAレコードをCloudFrontに変更します。

関数の作成7

関数の作成7

これでCloudFrontでの配信の設定は終わりです。取得したドメインにアクセスし、サイトが表示されたら成功です。

ついでに、最初の方でパブリックアクセスのブロック設定をOFFにしていたので戻しておきましょう。


今回はHugoサイトをAWSにデプロイ・配信するまでをまとめました。以上で記事を終わりにします。

参考文献