こんなの書いていきます
- 利用例
- 小ネタ
利用例
この辺に使えないかと模索しています
- ECS のあふれたタスク処理
- 踏み台サーバ
- Cloud9 リモートサーバ
ECS のあふれたタスク処理
aws ecs describe-clusters
に --include "STATISTICS"
を付与すると返ってくる pendingEC2TasksCount
が 1 以上であれば run-task
で --launch-type FARGATE
を指定。
とはいえスケーリングの設定やアプリケーションの作り次第では必ずしもこの負荷の逃がし方が適切でもなく、目下思案中。
踏み台サーバ
多段 SSH するときだけ起動する EC2 はありませんか?
Fargate にしてしまいましょう。
これくらいあれば最低限動きそうです。
https://github.com/pottava/fargate-shell/tree/master/serverless-bastion/docker
- sshd に
-d
をつけて起動 することで、セッションが切れたら Fargate も落ちる - パスワード、または公開鍵認証(鍵は S3 を経由して配布)
- sudo させるかどうかを環境変数 ENABLE_SUDO で制御
Docker イメージとして踏み台を管理できれば、これをベースに作業内容をログに残したり、渡す IAM タスクロールで AWS-CLI の利用できるコマンドを制限したりもある程度自由にカスタマイズできそうです。
Cloud9 リモートサーバ
Fargate で Cloud9 のリモートサーバを管理すれば、Docker イメージで作業者の環境を管理できそうです。ベースイメージはこんな感じ。
https://github.com/pottava/fargate-shell/blob/master/serverless-cloud9/docker/Dockerfile
- AmazonLinux に必要なミドルウェアを入れたもの
- Cloud9 からの SSH 接続に必要な鍵は S3 を経由して連携
その上で、開発に必要なミドルウェアを載せて、Cloud9 のリモートサーバに指定すれば IDE が起動します。例えば go v1.9.2 ならこんな感じ。
https://github.com/pottava/fargate-shell/tree/master/samples/cloud9-go1.9
ただし・・
- docker in docker できないため、Cloud9 の
IDE に c9.ide.lambda.docker はインストールできない - 作業が終了したら Fargate を明示的に停止する必要がある
のが惜しい感じになりました。AWS さんのネイティブ対応が待たれます。それにしても Fargate、ハンズオンや Jupyter notebook を配るといったことにも応用できそうです。
小ネタ
(以下 2017/12/12 時点のものであり、また仕様やドキュメントとして記載がないものも取り上げているため、機能追加や特にアナウンスなく変更が入る可能性も十分にありえます)
渡ってくる環境変数
- AWS_DEFAULT_REGION
- AWS_REGION
- AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
最後の変数でタスクに割り当てた IAM ロールを確認できる ものの
コンテナ内であればそのロールは Assume された状態なので
例えば以下のコマンドも同等の情報を返してくれます。普通。
$ aws sts get-caller-identity
渡せない環境変数
EC2 ホストがないので ECS Agent にオプションが渡せない。例えば ECS_ENABLE_CONTAINER_METADATA
を true
にしたいけどできない。ECS_CONTAINER_METADATA_FILE
が渡ってくると地味に便利なんですが・・
タスク定義の制約
とある理由で docker in docker がしたかったのですが、おそらくセキュリティ上の理由から ECS では設定できる以下の項目が使えません。まあ、はい。
- linuxParameters/capabilities
- privileged
awsvpc の制約
Fargate の注意点というわけではないものの、Fargate である以上 awsvpc が避けられないので。
ECS ではコンテナの定義として containerPort
と hostPort
を別にすることができましたが、awsvpc ではそれが許されません。異なったポートを定義すると register-task-definition
で弾かれます。
An error occurred (ClientException) when calling the RegisterTaskDefinition operation: When networkMode=awsvpc, the host ports and container ports in port mappings must match.
ENI の上限
起動するコンテナごとに一つ消費されていくので、初期リージョン上限である 350 個が一つのハードルでしょうか。Lambda ほどスケールしてくれませんが、まあ、ユースケース違うしね。ところでいつか awsvpc でない起動方法は追加されるんでしょうか。されない気もしますね・・