AWS ECS に複数のマイクロサービスをデプロイする必要があるシナリオがあります。各マイクロサービスで開発された API を介して、サービスが相互に通信できるようにしたいと考えています。パブリックにアクセスでき、AWS ECS にデプロイされた他のマイクロサービスとも通信できるフロントエンドを AWS ECS にもデプロイしたいと考えています。どうすればこれを達成できますか?すべてのサービスをプライベートサブネットに配置して各サービス間の通信を有効にすることで、AWS ECS サービス検出を使用できますか? Elastic Load Balancer を使用して、エンドユーザーがインターネット経由でのみ HTTP/HTTPS プロトコルを介してフロントエンドのマイクロサービスにアクセスできるようにし、それをプライベートサブネットに保持することはできますか?
3 に答える
AWS ロード バランサー (パブリック アクセス用) と Amazon ECS Service Discovery (内部通信用) の両方の組み合わせは、ウェブ アプリケーションに最適です。
ECS のビルトイン サービス ディスカバリは、アプリケーションの外部で多くのリソースを管理する必要なく、動的なコンテナ環境を簡単に開発できるもう 1 つの機能です。ECS と Route 53 を組み合わせることで、可用性が高く、完全に管理された安全なサービス ディスカバリを提供します
サービス ディスカバリは、ロード バランサーのような仲介ではなく、コンテナーの直接 IP アドレスを使用して、あるコンテナーから別のコンテナーへのトラフィックを取得するための手法です。さまざまなユースケースに適しています。
- プライベートな内部サービス ディスカバリ
- サービス間の低遅延通信
- gRPC などの長期間有効な双方向接続。
はい、AWS ECS サービス検出 を使用して、すべてのサービスをプライベート サブネットに配置し、サービス間の通信を有効にすることができます。
これにより、ECS サービスが Amazon Route 53 で予測可能でわかりやすい DNS 名を使用して自動的に登録できるようになります。サービスが負荷やコンテナの状態に応じてスケールアップまたはスケールダウンすると、Route 53 ホストゾーンは最新の状態に保たれます。他のサービスが、各サービスの状態に基づいて接続を確立する必要がある場所を検索できるようにします。
はい。Load Balancerを使用して、エンドユーザーがインターネット経由でフロントエンドのマイクロサービスにアクセスできるようにすることができます。ECS での Web アプリケーションの AWS LB とサービス検出を示すこの図を見ることができます。
プライベート サブネットにあるバックエンド コンテナを確認できます。ALB を介してパブリック リクエストを処理し、残りのコンテナは AWS サービス ディスカバリを使用します。
Amazon ECS サービス検出
サービスディスカバリーでアプリを起動しよう!まず、「flask-backend」と「flask-worker」という 2 つのタスク定義を作成します。どちらも、HTTP リクエストを処理する単一のコンテナを使用する単純な AWS Fargate タスクです。Flask-backend に worker.corp に何らかの作業を依頼してもらい、応答と、Route 53 から返されたワーカーのアドレスを返します。以下のコードのようなもの:
@app.route("/")
namespace = os.getenv("namespace")
worker_host = "worker" + namespace
def backend():
r = requests.get("http://"+worker_host)
worker = socket.gethostbyname(worker_host)
return "Worker Message: {]\nFrom: {}".format(r.content, worker)
このプライベート アーキテクチャにはパブリック サブネットはなく、プライベート サブネットのみであることに注意してください。サブネット内のコンテナーは、内部 IP アドレスを使用して相互に通信できます。しかし、お互いの IP アドレスを発見する何らかの方法が必要です。
AWS サービス検出には、次の 2 つのアプローチがあります。
- DNS ベース (Route 53 は、他のコンテナーの 1 つ以上の IP アドレスに解決されるカスタム DNS 名を作成および維持します。この DNS 名を使用)
- API ベース (コンテナは API にクエリを実行して、使用可能な IP アドレス ターゲットのリストを取得し、他のコンテナの 1 つに直接接続を開くことができます。)
AWS のサービス ディスカバリとユース ケースの詳細については、amazon-ecs-service-discovery を参照してください。