Amazon Route 53 Auto Namingでサービスディスカバリを実現する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。
先日Amazon Route 53 Auto Namingがリリースされ、Route 53のDNS基盤によるマイクロサービスの切り替えやサービスディスカバリが利用できるようになりました。 試してみた様子をレポートします。

Route 53 Auto Namingとは

Route 53はSLA 100%を誇る高い可用性とスケーラビリティを備えたマネージドDNSサービスです。Auto Namingはサービスディスカバリ向けに、特定のDNS名へのレコード追加、削除のための専用APIを持ちます。サービスディスカバリ機能として提供されるのは従来からあるRoute 53のマルチバリューレコードとその個別ヘルスチェックなので、IAMとしてはAuto Naming APIの権限に加えてRoute 53 Hosted Zoneおよびレコードセットに関する権限が必要です。

設定手順

現時点では、AWSマネジメントコンソールはAuto Naming APIをサポートしていないので、AWS CLIで操作するのが最も手軽でしょう。Auto Naming APIの以下のコンポーネントを操作するためのサブコマンド一式がaws servicediscoveryに用意されています。

  • ネームスペース : Auto Namingで使用するDNSのゾーン名。Route 53のHosted Zoneに対応する。 例 : example.com
  • サービス : Auto Namingで管理するDNSレコード名。対応するリソースタイプはAAAAASRV。 例 : api.example.com
  • インスタンス : サービスに紐付くDNSレコード値。インスタンスIDというIDとセットで登録する。 例 : i-1234567890abcd:1.1.1.1

それぞれ順に作成していきます。まずはネームスペースから。Auto Naming APIはPublicとPrivate両方のHosted Zoneに対応します。サブコマンド名でどちらを作成するか選択します。今回は以下で試してみました。

  • Hosted Zoneのタイプ : Public
  • ネームスペース名 : autonaming.otaki.classmethod.info
$ aws servicediscovery create-public-dns-namespace \
  --output json --region us-east-1 \
  --name autonaming.otaki.classmethod.info
{
    "OperationId": "gtpxcs4kzvd35k6a3n6c6weaw7cq5pmb-jb1u59km"
}
$

このあとのサービス登録時にネームスペースのIDを求められるので、list-namespacesサブコマンドで確認しておきます。

$ aws servicediscovery list-namespaces  --region us-east-1 --output json
{
    "Namespaces": [
        {
            "Type": "DNS_PUBLIC",
            "Id": "ns-7balszw6i54wdfcg",
            "Arn": "arn:aws:servicediscovery:us-east-1:XXXXXXXXXXXX:namespace/ns-7balszw6i54wdfcg",
            "Name": "autonaming.otaki.classmethod.info"
        }
    ]
}
$

Okですね。ネームスペースの作成と連動して、同名のRoute 53 Hosted Zoneが自動で作成されます。

Publicネームスペースの場合は、Public Hosted Zoneと同様にDNSドメインの委任(上位ドメインからのNSレコードの追加)が必要です。必要に応じて対応しましょう。

続いてサービスを作成します。

  • サービス名 : target1
  • DNS設定 : Aレコード、TTL60秒

Publicネームスペースの場合、マルチバリューレコードに対応するヘルスチェックをサービス作成時にオプションで指定できますが、今回は省略します。

$ aws servicediscovery create-service \
  --region us-east-1 --output json \
  --name target1 \
  --dns-config 'NamespaceId=ns-7balszw6i54wdfcg,DnsRecords=[{Type=A,TTL=60}]'
{
    "Service": {
        "DnsConfig": {
            "NamespaceId": "ns-7balszw6i54wdfcg",
            "DnsRecords": [
                {
                    "Type": "A",
                    "TTL": 60
                }
            ]
        },
        "CreatorRequestId": "b8c9ad8f-a8b3-48ab-9616-5c6eaf718bd5",
        "Id": "srv-meow3azdanmdviqr",
        "Arn": "arn:aws:servicediscovery:us-east-1:XXXXXXXXXXXX:service/srv-meow3azdanmdviqr",
        "Name": "target1"
    }
}
$

サービスが作成されました。あとは、実際のレコードに紐付くインスタンスを登録します。

$ aws servicediscovery register-instance \
  --region us-east-1 --output json \
  --service-id srv-meow3azdanmdviqr \
  --instance-id i-1234567890abcd \
  --attributes AWS_INSTANCE_IPV4=1.1.1.1
{
    "OperationId": "wi4asvssar566ntla76gruc5gusdnl5k-jb1ucfe2"
}
$

Route 53のリソースレコードにも、マルチバリューレコードとして追加されていることが確認できました。

インスタンスIDやレコードの値はどちらも任意の値が設定出来ます。EC2インスタンスのインスタンスIDと合わせる必要はありませんが、そうすると管理上便利だと思います。マルチバリューレコードなので、登録を繰り返せば複数レコードになり、登録解除でレコードを減らすことができます。では、hostコマンドで動作を確認してみます。

$ host target1.autonaming.otaki.classmethod.info
target1.autonaming.otaki.classmethod.info has address 1.1.1.1
$

なお、Auto Naming API作成されたRoute 53の各リソースはAuto Naming APIの管理下になるため、Route 53側からそれらを削除しようとするとエラーになることに注意しましょう。

また、Auto Naming APIは現時点では一部のリージョン(北部バージニア、オハイオ、オレゴン、アイルランド)でのみサポートされているため、Privateネームスペースはそれらのリージョンでしか利用できないこと、PublicネームスペースではAWS CLIのリージョン指定に注意しましょう(Publicネームスペース自体はいずれかのリージョンで設定すればインターネットの任意のホストから利用できます)。

まとめ

Route 53 Auto Naming APIをご紹介しました。マルチバリューレコードを直接編集するよりはシンプルにサービスディスカバリ用途で使える仕組みになっていると思います。
もう少しIAMの権限周りがこなれてくると、管理しやすくなりそうな印象を持ちました。