#
ドキュメント

Document

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

Amazon Elastic Container Service (Amazon ECS)

完全マネージド型のコンテナオーケストレーションサービス(Container Orchestration Service)。 オーケストレーションツールにはECSのほかに以下がある。

  • docker-compose
  • Kubernetes

目次

  • タスク定義名
  • 登場人物
  • 流れ
    • スケジュールされたタスク
  • ECSとCloudWatch
    • ログ
  • ALBとターゲットグループ
    • ルール(AWS::Events::Rule
  • AWS CLIで実行
  • Fargate
  • ブルー/グリーンデプロイ・ローリングデプロイ
  • ECS Exec
  • TIPS
  • Ref

タスク定義名

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

登場人物

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

流れ

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

 

注意事項。

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

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

スケジュールされたタスクを作成するとCloudWatchEventBridge) > ルールにルールが作成される。
つまりスケジュールされたタスクパターンスケジュールターゲットECSタスクを指定したルールと等価。

Webマネジメントコンソールからルールを作成場合は、ルール名が必須。
CloudFormationのAWS::Events::RuleProperties.Nameがオプション。

  • CloudFormationのAWS::Events::RuleProperties.Name(ルール名)はオプション(省略した場合にどのようなルール名になるかを要確認)
  • ルール名が重複した場合は上書きされる
  • Targetのidが重複した場合は上書きされる

Target.id

The ID of the target. We recommend using a memorable and unique string.

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-id

パブリックIPの自動割当をENABELEDにしないとECRからのpullするときにエラーが発生する。

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

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

エラーはクラスター>タスク>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に自動出力している場合、ロググループを削除するとタスク実行時にエラーになる

ALBとターゲットグループ

ALBを使用してAWS::ECS::Serviceを稼働している場合は、ALBのターゲットグループにサービスを追加する。 (ALBのリスナー > ルールで↑のターゲットグループを指定する)

FooSebService:
  Type: AWS::ECS::Service
  Properties:
    #...
    LoadBalancers:
      - TargetGroupArn: {{targetGroupArn}}

ルール(AWS::Events::Rule)

  • スケジュールされたタスクを作成するとCloudWatch > ルールにルール(AWS::Events::Rule)が作成される

ルールを追加するとCloudWoatch Events/EventBridgeによってScheduleExpressionで指定した時刻にクラスターidで指定したルールが実行される。

FooSchedule:
    Type: AWS::Events::Rule
    Properties:
      Description: "For Schedule Task"
      ScheduleExpression: "cron(*/15 * * * * *)" # 15分ごと
      #...
      Targets:
        - Arn:{{クラスターARN}}
          Id: "orthrus_payment_overdue-credit-card"

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"]で上書き

注意

内容が間違っているか可能性が高い。CMDを上書きする。

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

Amazon_ECS

Fargate

AWS ECSのサーバレスな実行環境。

AWS ECSの実行環境としてEC2とFargateが考えられる。
EC2の場合はコンテナを実行するためのOSレベルの面倒を見る必要がある。

Fargateはコンテナが稼動している間のみ課金される(サーバレス)。

ECSでFargate起動タイプを使用する場合は、awsvpcモード を利用することとなる。

  • タスク毎にENIが自動的に割り当てられる。

    https://qiita.com/leomaro7/items/a3edb49d9929dd42cc0d

ref.

  • https://business.ntt-east.co.jp/content/cloudsolution/column-171.html#section-01
  • https://qiita.com/leomaro7/items/a3edb49d9929dd42cc0d

ブルー/グリーンデプロイ・ローリングデプロイ

ref. https://garafu.blogspot.com/2018/11/release-strategy.html#blue-green

ECS Exec

https://dev.classmethod.jp/articles/ecs-exec/

準備 AWS CLI 用の Session Manager をインストール

  • https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-macos
  • https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-verify

流れ

  1. サービスをenableExecuteCommand=trueにする
  2. タスクロールにSessionManagerが使用できるポリシーを付与

サービスをenableExecuteCommand=trueにする

WebマネジメントコンソールでenableExecuteCommandを設定する方法はない。 AWS CLIでサービス作成時に有効にするか更新する。

現状の確認

aws ecs describe-services \
    --cluster {{cluster name}} \
    --services {{service name}}
"enableExecuteCommand": true

falseの場合は更新する。

aws ecs update-service \
    --cluster {{cluster name}} \
    --services {{service name}}    
    --enable-execute-command

無効にする場合は --disable-execute-command

起動しているタスクを停止(再起動される)。

タスクロールにSessionManagerが使用できるポリシーを付与

以下のポリシーをタスクロールに付与。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssmmessages:CreateControlChannel",
        "ssmmessages:CreateDataChannel",
        "ssmmessages:OpenControlChannel",
        "ssmmessages:OpenDataChannel"
      ],
      "Resource": "*"
    }
  ]
}

タスクロール。

Amazon_ECS

コマンドを実行

$ aws ecs execute-command \
    --cluster {{cluster name}} \
    --task XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
    --container {{container name}} \
    --interactive \
    --command "echo hello"


he Session Manager plugin was installed successfully. Use the AWS CLI to start a session.


Starting session with SessionId: ecs-execute-command-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
hello


Exiting session with sessionId: ecs-execute-command-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.

TIPS

AWS::ECS::TaskDefinition ContainerDefinitionEnvironmentSecretsの違い。

  • Environment 通常の環境変数

    The environment variables to pass to a container. This parameter maps to Env in the Create a container section of the Docker Remote API and the --env option to docker run.

    https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinitions.html#cfn-ecs-taskdefinition-containerdefinition-environment

  • Secrets 環境変数と渡されることはおなじだがSecrets ManagerやSSMパラメータの値を渡せる

    The secrets to pass to the container. For more information, see Specifying Sensitive Data in the Amazon Elastic Container Service Developer Guide.

    https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinitions.html#cfn-ecs-taskdefinition-containerdefinition-secrets

Ref.

  • https://www.youtube.com/watch?v=dwPOIr5fsWk&t=1412s
    • 分かりやすい
    • 8分〜:概要 タスク定義・クラスターの関係が分かりやすい
    • 12分〜:fargateのデメリット(ボリュームに20GB制限、コストがEC2に比べて1.4倍など)
  • Amazon ECS のチュートリアル