💨

terraform使ってECS Fargateでlocustを動かしてみた

2022/08/21に公開

負荷テストツールのLocustをECS Fargateで構築し動かしてみました。
インフラ環境の構築にはterraformを使いました。

コードはこちらに

https://github.com/dl10yr/aws-practice/tree/main/ecs-locust

参考記事

こちらの記事を参考にさせていただきました。
https://qiita.com/neilli-sable/items/b17dfba5eabfcafccaf8

動かすまで

環境構築

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があるみたいです。
https://docs.locust.io/en/1.5.2/running-locust-docker.html

FROM --platform=linux/x86_64 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のクラスタやらタスク定義など設定

iam

aws_ecs_task_definitionで指定するtask_role_arnexecution_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