AWS CLI、Route53、S3を使用して、カスタムドメインでの静的ウェブサイトホスティングをやってみた

前回のブログは静的ウェブサイトのホスティングのみでしたが、今回はカスタムドメインでの静的ウェブサイトホスティングを行ってみました。 Route53のHostedZoneIDは、それぞれの"リージョン"の"リソース"ごとに振られます。私は、リソースを作るたびにそれぞれ一意に発行される物だと思い込んでいました。皆さんは気をつけてください!
2020.06.11

どうも皆さん、たいがーです。
湿気がすごく、梅雨入りした感じをひしひしと感じています。

そんな今日はAWS CLIでAmazon Route53(以下、Route 53)、Amazon S3(以下、S3)を使って、カスタムドメインを使用した静的ウェブサイトのホスティングをやっていきたいと思います。

前回のブログの応用版になっていますので、一度こちらも読んでいただけると嬉しいです。

それぞれのサービスをざっくり整理してみる

Amazon Route 53

www.example.comのような名前をIPアドレスに変更する、ドメインネームシステム。(DNS)
ドメインを登録し、ドメインのインターネットトラフィックをルーティングする先を定義。
DNSヘルスチェックを構成し、トラフィックを正常なエンドポイントにルーティングしたり、アプリケーションやそのエンドポイントの正常性を独立してモニタリング。

Amazon S3

耐久度が高い(99.999999999%)、スケーラブルなオブジェクトストレージサービス。
静的ウェブサイトのホスティングが可能。

今回は、無料のカスタムドメインを取得し、Route53を使用し、静的ウェブサイトをホスティングしていきます。
構成図は以下のような感じです。

やってみよう

カスタムドメインを用意する

今回、検証用に"cm-tiger.tk"という無料ドメインを取得しました。

無料ドメインの取得はこちらのブログが分かりやすいので、参考にしてください☺️

Route53にカスタムドメインを登録する

ホストゾーンを作成し、カスタムドメインを登録します。
ホストゾーン作成のリクエストを送信するたびに、一意のCallerReference文字列を使用する必要があり、今回は日付と時間で設定しました。CallerReferenceには、日付/タイムスタンプなど、一意の文字列を使用できます。

$ aws route53 create-hosted-zone --name cm-tiger.tk --caller-reference `date +"%Y-%m%d_%H-%M-%S"`

実行結果にName Serverレコードが出力されているので、そちらを登録します。

ウェブサイトホスティング用のバケット、サブドメイン用のバケットを作成する

今回は先ほどの構成図の通り、ルートドメイン、サブドメイン用のバケットをそれぞれ用意します。

  • ドメイン用 バケット名: cm-tiger.tk
  • サブドメイン用 バケット名: www.cm-tiger.tk
$ aws s3 mb s3://cm-tiger.tk
$ aws s3 mb s3://www.cm-tiger.tk

ドメイン用バケットの静的ウェブサイトホスティング設定を有効にする

ドメイン用バケットにはホスティング、サブドメイン用バケットにはリダイレクト用の設定をします。
まず、ドメイン用バケットにテストページ用のHTMLファイル(今回は"index.html")をアップロードし、公開設定を行います。詳しくは最初に載せた、前回のブログに書いてあるので読んでみてください!

$ aws s3 cp index.html s3://cm-tiger.tk/index.html
$ aws s3 website s3://cm-tiger.tk --index-document index.html

先に公開設定を全て済ませてしまいましょう。バケットポリシーとパブリックアクセスブロックを設定していきます。

$ aws s3api put-bucket-policy --bucket cm-tiger.tk --policy file://bucket-policy
$ aws s3api put-public-access-block --bucket cm-tiger.tk --public-access-block-configuration  "BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false"

次に、サブドメイン用バケットの設定を行います。 www.cm-tiger.tkでアクセスされた場合、cm-tiger.tkにリダイレクトされるように設定します。

まず、リダイレクト設定用のJSONファイルを作成します。 今回は"redirect.json"という名前に設定しました。

{
    "RedirectAllRequestsTo": {
        "HostName": "cm-tiger.tk",
        "Protocol": "http"
    }
}

作成したファイルで、S3バケットにリダイレクト設定を行います。

$ aws s3api put-bucket-website --bucket www.cm-tiger.tk --website-configuration file://redirect.json

ドメインバケットへのアクセスログを記録する

S3バケットへのアクセスログはデフォルトでは無効になっています。有効にすると、ログはソースバケットと同じAWSリージョンのバケットに保存されるようになります。

そこで、ログを記録するS3バケットを作成し、その中にログファイルを格納するフォルダ"logs"を作成します。
作成する際には"/"を忘れないようにしましょう。/が入っていないと、フォルダではないオブジェクトが作成されます。

$ aws s3 mb s3://logs.cm-tiger.tk
$ aws s3api put-object --bucket logs.cm-tiger.tk  --key logs/

空のフォルダが作成できたかどうか確認してみます。

$ aws s3 ls s3://logs.cm-tiger.tk
    PRE logs/

無事、"logs"という名前のフォルダが作成できました。

ログ用バケットには、書き込み、読み取り権限が必要です。 そこで、ログ用バケットのACLを変更します。 ACLを変更するためには、AWSアカウントの正規IDが必要なので、まずはそちらを調べます。

$ aws s3api list-buckets
{
    "Buckets": [
        {
            "Name": "cm-tiger.tk",
            "CreationDate": "2020-06-11T03:03:58+00:00"
        },
        {
            "Name": "logs.cm-tiger.tk",
            "CreationDate": "2020-06-09T10:37:47+00:00"
        },
        {
            "Name": "www.cm-tiger.tk",
            "CreationDate": "2020-06-09T09:47:51+00:00"
        }
    ],
    "Owner": {
        "DisplayName": "XXXXXXXXXXXXXXXXX",
        "ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    }
}

ここではOwner以下を全てメモしておきます。

次に、ログ用バケットのACLを設定するため、設定用のjsonファイルを作成します。
今回は、"logs-bucket-acl.json"という名前に設定しました。

{
    "Owner": {
        "DisplayName": "NAME",
        "ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    },
    "Grants": [
        {
            "Grantee": {
                "DisplayName": "NAME",
                "ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        },
        {
            "Grantee": {
                "Type": "Group",
                "URI": "http://acs.amazonaws.com/groups/s3/LogDelivery"
            },
            "Permission": "WRITE"
        },
        {
            "Grantee": {
                "Type": "Group",
                "URI": "http://acs.amazonaws.com/groups/s3/LogDelivery"
            },
            "Permission": "READ_ACP"
        }
    ]
}

ちなみにGrantsというのは付与、という意味です。権限を付与する、ということですね。

作成したJSONファイルでACLを設定します。

$ aws s3api put-bucket-acl --bucket logs.cm-tiger.tk --access-control-policy file://logs-bucket-acl.json.json

次に、このフォルダにログファイルを格納させるために設定ファイルを作成します。
今回は、"logs.json"という名前に設定しました。

{
    "LoggingEnabled": {
        "TargetBucket": "logs.cm-tiger.tk",
        "TargetPrefix": "logs/"
    }
}

先ほど作成したJSONファイルをドメイン用S3に設定します。

$ aws s3api put-bucket-logging --bucket cm-tiger.tk --bucket-logging-status file://logs.json

これで、ログ記録用のバケットの設定は終わりです。

続いてRoute53のレコードセットを作成していきます。

レコードセットを作成する時は、JSONファイルで設定が可能です。 今回の場合、レコードセットは"cm-tiger.tk"と"www.cm-tiger.tk"の二つ用意する必要があるので、設定ファイルも二つ作成します。

まずはルートドメインの設定ファイルから作成します。 HostedZoneIDはそれぞれのリージョンのリソースごとに振られているので、こちらからご確認ください!今回は東京リージョンで行いました。

{
        "Comment": "Create RecordSet",
        "Changes":[{
          "Action": "CREATE",
          "ResourceRecordSet": {
            "Name": "cm-tiger.tk",
            "Type": "A",
            "AliasTarget":{
                "HostedZoneId": "Z2M4EHUR26P7ZW",
                "DNSName": "s3-website-ap-northeast-1.amazonaws.com",
                "EvaluateTargetHealth": false
            }
          }
          }]
}

続いて、サブドメインの設定ファイルです。

{
        "Comment": "Create RecordSet",
        "Changes":[{
          "Action": "CREATE",
          "ResourceRecordSet": {
            "Name": "www.cm-tiger.tk",
            "Type": "A",
            "AliasTarget":{
                "HostedZoneId": "Z2M4EHUR26P7ZW",
                "DNSName": "s3-website-ap-northeast-1.amazonaws.com",
                "EvaluateTargetHealth": false
            }
          }
          }]
}

その二つのファイルをホストゾーンにレコードセットとして設定します。 設定時にホストゾーンのIDを知る必要があるので、確認してから実行します。

$ aws route53 list-hosted-zones
$ aws route53 change-resource-record-sets --hosted-zone-id XXXXXXXX --change-batch file://recordsets.json

これで、サイトが公開できたはずです!!実際のドメインで検索して、確認してみましょう!!

是非やってみてください!

いかがでしたでしょうか!
皆さんも是非試してみてください☺︎

参考資料

Route 53 に登録されたカスタムドメインを使用した静的ウェブサイトの設定

AWS CLI での API レベル (s3api) コマンドの使用