Global AcceleratorでZone Apexを乗り越える

記事タイトルとURLをコピーする

Zone Apexというのは、example.comのようなドメイン名です。
ドメイン名の先頭にwwwやblogなど何もつかず、裸のドメイン名なので、Naked Domainと呼ばれたりもします。

ALBでZone Apexのドメインを使う場合、一般的にDNSサーバはRoute 53を使う必要があります。
これはALBの仕様とDNSのCNAMEの仕様が原因なのですが、弊社ブログでも過去記事があります。
CNAMEレコードにZone Apexをマッピングできない件について

AWS使う人が全員Route 53を使っているかというと、残念ながらそうシンプルではありません。
「他のDNSサービス使っているけど、これからALB使いたい、そしてZone Apexやで」 というケースもあります。
というか、Zone Apexとか普通は気にしないので、油断していると後半になってから問題が発覚します。

こんな感じに「あっ!」となることも。。。

f:id:swx-watanabe:20210201153130p:plain

Route 53を使っていない場合、「ALB+Zone Apex」の組み合わせは諦めるしかないのでしょうか。
基本的にはRoute 53への移行をお勧めしたいところですが、Global Acceleratorでなんとかなるとわかりました。

Application Load Balancer、Network Load Balancer、Amazon EC2 インスタンスなど、単一または複数の AWS リージョンのアプリケーションエンドポイントへの固定エントリポイントとして機能するスタティック IP アドレスを提供します。
AWS Global Accelerator(アプリケーションの可用性とパフォーマンスを向上)| AWS

今回の構成

f:id:swx-watanabe:20210201153142p:plain

VPC、ALB、EC2、ACMの作成

普通に作成しただけなので、説明は省略します。
なお、ALBにはACM発行の証明書をインストールしましたが、その際もRoute 53ではないDNSサーバにCNAMEを入れて認証させました。

Global Acceleratorの作成

Step 1 Enter name

まずは適当に名前をつけるだけです。

f:id:swx-watanabe:20210201153155p:plain

Step 2 Add listeners

HTTPSのALBに転送するので、Portsは443、ProtocolはTCPを設定します。

f:id:swx-watanabe:20210201153208p:plain

Step 3 Add endpoint groups

ALBは東京リージョンで動いているので、Regionはap-northeast-1を設定します。

f:id:swx-watanabe:20210201153219p:plain

Step 4 Add endpoints

Endpoint typeはApplication Load Balancerを選択します。
そして、Endpointでは実際に作成済みのALBリソースを選択します。

f:id:swx-watanabe:20210201153230p:plain

作成完了

グローバルIPが2つと、ドメイン名が1つ確認できます。
このグローバルIPが固定アドレス(Static IP Addresses)なので、これをDNSサービスにAレコードで登録すればOKです。

f:id:swx-watanabe:20210201153240p:plain

外部DNSサービスに設定

今回はGoogleのDNSサービスを使ってみましたが、他でも同じと思われます。

f:id:swx-watanabe:20210201153251p:plain

動作確認

Zone Apexにブラウザでアクセスしてみます。

f:id:swx-watanabe:20210201153303p:plain

まとめ

Global Acceleratorを使えば、Route 53を使わないでも、ALBでZone Apexを利用できました。
このサービスも当然料金が発生するものなので、必ずしもベストな構成かは難しいところですが、Route 53じゃない場合の奥の手として使えるかもしれません。

渡辺 信秀(記事一覧)

2017年入社 / 地味な内容を丁寧に書きたい

"; doc.innerHTML = entry_notice + doc.innerHTML; }
' } }) e.innerHTML = codeBlock; });