ついに会社のWordPressサーバーをECS/Fargate + EFSに移行が完了しました!
— adachin👾SRE (@adachin0817) March 4, 2021
!!!!
Amazon Elastic File Systemの読み取りスループットが3倍に向上、価格は据え置き - Publickey https://t.co/TfjARRhBYd
— adachin👾SRE (@adachin0817) February 1, 2021
というわけで今話題のECS/Fargate + EFS + WordPressの構築を経験したので、特にハマったところだけをブログしたいと思います。1から構築方法をまとめようと思いましたが、前回でFargateのブログを書いておりますので割愛と以下リンク貼っておきます。(わからなかったらTwitterでDMしてもらえばと〜)
https://blog.adachin.me/archives/tag/ecs-fargate
EFSはAWS Fargate 1.4.0必須
- ecs.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
resource "aws_ecs_cluster" "wordpress" { name = "wordpress" capacity_providers = [ "FARGATE", "FARGATE_SPOT", ] } resource "aws_ecs_task_definition" "wordpress" { family = "wordpress" requires_compatibilities = ["FARGATE"] network_mode = "awsvpc" task_role_arn = "arn:aws:iam::${var.aws_account_id}:role/ecsTaskExecutionRole" execution_role_arn = "arn:aws:iam::${var.aws_account_id}:role/ecsTaskExecutionRole" cpu = 1024 memory = 2048 container_definitions = file("files/task_definitions/wordpress.json") volume { name = "www" efs_volume_configuration { file_system_id = "fs-xxxxxxx" root_directory = "/" } } tags = { } } resource "aws_ecs_service" "wordpress" { cluster = aws_ecs_cluster.wordpress.id name = "wordpress" desired_count = var.aws_ecs_desired_count_wordpress launch_type = "FARGATE" platform_version = "1.4.0" deployment_minimum_healthy_percent = 50 deployment_maximum_percent = 200 health_check_grace_period_seconds = 0 deployment_circuit_breaker { enable = true rollback = true } deployment_controller { type = "ECS" } lifecycle { ignore_changes = [ task_definition, desired_count ] } load_balancer { container_name = "wordpress" container_port = 80 target_group_arn =aws_lb_target_group.wordpress.arn } network_configuration { subnets = [ aws_subnet.wordpress-1a.id, aws_subnet.wordpress-1c.id, ] security_groups = [ var.sg_wordpress ] } task_definition = aws_ecs_task_definition.wordpress.arn } |
ECS/FargateでEFSを利用する場合は31行目で必ず1.4.0のバージョンではないと動作しません。またタスク定義で15行目にEFSのIDを指定する必要があります。今回EFSはTerraformで作成せずに手動で指定しました。(これもTerraform化しないとアカンね) タスク定義の詳細は以下になります。
- wordpress.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
[ { "name": "wordpress", "image": "xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/wordpress:latest", "cpu": 1014, "memoryReservation": 1772, "mountPoints": [ { "containerPath": "/mnt", "sourceVolume": "www" } ], "environment": [ { "name": "DD_TRACE_PHP_BIN", "value": "/usr/local/sbin/php-fpm" } ], "essential": true, "portMappings": [ { "hostPort": 80, "protocol": "tcp", "containerPort": 80 } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/wordpress", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "ecs" } }, "volumesFrom": [] }, { "image": "datadog/agent:latest", "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/datadog-agent", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "ecs" } }, "cpu": 10, "memory": 256, "mountPoints": [], "portMappings": [ { "hostPort": 8126, "protocol": "tcp", "containerPort": 8126 } ], "environment": [ { "name": "ECS_FARGATE", "value": "true" }, { "name": "DD_PROCESS_AGENT_ENABLED", "value": "true" }, { "name": "DD_DOGSTATSD_NON_LOCAL_TRAFFIC", "value": "true" }, { "name": "DD_APM_ENABLED", "value": "true" }, { "name": "DD_APM_NON_LOCAL_TRAFFIC", "value": "true" } ], "networkMode": "awsvpc", "name": "datadog-agent" } ] |
7行目でマウント場所を指定しないとエラーが出るので気をつけましょう。EFSでECSサービスの設定はこれだけとなります。他は特に変わりませんね。
ECS Scheduled Taskで時間になってもコンテナが立ち上がらない
ECS Scheduled TaskでEFSの場合、時間になってもコンテナが起動しないのは自分の設定がミスってるからと言いたいのだが、大丈夫だよね!?🤔 明日調査しよう。
— adachin👾SRE (@adachin0817) March 1, 2021
- cloudwatch_event_target.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
resource "aws_cloudwatch_event_rule" "hoge" { name = "hoge" description = "hoge" schedule_expression = "cron(0 17 ? * * *)" is_enabled = "true" } resource "aws_cloudwatch_event_target" "hoge" { target_id = "hoge" arn = aws_ecs_cluster.wordpress.arn rule = aws_cloudwatch_event_rule.hoge.name role_arn = aws_iam_role.ljp_ecsscheduledtasks_role.arn input = file("files/container-overrides/hoge.json") ecs_target { launch_type = "FARGATE" platform_version = "1.4.0" task_count = 1 task_definition_arn = "arn:aws:ecs:ap-northeast-1:xxxxxxx:task-definition/wordpress" network_configuration { subnets = [var.subnet_1a-wordpress, var.subnet_1c-wordpress] security_groups = [var.sg_wordpress] assign_public_ip = false } } } |
もちろんバッチの実装も同様にEFSなので1.4.0ではないと時間になってもコンテナが起動しません。これはくそハマった。。ECS Scheduled TaskのTerraform化は以下を参考にしてください〜
[AWS][ECS/Fargate][Terraform]ECS Scheduled Tasksを使ってRailsバッチを動かす
EFSが急激に重くなりコンテナが落ちまくりアクセスができなくなる
スループットモードのバーストで運用してしまうとクレジットが枯渇したときに一気にアクセスができなくなります。これによりファイルアクセスのスループットがベースラインレートに制限されたことにより、パフォーマンス低下に繋がります。そうならないようにプロビジョンドスループットモードに切り替えるのが相応しいでしょう。ちなみに、1 MiB/s でスループットをプロビジョニングすると、バーストクレジットを使用することで 1 TiB 未満のファイルシステムでは 100 MiB/s までバーストできる一方、最小スループットはファイルシステムの使用量によらず 1 MiB/s となります。なので100MBくらいが良さそうなので、ここらへんは様子見てチューニングしたほうが良さそうですね。
デプロイ方法
下記ブログ書きましたので参考に。
まとめ
EFSは最近読み取りスループットが3倍に向上したので、この機会にWordPressもECS/Fargateで運用するチャンスが来たのではないのかと感じました。今後もっと早くなるだろうし!レスポンスどうなのって疑問に思う方もいますが、そこまで遅くないので会社のブログで詳しく書きたいと思います。しかし、コンテナ便利だ…
0件のコメント