はじめに
AWS ECS(Elastic Container Service)は、Dockerコンテナをスケーラブルにデプロイ・管理できるサービスです。
個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。
本記事では、実際のタスク定義(Task Definition)をもとに、DjangoアプリケーションとNginxのリバースプロキシ構成がどのように構成されているのかを紐解きます。
タスク定義の全体構成
"taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:xxx:task-definition/reverse-proxy-task:11",
"family": "reverse-proxy-task",
"revision": 11,
"status": "ACTIVE",
"requiresCompatibilities": ["FARGATE"],
"networkMode": "awsvpc",
"cpu": "1024",
"memory": "2048",
- taskDefinitionArn: タスク定義の一意な識別子。
- family: タスク定義グループ名。
- revision: リビジョン番号。バージョン管理に相当。
-
requiresCompatibilities: 実行環境(ここでは
FARGATE
)。 -
networkMode:
awsvpc
で独立したENIが割り当てられる。 - cpu/memory: タスク全体に割り当てるリソース量。
コンテナ定義①:Django アプリ
"name": "django",
"image": "xxx.dkr.ecr.ap-northeast-1.amazonaws.com/reverse-proxy-django-app",
"cpu": 512,
"memory": 1024,
"portMappings": [{"containerPort": 8000, "hostPort": 8000}],
"environment": [
{"name": "DJANGO_SETTINGS_MODULE", "value": "mysite.settings"},
{"name": "STATIC_ROOT", "value": "/app/staticfiles"},
{"name": "DJANGO_SECRET_KEY", "value": "your-secret-key"}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/aws/ecs/reverse-proxy-cluster",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "ecs"
}
}
- image: ECR上のDjangoアプリケーションイメージ。
- portMappings: コンテナ内ポート8000をホストの8000にバインド。
- environment: Djangoの設定に必要な環境変数。
- logConfiguration: CloudWatch Logs へのログ送信設定。
コンテナ定義②:Nginx
"name": "nginx",
"image": "xxx.dkr.ecr.ap-northeast-1.amazonaws.com/reverse-proxy-django-nginx",
"cpu": 512,
"memory": 1024,
"portMappings": [{"containerPort": 80, "hostPort": 80}],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/aws/ecs/reverse-proxy-cluster",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "ecs"
}
}
- image: ECR上のNginxイメージ。Djangoへのリバースプロキシ。
- portMappings: HTTPリクエスト用に80番ポートをバインド。
- logConfiguration: Djangoと同様、CloudWatchにログ出力。
タスク実行に必要なIAMロール
"executionRoleArn": "arn:aws:iam::xxx:role/ecsTaskExecutionRole"
このIAMロールには以下のポリシーが含まれている必要があります:
- AmazonECSTaskExecutionRolePolicy
- ECRからのイメージ取得、CloudWatchへのログ出力
その他の設定
"requiresAttributes": [
"com.amazonaws.ecs.capability.logging-driver.awslogs",
"ecs.capability.execution-role-awslogs",
"com.amazonaws.ecs.capability.ecr-auth",
"ecs.capability.task-eni"
]
- ECSがタスクを正常に実行するために必要な機能。
まとめ
このタスク定義は、AWS ECS Fargate上にDjangoアプリとNginxのリバースプロキシ構成をデプロイするための標準的な例です。Fargateを使うことでインフラの管理が不要となり、ログ収集やネットワークも簡単に構成可能です。
このような構成は、マイクロサービス化やDevOpsを進める上で非常に有効です。