ECS Service Discoveryを試してみる

##目的
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レコード

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/service-discovery.html
>サービスタスクで指定されたタスク定義が 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](https://qiita-image-store.s3.amazonaws.com/0/78184/d8b5a6ff-c717-48f3-fd06-abacf95fa6a1.png)

##DNS
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/225611ad-f37c-1fa6-8eca-19ab1c8d9422.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](https://qiita-image-store.s3.amazonaws.com/0/78184/cb0e6457-b336-d40e-16eb-8b1b988ab897.png)

###DNSレコード
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/6f4e07d7-5ef6-c715-91d1-e0a1f3d1469d.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](https://qiita-image-store.s3.amazonaws.com/0/78184/98712aeb-6f67-a517-d19f-68309be2dd91.png)

###DNSレコード
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/714aa78d-686c-473a-a7c2-7c6247d1c166.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](https://qiita-image-store.s3.amazonaws.com/0/78184/5c9e2072-7d2d-c283-43f9-052dfa890890.png)

###DNS
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/5bea352d-b5b8-31d8-cf56-ce030a64e8ba.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>
```

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