LoginSignup
19
11

More than 3 years have passed since last update.

ECS Service Discoveryを試してみる

Last updated at Posted at 2018-11-21

目的

ECS Service Discoveryをちゃんとさわったことがなかったので動きを確認してみます。

https://aws.amazon.com/jp/blogs/news/amazon-ecs-service-discovery/
https://aws.amazon.com/jp/about-aws/whats-new/2018/05/amazon-ecs-service-discovery-supports-bridge-and-host-container-/

前提

ECSのネットワークモードにより設定できるDNSレコードが異なります。

hostモード:SRVレコードのみ
bridgeモード:SRVレコードのみ
awsvcp:SRVレコードとAレコード

サービスタスクで指定されたタスク定義が awsvpc ネットワークモードを使用する場合、各サービスタスクで A レコードまたは SRV レコードを組み合わせて作成できます。SRV レコードを使用する場合、ポートが必要です。
サービスタスクで指定されたタスク定義が bridge または host ネットワークモードを使用する場合、SRV のレコードのみがサポートされる DNS レコードタイプです。各サービスタスクの SRV レコードを作成します。SRV レコードのコンテナ名とコンテナポートの組み合わせをタスク定義から指定する必要があります。

bridgeモードでは、ホスト側のポートが動的に割り振られ、コンテナポートにNATされるため、クライアントからみた場合は、AレコードでIPアドレスを返して貰うだけではアクセスできず、動的に振られるポート番号も必要になります。そのため、SRVレコードを使ってホスト名とポート番号をクライアントに返します。

環境の前提

vpc設定でPrivate Hosted Zoneが引けること
セキュリティグループでCurlを実行する端末からのアクセスを許可する
セキュリティグループは、hostモードとbridgeモードの場合は、ECSクラスタを構成するEC2インスタンスに付与されたセキュリティグループで設定します。awsvpcの場合は、コンテナごとにENIが付与されるため、ENIにアタッチされたセキュリティグループで許可をします。

EC2タイプ+ネットワークモード=host

タスク定義

      "portMappings": [
        {
          "hostPort": 80,
          "protocol": "tcp",
          "containerPort": 80
        }
      ],

"networkMode": "host",

サービス

image.png

DNS

image.png

名前解決

$ dig SRV nginx-ec2-host2.local

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.58.amzn1 <<>> SRV nginx-ec2-host2.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50064
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;nginx-ec2-host2.local.     IN  SRV

;; ANSWER SECTION:
nginx-ec2-host2.local.  60  IN  SRV 1 1 80 1d1f8cdd561c4c6cad23a983062a1016.nginx-ec2-host2.local.

;; Query time: 4 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: Wed Nov 21 06:58:55 2018
;; MSG SIZE  rcvd: 113
$ dig 1d1f8cdd561c4c6cad23a983062a1016.nginx-ec2-host2.local

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.58.amzn1 <<>> 1d1f8cdd561c4c6cad23a983062a1016.nginx-ec2-host2.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44042
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;1d1f8cdd561c4c6cad23a983062a1016.nginx-ec2-host2.local.    IN A

;; ANSWER SECTION:
1d1f8cdd561c4c6cad23a983062a1016.nginx-ec2-host2.local. 37 IN A 172.31.21.200

;; Query time: 0 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: Wed Nov 21 06:59:18 2018
;; MSG SIZE  rcvd: 88

EC2のプライベートIPアドレスが返されます。

$ curl 172.31.21.200:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

EC2タイプ+ネットワークモード=bridge

タスク定義

      "portMappings": [
        {
          "hostPort": 0,
          "protocol": "tcp",
          "containerPort": 80
        }
      ],
"networkMode": "bridge",

サービス

image.png

DNSレコード

image.png

名前解決

$ dig SRV nginx_ec2_bridge2.local

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.58.amzn1 <<>> SRV nginx_ec2_bridge2.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55266
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;nginx_ec2_bridge2.local.   IN  SRV

;; ANSWER SECTION:
nginx_ec2_bridge2.local. 60 IN  SRV 1 1 32901 dcfbf39448a34cc393baa22ae22c2f60.nginx_ec2_bridge2.local.

;; Query time: 2 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: Wed Nov 21 07:33:40 2018
;; MSG SIZE  rcvd: 117
$ dig dcfbf39448a34cc393baa22ae22c2f60.nginx_ec2_bridge2.local

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.58.amzn1 <<>> dcfbf39448a34cc393baa22ae22c2f60.nginx_ec2_bridge2.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47884
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;dcfbf39448a34cc393baa22ae22c2f60.nginx_ec2_bridge2.local. IN A

;; ANSWER SECTION:
dcfbf39448a34cc393baa22ae22c2f60.nginx_ec2_bridge2.local. 25 IN A 172.31.21.200

;; Query time: 0 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: Wed Nov 21 07:34:15 2018
;; MSG SIZE  rcvd: 90

EC2のプライベートIPアドレスが返されます

$ curl 172.31.21.200:32901
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

EC2タイプ+ネットワークモード=awsvpc

タスク定義

"portMappings": [],
"networkMode": "awsvpc",

サービス

awsvpcモードは、AレコードとSRVレコードが設定できます。

image.png

DNSレコード

image.png

名前解決

$ dig 94a84b79ebb04a0daf98c303abe3b1bb.nginx_ec2_awsvpc3.local

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.58.amzn1 <<>> 94a84b79ebb04a0daf98c303abe3b1bb.nginx_ec2_awsvpc3.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14169
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;94a84b79ebb04a0daf98c303abe3b1bb.nginx_ec2_awsvpc3.local. IN A

;; ANSWER SECTION:
94a84b79ebb04a0daf98c303abe3b1bb.nginx_ec2_awsvpc3.local. 60 IN A 172.31.4.11

;; Query time: 2 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: Wed Nov 21 09:05:56 2018
;; MSG SIZE  rcvd: 90
$ curl 172.31.4.11:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

直接ホスト名でHTTPリクエストすることも可能です。

$ curl nginx_ec2_awsvpc3.local.
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

Fargateタイプ+ネットワークモード=awsvpc

タスク定義

"portMappings": [],

"networkMode": "awsvpc",

サービス

awsvpcモードは、AレコードとSRVレコードが設定できます。
image.png

DNS

image.png

名前解決

$ dig SRV nginx_ec2_awsvpc3.local

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.58.amzn1 <<>> SRV nginx_ec2_awsvpc3.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24816
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;nginx_ec2_awsvpc3.local.   IN  SRV

;; ANSWER SECTION:
nginx_ec2_awsvpc3.local. 60 IN  SRV 1 1 80 94a84b79ebb04a0daf98c303abe3b1bb.nginx_ec2_awsvpc3.local.

;; Query time: 5 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: Wed Nov 21 09:31:02 2018
;; MSG SIZE  rcvd: 117
$ dig 94a84b79ebb04a0daf98c303abe3b1bb.nginx_ec2_awsvpc3.local

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.58.amzn1 <<>> 94a84b79ebb04a0daf98c303abe3b1bb.nginx_ec2_awsvpc3.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44240
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;94a84b79ebb04a0daf98c303abe3b1bb.nginx_ec2_awsvpc3.local. IN A

;; ANSWER SECTION:
94a84b79ebb04a0daf98c303abe3b1bb.nginx_ec2_awsvpc3.local. 60 IN A 172.31.4.11

;; Query time: 2 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: Wed Nov 21 09:32:47 2018
;; MSG SIZE  rcvd: 90
$ curl 172.31.4.11:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

直接ホスト名でHTTPリクエストも可能です。

$ curl nginx_ec2_awsvpc3.local
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

約束

投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

19
11
1

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
19
11