##目的
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",
##名前解決
$ 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",
###名前解決
$ 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レコードが設定できます。
###名前解決
$ 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レコードが設定できます。
###名前解決
$ 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>
##約束
投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。