完全マネージド型のコンテナオーケストレーションサービス(Container Orchestration Service)。
オーケストレーションツールにはECSのほかに以下がある。
注意事項。
ECS
ではサービス
やスケジュールタスク
の他に1回限りのタスク
も作成できるタスク
(サービス
/スケジュール
)を実行するVPC
にはインターネットゲートウェイ
を設定する必要があるタスク定義名を英語ではFamily
を呼ぶ。
DockerfileのCMDコマンドを上書きする。
コマンドをカンマ,
で区切る必要がある。
php,Receiver.php
のように上書きすると["php","Receiver.php"]
として上書きされるphp Receiver.php
のように上書きすると["php Receiver.php"]
として上書きされてエラーになるECSサービスAWS::ECS::Service
、スケジュールタスクAWS::Events::Rule
ともにAssignPublicIp: ENABLED
でないとエラーが発生する。
具体的には、イメージを取得できずにコンテナを起動できない。
停止理由 ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secrets from ssm: service call has been retried 5 time(s): RequestCanceled: request context canceled caused by: context deadli...
unable to retrieve secrets from ssm
という記載もあるがコンテナイメージをECR(registry auth
)から取得できずに起動できないのが理由。
スケジュールされたタスク
を作成するとCloudWatch
(EventBridge
) > ルール
にルールが作成される。
つまりスケジュールされたタスク
はパターン
にスケジュール
、ターゲット
にECSタスク
を指定したルールと等価。
Webマネジメントコンソールからルールを作成する場合は、ルール名が必須。
CloudFormationのAWS::Events::Rule
はProperties.Name
がオプション。
AWS::Events::Rule
のProperties.Name
(ルール名)はオプション(省略した場合にどのようなルール名になるかを要確認)id
が重複した場合は上書きされるTarget.id
。
The ID of the target. We recommend using a memorable and unique string.
パブリック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
エラーはクラスター
>タスク
>Stopped
でSTOPPED
したタスクを調べればわかる。
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/stopped-task-errors.html
ALBを使用してAWS::ECS::Service
を稼働している場合は、ALBのターゲットグループ
にサービスを追加する。
(ALBのリスナー
> ルール
で↑のターゲットグループを指定する)
FooSebService:
Type: AWS::ECS::Service
Properties:
#...
LoadBalancers:
- TargetGroupArn: {{targetGroupArn}}
スケジュールされたタスク
を作成すると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: "foo-schedule"
以下のリソースをWebマネジメントコンソール
やCloudFormation
によって作成済みと仮定する。
aws ecs run-task \
--cluster hello-world-cluster \
--launch-type FARGATE \
--network-configuration awsvpcConfiguration="{subnets=subnet-xxxxxxxxxx,securityGroups=sg-xxxxxxxxxx,assignPublicIp=ENABLED}" \
--propagate-tags TASK_DEFINITION \
--task-definition hello-world-task-definition
containerOverrides
のcommand
で、コンテナイメージのCMD
を上書きする。
ENTRYPOINT
を上書きできるかは要調査。
aws ecs run-task \
--cluster hello-world-cluster \
--launch-type FARGATE \
--network-configuration awsvpcConfiguration="{subnets=subnet-xxxxxxxxxx,securityGroups=sg-xxxxxxxxxx,assignPublicIp=ENABLED}" \
--propagate-tags TASK_DEFINITION \
--task-definition hello-world-task-definition \
--overrides '{"containerOverrides":[{"name":"HelloWorld","command":["echo", "Hello AWS ECS"]}]}'
Dockerfile
ROM alpine
CMD ["echo", "Hello World!"] # これを↑の"command":["echo", "AWS ECS"]で上書き
AWS ECSのサーバレスな実行環境(データプレーン)。
AWS ECSの実行環境としてEC2とFargateがある。
EC2の場合はコンテナを実行するためのOSレベルの面倒を見る必要がある。
Fargateはマネージドサービスなので面倒を見る必要がない
Fargateはコンテナが稼動している間のみ課金される(サーバレス)。
ECSでFargate起動タイプを使用する場合は、awsvpcモード を利用することとなる。
- タスク毎にENIが自動的に割り当てられる。
ref.
ref. https://garafu.blogspot.com/2018/11/release-strategy.html#blue-green
Secrets
に渡すSSMパラメータはコンテナ内では環境変数として受け取られる(これが基本)Environment
との違いは、 Secrets
はSSMパラメータなどのセキュアなサービスに格納した値を渡せること。AWS::ECS::TaskDefinition ContainerDefinition
のEnvironment
とSecrets
の違い。
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.
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.