💨
terraform使ってECS Fargateでlocustを動かしてみた
負荷テストツールのLocustをECS Fargateで構築し動かしてみました。
インフラ環境の構築にはterraformを使いました。
コードはこちらに
参考記事
こちらの記事を参考にさせていただきました。
動かすまで
環境構築
cd terraform/envs/dev
terraform init
terraform plan
terraform apply
コンテナImageをECRにpush
docker build -t locust-sample-dev-ecr-repo:latest .
aws ecr get-login-password | docker login --username AWS --password-stdin https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com
docker tag locust-sample-dev-ecr-repo:latest <aws_account_id>.dkr.ecr.<region>.amazonaws.com/locust-sample-dev-ecr-repo:latest
docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/locust-sample-dev-ecr-repo:latest
使う
terraform output
alb_endpoint = "endpoint: http://locust-sample-alb-lb-hogehoge.ap-northeast-1.elb.amazonaws.com"
↑にアクセスして使う
コードの全体像
.
├── Dockerfile
├── README.md
├── docker-compose.yml
├── scripts
│ └── sample.py
└── terraform
├── envs
│ └── dev
│ ├── main.tf
│ └── output.tf
└── modules
├── ecr
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
└── ecs
├── alb.tf
├── ecs.tf
├── iam.tf
├── log.tf
├── output.tf
├── variables.tf
└── vpc.tf
scripts/
sample.pyにtestの内容を書いています
from locust import HttpUser, task
class HelloWorldUser(HttpUser):
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
Dockerfile
locustのDockerImageがあるみたいです。
FROM locustio/locust
COPY ./scripts/ /scripts/
EXPOSE 8089
EXPOSE 5557
EXPOSE 5558
ハマったポイント
リソース構築後、アクセスしても503のままだった。。
cloud watch logを見たところ以下のエラーが...
standard_init_linux.go:228: exec user process caused: exec format error
M1 Macを使っているので、--platform=linux/x86_64
を指定しないとだめらしい。
M1 MacでbuildしたImageがECS Fargateで動かないため。
FROM --platform=linux/x86_64 locustio/locust
を指定
terraform
インフラをterraformを使って構築します。
ecr
Dockerのcontainer imageをpushしておくECRのRepositoryを作成しています。
ecs
(ディレクトリ構成は微妙な気もしますが...)
alb
ロードバランサー関係
ecs
ここでECSのクラスタやらタスク定義など設定
- locustはmaster/slave構成でスケールできる
- ECS Service Discovery使ってコンテナ間通信できるように(master <--> slave) https://dev.classmethod.jp/articles/ecs-service-discovery/
iam
aws_ecs_task_definition
で指定するtask_role_arn
とexecution_role_arn
を作成しています。
- タスクロール: コンテナの中のアプリケーションからAWSサービスを使うときに必要
- タスク実行ロール: ECSコンテナエージェントがタスクを実行するときに必要
log
log groupの作成
vpc
vpc, subnet, igw, aws_service_discovery_private_dns_namespace, aws_service_discovery_service
- aws_service_discovery_service: masterのhostname
Discussion