📝
チュートリアルレベルで ECS サービス検出を試してみた
サービス検出を使用して Amazon ECS サービスを DNS 名で接続する - Amazon Elastic Container Service
タスク間でドメインで接続できることを確認してみました。
前提
- デフォルト VPC を使用
- 2 つの ECS サービスでは同じ VPC, 同じセキュリティグループを使用
01. ECS クラスター作成
デフォルト設定で作成しました。

02. Cloud Map 名前空間の作成
以下の設定で作成しました。
- 名前空間名: ecs-tutorial.local
- インスタンスの検出: API 呼び出しと VPC の DNS クエリ
- VPC: デフォルト VPC

03. ECS タスク定義の作成
以下の内容で作成しました。
- 起動タイプ: AWS Fargate
- タスクロール: AdministratorAccess 権限を付与したタスクロール
- コンテナ名: webapp
- イメージ URI: nginx:latest
- コンテナポート: 80
上記以外はデフォルト設定です。
04. 接続先の ECS サービスの作成
03 のタスク定義を使用して以下の設定でサービスを作成します。
- クラスター: 01 で作成したクラスター
- 起動タイプ: FARGATE
- サービス検出
- サービス検出を使用
- 既存の名前空間を選択: 02 で作成した名前空間を選択
- サービス検出名: webapp
上記以外はデフォルト設定で作成します。
タスクの起動後、タスクのパブリック IP にアクセスして以下の画面が表示されれば OK です。

05. 接続元の ECS サービスの作成
基本的には 04 と同じ内容で作成しますが、以下の設定のみ変更します。
- サービス名: client-service
- サービス検出名: client
タスクの起動後、タスクのパブリック IP にアクセスして 04 と同じ画面が表示されれば OK です。
06. サービス検出の状況を確認
2 つの ECS サービスの起動完了後、以下の点をチェックしてください。
- Cloud Map の名前空間に 2 つのサービスが登録されているか
- Cloud Map の各サービスにインスタンスが紐づいているか
- インスタンスのヘルスは正常か
- Route 53 に ecs-tutorial.local というホストゾーンが作成されているか
- ホストゾーンに以下のレコードが作成されているか
- webapp.ecs-tutorial.local
- client.ecs-tutorial.local



07. 接続元の ECS サービスで ECS Exec を有効化
CloudShell などから以下のコマンドを実行します。
$ aws ecs update-service \
--cluster <01 のクラスター名> \
--service <05 の ECS サービス名> \
--enable-execute-command
上記コマンド実行後、接続元の ECS サービスを新しいデプロイを強制で更新します。

08. サービス検出の動作確認
07 で新規 ECS タスクの起動完了後、以下のコマンドで ECS Exec を実行します。
$ aws ecs execute-command \
--cluster <01 のクラスター名> \
--task <07 の ECS タスク ARN> \
--container webapp \
--interactive \
--command "/bin/sh"
コンテナにログイン後、以下のコマンドで ECS サービス間の通信ができることを確認します。
$ curl http://webapp.ecs-tutorial.local
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
上記のように Nginx のデフォルトページの html が返却されれば成功です。
疎通できない場合はセキュリティグループやインターネット接続の有無を確認してください。
まとめ
今回は チュートリアルレベルで ECS サービス検出を試してみました。
どなたかの参考になれば幸いです。
Discussion