こんにちは、ちゃりおです。
AppMeshについて、勉強中です。
WorkShopなどでMesh内のECSからECSへ接続する設定はイメージついたのですが、ECS以外のリソース(RDS,ElastiCacheなど)へ接続するにはどうすればいいかと思ったのでブログにします。
Mesh内のECSからRDSへ接続する方法3つ
3つ方法があると思ったので、それぞれ書きます。
方法1. タスク定義のRDSへの接続はEnvoyを経由しないようにする
個人的には一番手っ取り早く、比較的影響範囲が少ない方法だと思います。
ECSのタスク定義でEnvoyプロキシを経由しないポートを指定することができます。
AppMeshはデフォルトでは、22以外のポートはEnvoyプロキシを経由して通信するようになっています。
そのため、RDSへの接続もEnvoyプロキシを通るのですが、「Egressフィルターで外部トラフィックを許可」していないかつ「RDSを仮想ノードに追加していない」場合は接続することができません。
この方法では、RDSのポートをタスク定義の「EgressIgnoredPorts」に登録してRDSへ接続する際はEnvoyプロキシを経由しないようにすることで疎通します。
https://docs.aws.amazon.com/ja_jp/app-mesh/latest/userguide/getting-started-ecs.html
方法2. RDSを仮想ノードに追加する
ECSの各サービスと同様にRDSを仮想ノードに追加します。
接続するECSの仮想ノードでバックエンドにRDSの仮想サービスを追加することで疎通ができるようになります。
この方法だと、どこからどこに接続しているかが追いやすいと思います。
envoyのメトリクスもとれます。
反面、仮想ノードへの追加やバックエンドへの追加などの手間はかかります。
方法3. MeshのEgressフィルターで外部トラフィックを許可する
一番手間は少ないですが、影響範囲が大きいです。
[外部トラフィックを許可する。デフォルトでは、メッシュ内のプロキシは相互間のトラフィックのみを転送します。外部トラフィックを許可する場合、メッシュ内のプロキシは、メッシュで定義されているプロキシでデプロイされていないサービスに TCP トラフィックを直接転送します。
https://docs.aws.amazon.com/ja_jp/app-mesh/latest/userguide/meshes.html
※デフォルトでは拒否になっています。
この方法であれば、上記の方法「1,2」のように個別で設定変更は不要です。
しかし、通信の自由度は格段に上がるのでRDSへ接続したいというだけであれば、上記「方法1,2」のほうがおすすめです。
まとめ
AppMesh内のECSからRDSへ接続したい場合は、以下の方法があります。
- 方法1. タスク定義のRDSへの接続はEnvoyを経由しないようにする
- 方法2. RDSを仮想ノードに追加する
- 方法3. MeshのEgressフィルターで外部トラフィックを許可する
個人的には、基本は方法2がいいかと思います。
方法2では仮想ノードに登録する手間がかかりますが、メトリクスも取れるようになるので可観測性が向上すると思います。
方法1は手軽ですが、ElasticSearchに接続するときに443など一般的なポートを除外することになるのであまり良くないです。
方法3はバックエンドで設定していないサービス(他ECSのサービス)にも接続できるようになるので、管理上好ましくないかと思います。
![ECR](https://chariosan.com/wp-content/uploads/2020/11/ECR-320x180.png)
![](https://chariosan.com/wp-content/uploads/2021/07/github-min-320x180.png)
![cdk](https://chariosan.com/wp-content/uploads/2021/03/cdk-320x180.png)