CloudFormationを使用して、Route53の位置情報ルーティングポリシー環境を構築する

目次

CloudFormationを使用して、Route53の位置情報ルーティングポリシー環境を構築する

Route 53が提供するルーティングポリシーの1つに、位置情報ルーティングがあります。

位置情報ルーティングでは、ユーザーの地理的場所、つまり DNS クエリの送信元の場所に基づいて、トラフィックを処理するリソースを選択できます。

位置情報ルーティング

本ページでは、複数のALB向けに、位置情報ルーティングを使用した構成をご紹介します。

構築する環境

Diagram of using CloudFormation to build a Route53 Geolocation routing policy environment

2つのリージョンに同一の構成を用意します。
具体的には、ALBにAuto Scalingグループを関連づけて、同グループ内にEC2インスタンスを作成します。

2つのALBのDNS名をRoute 53に登録します。
これらは位置情報ルーティングのレコードとします。

なお今回の構成で使用するドメインは、Route 53で取得したもの(awstut.net)を使用します。
そのためドメインのホストゾーン(HostedZone)に関する設定は行いません。

また今回の構成で、ALBを配置するリージョンは以下の2つとします。

  • ap-northeast-1
  • us-east-1

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-saa/tree/main/01/007

テンプレートファイルのポイント解説

Route 53

Resources:
  RecordSetGroup:
    Type: AWS::Route53::RecordSetGroup
    Properties:
      HostedZoneName: !Sub "${DomainName}."
      RecordSets:
        - AliasTarget:
            DNSName: !Sub "{{resolve:ssm:${SSMParameterALBDNSName1}}}"
            HostedZoneId: !Ref ALBHostedZoneId1
          GeoLocation:
            ContinentCode: AS
          Name: !Ref DomainName
          SetIdentifier: !Ref Region1
          Type: A
        - AliasTarget:
            DNSName: !Sub "{{resolve:ssm:${SSMParameterALBDNSName2}}}"
            HostedZoneId: !Ref ALBHostedZoneId2
          GeoLocation:
            ContinentCode: NA
          Name: !Ref DomainName
          SetIdentifier: !Ref Region2
          Type: A
Code language: YAML (yaml)

1つのドメインに2つのレコードを追加します。
そのためRecordSetGroupに、2つのレコード用の設定を行います。

位置情報ルーティングを設定する上でのポイントは、以下のページでまとめられています。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resource-record-sets-values-geo.html

特にポイントとなる設定を取り上げます。

GeoLocationプロパティで地理情報を設定します。
地理情報は3パターンあります。

  • 大陸コード
  • 国コード
  • アメリカの州コード

今回は大陸コードを使用します。
1つ目のレコードには「AS」を指定して、アジアからのトラフィック用に設定します。
2つ目のレコードには「NA」を指定して、北アメリカからのトラフィック用に設定します。

Nameプロパティには、ドメイン名を指定します。
両レコードに「awstut.net」を指定します。

SetIdentifierプロパティには、レコードにユニークなIDを割り当てます。
今回は各VPCを作成したリージョン名を指定します。

(参考) CloudFormation Stacksetsを使って、ALBやAuto Scaling構成を2リージョンに構築

位置情報ルーティングの検証を行うために、2つのリージョンにALBおよびEC2 Auto Scaling構成を構築します。
構成自体は両リージョンで全く同じです。
今回はこの構成をCloudFormation Stacksetsで構築します。

Stacksetsに関する基本的な事項は、以下のページをご確認ください。

あわせて読みたい
CloudFormation StackSets入門 – 自アカウントの複数リージョンにデプロイ 【CloudFormation StackSets入門 - 自アカウントの複数リージョンにデプロイ】 本ページでは、AWS StackSetsを取り上げます。 AWS CloudFormation StackSets は、複数の...

なお今回の構成は以下のページと全く同様です。

あわせて読みたい
Route53のレイテンシーに基づくルーティング(ALB向け) 【Route53のレイテンシーに基づくルーティング(ALB向け)】 Route 53が提供するルーティングポリシーの1つに、レイテンシーに基づくルーティングがあります。 複数の AWS...

上記のページでは、Route53のレイテンシーに基づくルーティングを検証するための構成が紹介されています。
今回のルーティングポリシーとは異なりますが、各リージョンのVPC内の構成は全く同じです。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

なお今回の構成では、名前を持ったIAMロールを作成します。
ですから以下のようなコマンドでスタックを作成します。

$ aws cloudformation create-stack \
--stack-name [stack-name] \
--template-url https://[template-path]/soa-01-007.yaml \
--capabilities CAPABILITY_NAMED_IAM
Code language: Bash (bash)

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • ALBのDNS名1:saa-01-007-ALB-2006865402.ap-northeast-1.elb.amazonaws.com
  • ALBのDNS名2:saa-01-007-ALB-1792436665.us-east-1.elb.amazonaws.com
  • SSM Parameter Storeパラメータ1:saa-01-007-alb-dns-name-ap-northeast-1
  • SSM Parameter Storeパラメータ2:saa-01-007-alb-dns-name-us-east-1

作成されたリソースをAWS Management Consoleから確認します。

2つのALBを確認します。

Detail of ALB 1.
Detail of ALB 2.

2つのリージョンにALBが1つずつ作成されています。
CloudFormation StackSetsによって、2つのリージョンに統一的に同一の構成が作成されたということです。

SSM Parameter Storeを確認します。

Detail of SSM 1.
Detail of SSM 2.

2つのパラメータストアに、ALBのDNS名が保存されています。
更新したユーザを見ると、Lambda関数です。
つまりCloudFormationカスタムリソースに関連づいているLambda関数によって、これらのパラメータが更新されたということです。

Route 53を確認します。

Detail of Route53 1.

「awstut.net」というドメインにいくつかレコードが設定されています。
Routing Policyの列を見ると、「Geolocation」のものが2行あります。
トラフィックのルーティング先を見ると、ALBのDNS名であることがわかります。
1行目はAsiaからのアクセス用のレコード、2行目は北アメリカからのアクセス用のレコードです。

動作確認

準備が整いましたので、実際に挙動を確認します。

まずそれぞれのALBのDNS名にアクセスします。

$ curl http://saa-01-007-ALB-2006865402.ap-northeast-1.elb.amazonaws.com
instance-id: i-026833c9117843b43

$ curl http://saa-01-007-ALB-1792436665.us-east-1.elb.amazonaws.com
instance-id: i-0e377907b1bf24e15
Code language: Bash (bash)

各ALB配下のEC2インスタンスのIDが返ってきました。
両ALBは正常に動作しています。

ap-northeast-1リージョンのCloudShellからドメイン名でアクセスします。

Detail of CloudShell 1.

ap-northeast-1側のALBにアクセスしていることがわかります。
送信元の地理情報を使って、us-east-1ではなく、ap-northeast-1側にルーティングされたということです。

次にus-east-1リージョンのCloudShellからドメイン名でアクセスします。

Detail of CloudShell 2.

us-east-1側のALBにアクセスしていることがわかります。
先ほどと同様に、送信元の地理情報を用いて、us-east-1側にルーティングされたということです。

最後にeu-central-1リージョンのCloudShellからドメイン名でアクセスします。

Detail of CloudShell 3.

アクセスに失敗しました。

これは位置情報ルーティングの仕様によるものです。

デフォルトリソースレコードセットを作成して、どの場所にもマッピングされない IP アドレスからのクエリと、位置情報レコードを作成していない場所からのクエリの両方を処理することができます。デフォルトレコードを作成しない場合、Route 53 はそのような場所からのクエリに対して “応答なし” という応答を返します。

位置情報ルーティング

ちなみにデフォルトリソースレコードの作成方法は、以下の通りです。

[ロケーション]に関する[デフォルト]の値を持つ位置情報レコードを 1 つ作成することをお勧めします。これにより、レコードを作成していない地理的場所および Route 53 が位置を識別できない IP アドレスをカバーできます。デフォルトの場所を設定する場合は、国コードをアスタリスク「*」に設定します。

Location

まとめ

Route53の位置情報ルーティングをご紹介しました。

目次