ECS サービス (Fargate ではなく EC2) にドメイン名を追加する方法を探しています。
明確に言うと、私はDNSがドメイン名AまたはAAAA名を解決するソリューションを探しています(A または AAAA を指している場合は CNAME である可能性があります)どのネットワークモードで動作するかは問題ではありません。コンテナはhost
、、のいずれかに配置できますbridge
。awsvpc
解決策が機能するかどうか!
awsvpc
Fargate以外では実行不可能
AWS VPCを必要とするソリューションはECS/EC2と互換性がなく、Fargateでのみ実行可能と思われます。理由ここ:
awsvpc ネットワークモードを使用する各 Amazon ECS タスクは、それをホストする Amazon EC2 インスタンスに接続された独自の Elastic Network Interface (ENI) を受け取ります。ネットワークインターフェースの数にはデフォルトの割り当てがありますAmazon EC2 Linux インスタンスに接続できます。プライマリネットワークインターフェースは、そのクォータに対して1つとしてカウントされます。。
つまり、 はt3.medium
2つのタスクしか実行できず、 でさえt3.2xlarge
3つのタスクしか実行できない(制限ここ)
サービス検出は実行可能ではない
host
サービス ディスカバリは、SRV タイプの DNS レコードとネットワーク コンテナーのみを追加しますbridge
。実行するソフトウェアのほとんどは SRV レコードを認識しません。A レコードと AAAA レコードが必要です。
サービス ディスカバリは、ネットワーク タイプのコンテナーに対して A レコードと AAAA レコードを作成しますawsvpc
が、再びawsvpc
実行できなくなります。
AWS App Meshは実行不可能
アプリメッシュの設定を試みたところ、すぐにタスクを実行する必要があると言われました。awsvpc
¯\(ツ)/¯
ロードバランサは実行不可能と思われる
これは一部のサービスでは機能するかもしれません。しかし、サービスが HTTP ではない場合、またはサービスが SSL クライアント証明書によるクライアントの認証を要求する場合、大きな落とし穴に陥ってしまいます。
非 HTTP / クライアント SSL サービス用に多数の IP ロード バランサーを作成すると、コストがかかりすぎます。
<愚痴>
私の知る限り、Kubernetes ならこれを簡単に実現できます。docker swarm にさえこの機能があります。この些細なことを探すのに何時間も費やしてきたことに本当に驚いています。<\rant>
質問
ロードバランサーなしで ECS/EC2 コンテナにドメイン名を追加するにはどうすればよいですか?
答え1
明確に言えば、ECS コンテナに固有の Elastic Network Interface を接続することは望ましくありません (インスタンスあたりの制限のため)。そうすると、Terraform などを簡単に実行できるためです。
systemd 経由で独自の AppMesh ソリューションを展開します。
systemdの起動を介して実行されるbashスクリプトを使用してIMDSにアクセスし、ECSサービスのパブリックIPアドレスを検索し、その後AWS CLIを使用してDNSレコードを更新します。これは明らかにとても遅延バインディングなので、TTL を非常に低く設定するようにしてください。
- https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html
- https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v4.html
次の答え: 「そんなことはしないで」
答え2
質問がよくわかりません。サービス ディスカバリはドメイン名 (名前空間) をサポートしています。私の知る限り、これは実際に必須です。言い換えると、ECS サービスに SD を使用する場合は、 としてmyservice
参照する必要があります。 は、定義する必要がある任意の名前空間です (.local や .my.domain など) myservice.<domain>
。<domain>
ここに例がありますSD を使用するスタックの。
これらはすべて内部クラスターへの接続と、内部サービス検出の仕組み (ECS サービスが別の ECS サービスを検出する方法など)。
[編集] ECSサービスを公開したいがロードバランサーを使いたくない場合は、API GWを使用するという選択肢もあります。このブログ記事で説明されている一般的に、R53 で Fargate タスクのランダムなパブリック IP アドレスを登録することは望ましくありません。なぜなら、それらは一時的なものであり、Fargate タスクが来たり去ったりするときにそれらを揃えておくための複雑なメカニズムを構築する必要があるからです。また、アプリランナー?
答え3
いかがでしょうかクラウドマップ?
docker-compose がこれとどのように連携するか: