2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS Cloud Mapを使って内部通信で扱うEC2の名前解決をする

Posted at

はじめに

2020/7/29に、AWS Cloud Mapがアップデートされ、EC2のインスタンスをインスタンスIDで登録できるようになったようだ。
え、これってもしかして、これまではEC2単独で済むような低SLAの内部通信のサーバでも、わざわざ前段にNLB立ててRoute53のプライベートホストゾーンを設定しなければいけなかったのが不要になるということ?神アップデートじゃん!

ということで、さっそく試してみた。

前提条件

  • AWS Cloud Mapって何?が分かっていること

まあ、概要はクラスメソッド先生の記事がたいへん分かりやすいので、これを見ておけば充分かと思う。

API取得編

基本は通常のサービスディスカバリの登録手順と同じである。
まずは名前空間を作成する。

キャプチャ1.png

適当な名前空間名と説明を入れて、今回は「API呼び出し」を選択する。

キャプチャ2.png

ちょっと待てば名前空間の作成は完了。

キャプチャ3.png

ここで、作ったドメイン名のリンクを踏み、サービスの作成を行う。

キャプチャ12.png

サービス名と説明とヘルスチェックはテキトーに設定する。

キャプチャ4.png

サービスが作れたら、今度はインスタンスを紐づける。

キャプチャ5.png

インスタンスタイプで「EC2インスタンス」を選択し、適当なサービスインスタンスIDを設定し、対象のEC2インスタンスIDをプルダウンから選択し、カスタム属性をテキトーに設定する。

キャプチャ6.png

完成!

キャプチャ7.png

サービス名から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クエリ」で作成して進めいくと…

キャプチャ8.png

EC2のインスタンスIDを選択することができない!

キャプチャ11.png

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を設定してあげさえすればアプリケーションの修正が不要になって最高だったので一歩見劣り。それでも、リソースを減らせるというのは嬉しいのである。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?