AWS Fargateの機能制限とかできないこととか

cloudpack大阪の佐々木です。

既存タスク定義をFargateに持っていこうとすると、機能が未サポートだったり、制限等によりエラーになったりするかと思います。
Fargateでできないこと、制限などは下記のドキュメントに記載されていました。
http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html

まだ日本語化されておらず、Fargate専用ページになっていないので、この中からFargateの制限に関する部分を抜き出してみました。
今後変更されると思いますが、現時点（2017/12現在）のものをまとめておきます。
間違いとかあれば指摘ください！

## ネットワークモード

> If using the Fargate launch type, the awsvpc network mode is required.

awsvpcのみサポート

## Task Size

- Task memory (GB)
- Task CPU (vCPU)

> If using the Fargate launch type, this field is required and you must use one of the following values, which determines your range of valid values for the memory parameter.

タスク全体に割り与えるメモリとCPUで、Fargateでは必須パラメータ
値は組み合わせから選ぶ必要がある

|Memory|CPU|
|:--|:--|
|0.5GB, 1GB, 2GB|0.25 vCPU|
|1GB, 2GB, 3GB, 4GB|0.5 vCPU|
|2GB, 3GB, 4GB, 5GB, 6GB, 7GB, 8GB|1 vCPU|
|4GB 〜 16GB|2 vCPU|
|8GB 〜 30GB|4 vCPU|


## コンテナの定義

### イメージ

> The Fargate launch type only supports images in Amazon ECR or public repositories in Docker Hub.

ECRとDocker Hubのパブリックリポジトリのみサポート


### メモリ制限

> If your containers will be part of a task using the Fargate launch type, this field is optional and the only requirement is that the total amount of memory reserved for all containers within a task be lower than the task memory value.

コンテナレベルのメモリ制限はオプション
タスクレベルの設定より小さい値にする必要がある

### ポートマッピング

> containerPort
> If using containers in a task with the Fargate, exposed ports should be specified using containerPort.

> hostPort
> If using containers in a task with the Fargate, the hostPort can either be left blank or needs to be the same value as the containerPort.

コンテナとホストで別ポートにすることはできない


### CPUユニット数

> This field is optional for tasks using the Fargate launch type, and the only requirement is that the total amount of CPU reserved for all containers within a task be lower than the task-level cpu value.

コンテナレベルのCPUユニット数設定はオプション
タスクレベルより小さい値にする必要がある


### リンク

> Only supported if the network mode of a task definition is set to bridge. 

`awsvpc` のみサポートのFargateでは使えない
リンク機能の代替については [別記事](https://qiita.com/taishin/items/84122ad85bedf8b8a682) に書きました。

### ログ設定

> If using the Fargate launch type, the only supported value is awslogs. For more information on using the awslogs log driver in task definitions to send your container logs to CloudWatch Logs, see Using the awslogs Log Driver.

ログドライバは `awslogs` のみサポート


### 特権付与(privileged)

> This parameter is not supported for Windows containers or tasks using the Fargate launch type.

未サポート

### Dockerセキュリティオプション

> This parameter is not supported for Windows containers or tasks using the Fargate launch type.

未サポート

### linuxParameters

> This parameter is not supported for Windows containers or tasks using the Fargate launch type.

未サポート


## 制約(Task Placement Constraints)

> If you are using the Fargate launch type, task placement contraints are not supported.

インスタンスが見えないので当然未サポート


## ボリューム

> If you are using the Fargate launch type, the sourcePath parameter is not supported.

ソースパスが未サポートなのでホストのファイルシステムをマウントすることはできない
これができなにので、Datadogとかのエージェントコンテナを使って監視するような[構成](https://docs.datadoghq.com/integrations/docker_daemon/)ができないのではないかと思います。
CloudwatchでCPUとメモリの値はとれますが、こういう外部ツールとの連携もできればいいなとは思います。


## その他

ALB、NLBと連携はできますが、Fargateのタスクを落としても、LBは削除されません。
当たり前なんですが、実際使ってみると、インスタンスの存在は気にせずに使えるのに、LBは意識しないといけないというのが違和感・・・
課金のことを考えると停止もできないので、都度削除とか、このへんも改善してほしいと思いました。