
AWSにFargateクラスターをセットアップしました。私のクラスターには次のものがありますサービス:
- サーバーA (ポート3000)
- サーバーB (ポート 4000)
各サービスは同じ VPC 内にあり、同じセキュリティ グループ (任意のポート、任意のソース、任意の宛先) を持ちます。VPC はインターネットから分離されています。
ここで、server-A が server-B に http クエリを送信するようにします。Docker swarm と同様に、サービス名をプライベート IP にマッピングするプライベート DNS があり、クエリを次の宛先に送信するだけで済むと想定します。http://サーバーB:4000ただし、サーバー A はタイムアウトになり、サーバー B に到達できなくなります。
ドキュメントには、2つのコンテナを同じサービスに配置し、各コンテナが異なるポートでリッスンするようにすると、ループバックインターフェースのおかげで、サーバーAからクエリを実行できると書いてありました。http://127.0.0.1:4000サーバー B が応答し、その逆も同様です。
しかし、サーバーAとサーバーBをスケールできるようにしたい独立してしたがって、2 つのサービスを用意して各サーバーを互いに独立させておくのが合理的だと思います。
2 つのタスクが相互に通信するには、ロードバランサーを設定する必要があると読みました。Docker Swarm の世界では、サービス名でサービスをクエリするのは非常に簡単で、バックグラウンドで、リクエストはそのサービス内のコンテナーの 1 つに転送されていました。しかし、AWS Fargate ではそのようには機能しないようです。
質問:
- サーバー A はどのようにしてサーバー B と通信できるのでしょうか?
- サービスは時々再デプロイされ、プライベートIPが変更されるため、IPでクエリするのは意味がなく、ホスト名でクエリするのが最も自然な方法のようです。
- 何らかの内部 DNS を設定する必要がありますか?
ご協力ありがとうございます。この簡単な設定を行うのに本当に困っています。
答え1
調べたところ、サービス作成時に「サービス検出」を有効にしていなかったため、プライベート DNS が作成されなかったことが原因であることがわかりました。手順を正確に説明した追加のドキュメントを以下に示します。
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service-discovery.html