Cloud9 on Fargate など模索の経過報告

More than 1 year has passed since last update.

こんなの書いていきます


  • 利用例

  • 小ネタ


利用例

この辺に使えないかと模索しています


  • 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_METADATAtrue にしたいけどできない。ECS_CONTAINER_METADATA_FILE が渡ってくると地味に便利なんですが・・


タスク定義の制約

とある理由で docker in docker がしたかったのですが、おそらくセキュリティ上の理由から ECS では設定できる以下の項目が使えません。まあ、はい。


  • linuxParameters/capabilities

  • privileged


awsvpc の制約

Fargate の注意点というわけではないものの、Fargate である以上 awsvpc が避けられないので。

ECS ではコンテナの定義として containerPorthostPort を別にすることができましたが、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 でない起動方法は追加されるんでしょうか。されない気もしますね・・