#
ドキュメント

Document

自分のための備忘録です。

Ref.

タスク定義名

タスク定義名を英語ではFamilyを呼ぶ。

登場人物

  • ECR:イメージリポジトリ
  • タスク定義: コンテナの情報を記載したもの(使用イメージやCPUなど)
  • クラスター:ECS実行環境
  • タスク:タスク定義に基づいて起動されたタスク群
  • サービス:タスクの数や起動タイプを指定
  • スケジュールタスク:サービスの定期実行版

流れ

  1. タスク定義を作成
  2. クラスターを作成
  3. サービス/スケジュールタスクを作成

 

※ クラスターではサービススケジュールタスクの他に1回限りのタスクも作成できる

ECR

aws cliを使ってイメージをPush

aws cliで実行。 基本的にリポジトリを作成したときにAWSに表示されるコマンドを実行すれば良い。

Amazon_ECR

スケジュールされたタスク

パブリックIPの自動割当がENABELEDでないとECRからのpullでエラーが発生。

https://forums.aws.amazon.com/thread.jspa?threadID=339634&tstart=0

ただしDISABELEで成功する場合もあるようなので要調査。 以下が参考になるか。

ResourceInitializationError: unable to pull secrets or registry auth: pull command failed: : signal: killed

エラーはクラスター>タスク>StoppedSTOPPEDしたタスクを調べればわかる。

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/stopped-task-errors.html

Amazon_ECS

ECSとCloudWatch

ログ

ログは大きくロググループログストリームに分かれていて、ロググループが大分類を表してログストリームを包含する。

  • ロググループ
  • ログストリーム

ロググループ

タスク定義の ContainerDefinitions で指定する。
CloudFormationロググループ指定は以下のとおり。

LogConfiguration:
    LogDriver: awslogs
    Options:
        awslogs-group: "/ecs/example"
        awslogs-region: ap-northeast-1
        awslogs-stream-prefix: ecs  # これはログストリームのプレフィックス

実行中のタスクもログストリームにログが出力される。
つまりサービスは実行中の場合でもログストリームにログが出力される。

ログストリーム

ロググループの中に作成される。

  • 命名規則:{{awslogs-stream-prefix}}/コンテナ名/コンテナランタイム ID

コンテナランタイムIDタスク(ID)と同じハッシュ値。
つまりタスクが複数のコンテナを使用している場合のコンテナランタイムIDはすべて同じ。

  • ログをCloudWotchに自動出力している場合、ロググループを削除するとタスク実行時にエラーになる

ルール

  • スケジュールされたタスクを作成するとCloudWatch > ルールにルールが作成される

AWS CLIで実行

前提

以下リソースはWebマネジメントコンソールCloudFormationなどによって作成済みと仮定する。

  • コンテナイメージ
  • タスク定義
  • クラスター
    • サブネット
    • セキュリティグループ

containerOverridesなし

aws ecs run-task \
    --cluster hello-world-cluster \
    --launch-type FARGATE \
    --network-configuration awsvpcConfiguration="{subnets=subnet-0d51b747069fed1b7,securityGroups=sg-0a74d8f5b2b592cc2,assignPublicIp=ENABLED}" \
    --propagate-tags TASK_DEFINITION \
    --task-definition hello-world-task-definition

containerOverridesあり

containerOverridescommandで、コンテナイメージのCMDを上書きする。 ENTRYPOINTを上書きできるかは要調査。

aws ecs run-task \
    --cluster hello-world-cluster \
    --launch-type FARGATE \
    --network-configuration awsvpcConfiguration="{subnets=subnet-0d51b747069fed1b7,securityGroups=sg-0a74d8f5b2b592cc2,assignPublicIp=ENABLED}" \
    --propagate-tags TASK_DEFINITION \
    --task-definition hello-world-task-definition \
    --overrides '{"containerOverrides":[{"name":"HelloWorld","command":["echo", "Welcome"]}]}'

Dockerfile

ROM alpine

CMD ["echo", "Hello World!"] # これを↑の"command":["echo", "Welcome"]で上書き

注意

タスク定義でコンテナを指定するさいのCommand入力エリアはヘルスチェックのために使用されるものでイメージコンテナのCMDを上書きするわけではない。

Amazon_ECS