AWS コンテナサービス(ECR/ECS)

ECR

Elastic Container Registry
AWSから利用するDockerリポジトリ
DockerにおけるDocker-Hubに該当する

ECS

Elastic Container Service
AWSから利用できるDockerサービス
ほぼ全てのAWSサービスを利用できる

プレーン

コントロールプレーン

コンテナを管理する
VPC、セキュリティグループ、コンテナの監視、スケーリング等
ECRがこれに該当する

データプレーン

実際にコンテナが稼働する場所
コントロールプレーンの指示によって起動後、コンテナの状態をコントロールプレーンに通知する
ECSがこれに該当する
ノード(実行基盤)としてEC2かFargateを選択する

ノード

EC2

インスタンスが作成され、管理が必要となるが内部データは保持される

Fargate

インスタンスが作成されず、管理が不要となる一方で内部データは破棄される
アクセスに応じて課金されるのでEC2と比較して低料金になりやすい

タスク

タスク

=コンテナ
EC2(Fagate)上にコンテナを起動させる事を、ノードに「タスクを配置する」と表現する

タスク定義

コンテナの起動設定
docker-compose.ymlに該当
・リソース(メモリ・CPU)設定
・コンテナ定義(DockerFileに該当)を複数設定可能

タスク定義コマンド

aws ecs register-task-definition
--cli-input-json
file://aws/ecs-task-definition-for-command.json

task-definition-for-command.json

{
 ”family”: “タスク名“,
 ”taskRoleArn”: “arn:aws:iam::アカウントID:role/ECSTaskRole”,
 ”executionRoleArn”: “arn:aws:iam::アカウントID:role/ECSTaskRole”,
 ”networkMode”: “awsvpc”,
 ”containerDefinitions”: [
  {
   ”name”: “laravel”,
   ”image”: “アカウントID.dkr.ecr.ap-northeast-1.amazonaws.com/postman/laravel:latest”,
   ”essential”: true,
   ”environment”: [
    {
     ”name”: “APP_ENV”,
     ”value”: “production”
    }
   ],
   ”secrets”: [
    {
     ”name”: “APP_WORD”,
     ”valueFrom”: “arn:aws:ssm:ap-northeast-1:178418878883:parameter/APP_WORD”
    }
   ],
   ”readonlyRootFilesystem”: false,
   ”logConfiguration”: {
    ”logDriver”: “awslogs”,
    ”options”: {
     ”awslogs-group”: “postman”,
     ”awslogs-region”: “ap-northeast-1″,
     ”awslogs-datetime-format”: “%Y-%m-%d %H:%M:%S”,
     ”awslogs-stream-prefix”: “laravel”     
    }
   }
  }
 ],
 ”requiresCompatibilities”: [
  ”FARGATE”
 ],
 ”cpu”: “256”,
 ”memory”: “512”
}
タスク実行コマンド

aws ecs run-task
--cluster postman
--task-definition タスク名
--overrides ‘{
 ”containerOverrides”: [
  {
   ”name”:”laravel”,”command”: [
    phpコマンド
    ”sh”,”-c”,”php artisan migrate:refresh --seed --force”
   ]
  }
 ]
}’
--launch-type FARGATE
--network-configuration
“awsvpcConfiguration={
 subnets=[サブネットID],
 securityGroups=[セキュリティグループID],
 assignPublicIp=ENABLED
}”

ライフサイクル
ステータス 機能 保留
provisioning 準備中
pending 実行待ち
running 実行中
stopped 停止済み

コンテナ定義

Dockerコンテナと1対1

サービス

ALBとタスクを紐づけてアプリケーションを起動する機能
負荷状況に応じて自動的にタスクを追加実行、停止する
注:必ずしもサービスを用いなくてもタスク単体でアプリを起動できる

ALB

ApplicationLoadBalancer
ロードバランサー
URL、コンテナ単位でバランスを調整できる

ターゲットグループ

実サーバへの振り分け設定

クラスター

Cluster
サービス、タスク定義、ノードをまとめた仮想的な概念
実態はない