Amazon ECS ネットワークモードを検証してみる

Amazon ECSネットワークモードを検証してみるというよりも簡単に詳しくのような纏めてみる。



#1.host#

`→ 80 ➡︎`

一つのホストで同じポートを利用するタスクを複数起動することはできません。

既に 80番ポートで起動していたとします。

```
docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS                 PORTS               NAMES
8a2b3e44e650        nginx:latest                     "nginx -g 'daemon of…"   8 minutes ago       Up 8 minutes                               ecs-task03-1-continer03-e49ee9ace5befbded001
5218a3f2e942        amazon/amazon-ecs-agent:latest   "/agent"                 4 hours ago         Up 4 hours (healthy)                       ecs-agent
```

では、同じ80番ポートで起動してみよう。

このように、`理由: ["RESOURCE:PORTS"]`となり、タスクの実行に失敗する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c2c01a58-f63a-26d7-3a1a-2c4006282352.png)

詳細：[APIエラーメッセージ](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/api_failures_messages.html)



#2.bridge#

`→　80 ➡︎　80
 →　8080 ➡︎　8888`

ECSインスタンス（EC2）のENIを複数のタスクが共有で利用します。

通常のdockerのbridge（default）だと思えばいい。

```
docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS                 PORTS               NAMES
06b03ada9531        nginx:latest                     "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes           80/tcp              ecs-task-d0306-1-continer0307-e8eafff7f9e89ffc9901
0486fed8a8a8        nginx:latest                     "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes           80/tcp              ecs-task-d0306-1-continer0306-d2b58bbdf4b5e0917900
8c96ab8d534b        amazon/amazon-ecs-agent:latest   "/agent"                 6 hours ago         Up 6 hours (healthy)                       ecs-agent

"Containers": {
            "0486fed8a8a8f80458cb5f0c88711f06755e9624a583b7a8201bf63d77a0a091": {
                "Name": "ecs-task-d0306-1-continer0306-d2b58bbdf4b5e0917900",
                "EndpointID": "ed47b3b141de336c5467fc46a669886cc501797fb2aceac0135424c980787f00",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "06b03ada953195a4c67dc1c987144328aaa9baf8ae11bccc51d7def154dac139": {
                "Name": "ecs-task-d0306-1-continer0307-e8eafff7f9e89ffc9901",
                "EndpointID": "cc475cb74d5f2c2c1d36ec84fba985d5aa966a377057ce82433c2313d7468bd7",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
```



#3.awsvpc#

`→　80 ENI ➡︎ 80
 →　80 ENI ➡︎ 80`

ENIごとにポートを指定できるので、bridgeのように同じホストが利用できなくなることはない。

ちなみに、ENIの数には注意する必要がある。

例えば、t2.micro で起動していたとする。なので、ENI の制限は 2。
詳細：[Elastic Network Interfaces](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)

Amazon EC2インスタンスには、それらに接続できるネットワークインターフェースの数に制限があり、プライマリネットワークインターフェースは1つとしてカウントされる。

まず1つ目のタスクを コンテナポート 80 で作成する。

ENI をのぞいてみるとENIが自動的に作成されたことがわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/386a0f06-f071-2995-8e5c-6ea46ec6908b.png)

作成したコンテナ以外に、今まであった amazon-ecs-agent、新しく amazon-ecs-pause が作成されたことがわかる。

```
docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS                       PORTS               NAMES
25cc25fa9157        nginx:latest                     "nginx -g 'daemon of…"   About an hour ago   Up About an hour                                 ecs-task-d01-1-continer-9cfadeeb8ba9faec1100
a2b51724dd8b        amazon/amazon-ecs-pause:0.1.0    "./pause"                About an hour ago   Up About an hour                                 ecs-task-d01-1-internalecspause-d4ba96ffa4d197ec2000
8c96ab8d534b        amazon/amazon-ecs-agent:latest   "/agent"                 About an hour ago   Up About an hour (healthy)                       ecs-agent
```

プライベートIPに対して応答があることが確認できる。

```
curl http://10.0.2.226
<!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>
```

新しいタスクを起動してみるとENIに制限`理由: ["RESOURCE:ENI"]`でタスクの実行に失敗する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/5637de52-f3b7-b229-e40b-3574e2aaa77d.png)
詳細：[APIエラーメッセージ](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/api_failures_messages.html)


---
#リンク#
[Amazon ECS 細かい箇所を整理してみた](https://qiita.com/leomaro7/items/6afd607f2df39f714a8e)