【新機能】Amazon EC2 Container Service(ECS)でNetworking ModeとMemory Reservationがサポートされました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

今回ご紹介する新機能はこちら。8/15にリリースされたものです。

Amazon EC2 Container Service(ECS)に2つのアップデートがありました。

  • Networking modeが変えられるようになった。これまでは仮想ブリッジを経由してコンテナが直接外部に接続されるBridgeモードのみだったが、新たに、仮想ブリッジを使わずにホストOSのネットワークスタックをそのまま使うHostモードとネットワークスタックを作成しないNoneモードが選べるようになった。
  • Memory Reservatin(メモリ予約)。メモリに対するソフトリミットが出来るようになった。

ということで実際にやってみました。

やってみた

以下のようにECSクラスタを構成しています。ECSクラスタには2つのECSインスタンスが所属しています。

Amazon_EC2_Container_Service

Task Definitionの作成

[Task Definitions]から[Create new Task Definition]ボタンをクリックします。

Amazon_EC2_Container_Service 2

[Create new Task Definition]で[Network Mode]という選択肢が増えています。これが今回の新機能の1つです。

Amazon_EC2_Container_Service 3

[Host]を選んだ場合は、以下のようにホストのネットワークスタックを共有する旨の警告が表示されます。

Amazon_EC2_Container_Service 4

[None]を選んだ場合は、以下のようにネットワークスタックが作成されない旨の警告が表示されます。

Amazon_EC2_Container_Service 5

今回は[Host]として設定します。設定後、[Container Definitions]欄の[Add container]ボタンをクリックします。

Amazon_EC2_Container_Service 6

[Add container]画面の[Memory Limits]で[Soft Limit]が選べるようになっています。これが今回の新機能の2つめ、Memory Reservation対応です。Soft Limitを設定し[Add]ボタンをクリックします。

Amazon_EC2_Container_Service 7

Container一覧に、Soft memory limitsが設定された状態でコンテナが登録されていることを確認します。[Create]ボタンをクリックします。

Amazon_EC2_Container_Service 8

Task Definitionの作成が成功したメッセージが表示されます。

Amazon_EC2_Container_Service 9

Taskの実行

次に[Cluster]画面から[Tasks]-[Run new Task]ボタンをクリックします。

Amazon_EC2_Container_Service 10

[Run Task]画面で、先ほど作ったTask Definitionを選択し、[Run Task]ボタンをクリックします。

Amazon_EC2_Container_Service 11

Taskが実行されました。

Amazon_EC2_Container_Service 12

動作確認

タスクが実行されているコンテナインスタンスを開いて、Public IPを確認します。

Amazon_EC2_Container_Service 13

確認したPublic IPにcurlコマンドでアクセスすると、nginxのアウトプットを取得できます。

$ curl http://52.xx.xx.xx/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

コンテナインスタンスのSecurity Groupの設定を変更した上で、SSHでログインします。docker networkで、これまでデフォルト設定であったbridgeの状況を確認すると、コンテナがbridgeネットワークを使っていないことがわかります。

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "xxxxxxxxxx",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

次にdocker networkで、hostの状況を確認すると、ecs-agentコンテナと今回作成したコンテナがhostネットワークを使っていないことがわかります。Network modeが変わっていることがわかりました!

$ docker network inspect host
[
    {
        "Name": "host",
        "Id": "xxxxxxxxxx",
        "Scope": "local",
        "Driver": "host",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Containers": {
            "xxxxxxxxxx": {
                "Name": "ecs-agent",
                "EndpointID": "xxxxxxxxxx",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            },
            "xxxxxxxxxx": {
                "Name": "ecs-web-2-web-xxxxxxxxxx",
                "EndpointID": "xxxxxxxxxx",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

AWS管理コンソールから該当のタスクを開くと、Soft memory limitが設定されていることがわかります!

Amazon_EC2_Container_Service 14

さいごに

ECSがDockerの機能にどんどん追従していってることがわかります。今回追加されたNetwork ModeとMemory Reservationはまだecs-cli composeからは設定できないようですが、これも近いうちに設定されるようになるでしょう。ますます便利になりますね!