Amazon Route 53 Auto Namingでサービスディスカバリを実現する
ども、大瀧です。
先日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レコード名。対応するリソースタイプは
A
、AAAA
、SRV
。 例 :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の権限周りがこなれてくると、管理しやすくなりそうな印象を持ちました。