Amazon ECS(Docker):コンテナーを特定のIPアドレスにバインドする


24

Amazon ECS(Dockerの再パッケージ化)で遊んでいますが、ECSが提供していないように見えるDocker機能が1つあります。つまり、インスタンスで複数のコンテナを実行し、IPアドレス1に着信するリクエストをコンテナ1にマッピングし、IPアドレス2に着信するリクエストをコンテナ2にマッピングしたい、などです。

Dockerでは、コンテナを特定のIPアドレスにバインドするには次の方法を使用します。

docker run -p myHostIPAddr:80:8080 imageName command

ただし、Amazon ECSでは、これを行う方法はないようです。

複数のElastic IPアドレスでEC2インスタンスをセットアップしました。コンテナをタスク定義の一部として構成する場合、ホストポートをコンテナポートにマッピングできます。ただし、Dockerとは異なり、ECSはホストIPアドレスをマッピングの一部として指定する方法を提供しません。

さらに、コンテナNからのアウトバウンドリクエストにコンテナNの外部IPアドレスを持たせたいということもあります。

上記のすべてを行う方法はありますか?

AWS CLIドキュメントとAWS SDK for Javaに目を通しました。CLIは、次のような要素を含むnetworkBindings配列を返すことができることがわかります。

{
  "bindIP": "0.0.0.0", 
  "containerPort": 8021, 
  "hostPort": 8021
},

Java SDKには、同じ情報を表すNetworkBindingという名前のクラスがあります。ただし、この情報は、リクエストへの応答として、出力専用のようです。このバインディング情報をECSに提供する方法が見つかりません。

これを行う理由は、同じEC2インスタンスで異なるコンテナを使用して、異なる構成に対して完全に異なるVMをセットアップすることです。各VMには、独自のWebサーバー(個別のSSL証明書を含む)と、独自のFTPおよびSSHサービスがあります。

ありがとう。


ワークフローにも同じ問題があります。aws ecs describe-container-instances役に立たないようです。彼らは本当にあなたにELBの使用を勧めたいと思っているようです。
-four43

今それを行う方法は1つあるようです(2017年第4四半期):stackoverflow.com/a/46577872/6309
VonC

回答:


4

1つのオプション:各クライアントにELBを作成し、特定のコンテナーを各ELBに割り当てます。

[1] http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html


13
キャッシング!1 ELBにつき月額18ドル。さて、ECSでマイクロサービスが必要なのは誰ですか?aws.amazon.com/elasticloadbalancing/pricing
ノット

1
@Knots同じ問題がありました。その後、Lambda + API Gatewayに切り替えて、コストを10セントに引き下げました。
グレープ

サービスごとに1つではなく、すべてのサービスに対して(従来のELBの代わりに)1つのALBを使用できるようになりました。それらは、異なるホスト名またはホスト名の異なるパスに存在する必要があります。
AJブラウン

4

実際の論理的な方法を次に示します。複雑すぎるように聞こえますが、実際に数分で実装でき、機能します。私たちが話すように実際にそれを実装しています。

各コンテナのタスクを作成し、各サービスのターゲットグループと組み合わせて、各タスクのサービスを作成します。そして、たった1つのElastic Load Balancerを作成します。

アプリケーションベースのエラスティックロードバランサーは、要求されたパスに基づいて要求をルーティングできます。ターゲットグループを使用すると、elb-domain.com/1コンテナ1に着信するリクエストelb-domain.com/2をコンテナ2などにルーティングできます。

これで、わずか1歩です。リバースプロキシサーバーを作成します。

私の場合、nginxを使用しているため、必要な数のIPでnginxサーバーを作成できます。nginxのリバースプロキシ機能を使用すると、IPをELBのパスにルーティングできます。 (s)。ドメインを使用している場合の例を次に示します。

server {
    server_name domain1.com;
    listen 80;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://elb-domain.com/1;
    }
}

もちろん、実際にIPをリッスンしている場合は、このserver_name行を省略して、対応するインターフェイスのみをリッスンできます。

これは、コンテナごとに静的IPを割り当てるよりも実際に優れています。これにより、各「IP」に対して要求がそのクラスター上で分散されるdockerマシンのクラスターを使用できるようになるためです。マシンを再作成しても静的IPに影響はなく、設定をやり直す必要はありません。

FTPとSSHを使用できないため、これで質問に完全に答えることはできませんが、Dockerを使用してこれを行うことは絶対に避けてください。代わりにクラウドサーバーを使用する必要があります。Dockerを使用している場合は、FTPまたはSSHを使用してサーバーを更新する代わりに、コンテナー自体を更新する必要があります。ただし、HTTPおよびHTTPSの場合、この方法は完全に機能します。


1

コンテナ自体にはできませんが、特定のコンテナ専用のEC2インスタンスを作成できます。次に、そのサービスにアクセスする必要がある場所で、コンテナを実行しているEC2ホストを参照できます。

  • この要件を使用して、サービス専用のクラスターを作成します
  • 好みのインスタンスタイプを使用して、AMIに最適化されたEC2インスタンス作成します
    • そのガイドで説明されているUserDataオプションを使用して、そのインスタンスを上記のクラスターに必ず割り当ててください。
  • NetworkModeを「bridge」に設定してTaskDefinitionを作成します(デスクトップと同じ)
  • 以下を使用してサービス定義を作成します。
    • LaunchTypeをEC2に設定
    • 上記で作成したクラスターに設定されたクラスター
    • 上記で作成したタスク定義に設定されたタスク定義
  • それ以外の場合と同様に、セキュリティグループをEC2インスタンスに割り当てます。

まだEC2インスタンスと直接対話していますが、コンテナのIPを(間接的に)EC2インスタンスと同様に制御できます。これにより、「ベアメタル」でサービスを実行するという頭痛の種がなくなり、サービスとその中の構成をより簡単に管理および構成できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.