はじめに
2020/7/29に、AWS Cloud Mapがアップデートされ、EC2のインスタンスをインスタンスIDで登録できるようになったようだ。
え、これってもしかして、これまではEC2単独で済むような低SLAの内部通信のサーバでも、わざわざ前段にNLB立ててRoute53のプライベートホストゾーンを設定しなければいけなかったのが不要になるということ?神アップデートじゃん!
ということで、さっそく試してみた。
前提条件
- AWS Cloud Mapって何?が分かっていること
まあ、概要はクラスメソッド先生の記事がたいへん分かりやすいので、これを見ておけば充分かと思う。
API取得編
基本は通常のサービスディスカバリの登録手順と同じである。
まずは名前空間を作成する。
適当な名前空間名と説明を入れて、今回は「API呼び出し」を選択する。
ちょっと待てば名前空間の作成は完了。
ここで、作ったドメイン名のリンクを踏み、サービスの作成を行う。
サービス名と説明とヘルスチェックはテキトーに設定する。
サービスが作れたら、今度はインスタンスを紐づける。
インスタンスタイプで「EC2インスタンス」を選択し、適当なサービスインスタンスIDを設定し、対象のEC2インスタンスIDをプルダウンから選択し、カスタム属性をテキトーに設定する。
完成!
サービス名からIPアドレスを参照できるかCLIで試してみる。
$ aws servicediscovery discover-instances --namespace-name cloudmaptest-for-api --service-name web-service
{
"Instances": [
{
"InstanceId": "web-server-instance",
"NamespaceName": "cloudmaptest-for-api",
"ServiceName": "web-service",
"HealthStatus": "UNKNOWN",
"Attributes": {
"AWS_EC2_INSTANCE_ID": "[インスタンス]",
"AWS_INSTANCE_IPV4": "172.64.0.252",
"Name": "[設定したタグ]"
}
}
]
}
あとはもうお分かりだろう。jqコマンドを使えばIPアドレスを抜き出すことができる。
$ jq -r '.Instances[].Attributes.AWS_INSTANCE_IPV4'
DNS参照編
残念ながら、「API 呼び出しと VPC の DNS クエリ」の名前空間では、インスタンスIDでのEC2インスタンス指定はまだできないようであった。
名前空間を「API呼び出しとVPCのDNSクエリ」で作成して進めいくと…
EC2のインスタンスIDを選択することができない!
AWS Cloud MapのAPI仕様書にも、以下のような文章があったので、CLIからなら設定できるとかそういう話でもなさそう。
AWS_EC2_INSTANCE_ID
HTTP namespaces only. The Amazon EC2 instance ID for the instance. If the AWS_EC2_INSTANCE_ID attribute is specified, then the only other attribute that can be specified is AWS_INIT_HEALTH_STATUS. When the AWS_EC2_INSTANCE_ID attribute is specified, then the AWS_INSTANCE_IPV4 attribute will be filled out with the primary private IPv4 address.
本当はこっちをやりたかったのだけど……。
結論
DNSを引くことができれば、現状でELBを経由している部分について、ELBを削除してAWS Cloud Mapを設定してあげさえすればアプリケーションの修正が不要になって最高だったので一歩見劣り。それでも、リソースを減らせるというのは嬉しいのである。