ECS service connectについて

## はじめに
クラベスアドベントカレンダー21日目です！

クラベスでエンジニアをやってます。
[コードネーム](https://www.claves.co.jp/blog/2021-11-17-%E3%82%B3%E3%83%BC%E3%83%89%E3%83%8D%E3%83%BC%E3%83%A0%E3%81%8C%E3%81%82%E3%82%8B%E7%A7%98%E5%AF%86%E7%B5%90%E7%A4%BE/)は、`oz`といいます！

インフラ構築をしている際、採用予定だったApp Meshがサービス終了になったので
代替えサービスの検討をする必要がありました。

公式から案内されていたのが、ECS service connectだったので
仕組みについて確認したことをまとめます。

## ECS service connectとは

> Amazon ECS Service Connect では、Amazon ECS 設定としてサービス間通信を管理できます。Amazon ECS でサービス検出とサービスメッシュの両方を構築します。これにより、サービスのデプロイごとに管理する各サービス内の完全な設定、VPC DNS 設定に依存しない名前空間内のサービスを参照する統一された方法、すべてのアプリケーションを監視するための標準化されたメトリクスとログが提供されます。Service Connect は、サービスのみを相互接続します。

上記を読む限り、ECS Service Connectは
ECSで動作するコンテナ間の通信を行うための機能のようです。

つまり、ECS Service間の接続をうまくやってくれて
かつ通信ログや名前解決などをいい感じにやってくれるサービスに見えます。

## 実際に作ってみる
ECSを実際に作成して、疎通がどのようにして行われているか確認します。
作成するECSは、疎通確認ができればいいので一旦nginxを80番ポートでlistenしてみます。

また疎通確認をするにあたって、クライアントとサーバーを建てる必要があるので
複数台立ててみます。

![スクリーンショット 2024-12-20 19.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432360/f0015f76-8a64-57a1-0c60-b6fce03025d5.png)
![スクリーンショット 2024-12-20 19.54.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432360/e47350c1-6494-5b15-f73a-e9fa3c15f506.png)
![スクリーンショット 2024-12-20 19.56.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432360/7cb3834d-607c-b993-b0cc-6557243140bb.png)

## いざ疎通確認

リソースが立ち上がりました。
早速`pikachu`から`raichu`に疎通確認してみます。

では`pikachu`に入ります。

```
aws ecs execute-command --cluster Pikachu --task arn:aws:ecs:us-hoge-1:123456789:task/Pikachu/hoge --container pikachu --interactive --command "/bin/sh"

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.


Starting session with SessionId: ecs-execute-command-hoge
#
```

ちなみに、`raichu`は名前空間`electricity`にて80番をlistenしています。

```
curl http://erectricty
<!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>
```

接続できているようです。

では、次に`eevee`に接続してみます。
`eevee`は名前空間`normal`にて80番をlistenしています。
```
# curl http://normal
curl: (6) Could not resolve host: normal
```

接続できないようです。
名前解決できていないようです。
どういうことでしょうか。

答えは開発者ガイドにありました。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/service-connect.html
> VPC DNS 設定に依存しない名前空間内のサービスを参照する

接続するにあたって、同じ名前空間にクライアントとサーバーが存在している必要があるようです。
またVPC DNSを利用していないんですね。

すでに気づいている方もおられるかもしれませんが、
`pikachu`は`electricity`にいます。
そのため異なる名前空間`normal`にいる`eevee`とは疎通できないということでした。

## 実際どうやって解決しているか
答えは、hostsで解決しているようです。

```
# cat /etc/hosts
127.0.0.1 localhost
127.255.0.1 erectricty
2600:f0f0:0:0:0:0:0:1 erectricty
```

ECS service connectの設定を行うと同じ名前空間にある
サーバーとなるECSの情報を拾ってきて管理しているようでした。

また、サイドカーでコンテナが別につくのですが
ECSのリソースを使ってログの収集やサーキットブレーカーも実現してくれるようです。

## まとめ
- service connectの名前解決は、同じ名前空間にある必要がある
- 名前解決は、DNSではなくhosts

実際仕組み的な部分については、把握していなくても開発できるかなとは思うのですが
個人的に原理を把握しておくことは、いざとなったときに自分の助けになると思っているので
ぜひ機会があれば試してみてください。


## 僕が働いているクラベスについて
ちなみにクラベスでは、ちょっと技術検証をしたいなってときも
ある程度自由に使えるAWSアカウントが払い出されていたりします。

もし興味が湧いたら、カジュアル面談などでお話聞かせてもらえたらと思います。
クラベスHPより会社の雰囲気！わかります！
https://www.claves.co.jp/

## 参考記事
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/service-connect.html

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-exec.html

https://qiita.com/leomaro7/items/900764dc0ef9b977793f