Amazon ECS: curl コンテナを使ってタスク定義だけでモックサーバを設定する
3 行まとめ
- API のモック化ツール WireMock には、動的にスタブ/モックを定義できる Admin API がある
- ECS タスク定義に「 Admin API を叩く curl コンテナ」を加えて WireMock のスタブ/モック定義を行う
- タスク定義だけ完結するので楽
タスク定義だけでモックサーバを設定する
テスト用のモックサーバの 1 つに WireMock がありますが、この WireMock には動的にスタブ/モックを定義できる Admin API があります (Stubbing - WireMock) 。
この Admin API を利用します。 Amazon ECS のタスク定義に「 WireMock コンテナ」に加えて「 Admin API を叩く curl コンテナ」を用意することで、 WireMock の設定が可能になります。
タスク定義例
ポイントは 2 点です。
{ "containerDefinitions": [ { "portMappings": [ { "hostPort": 8080, "protocol": "tcp", "containerPort": 8080 } ], "cpu": 0, "image": "rodolpheche/wiremock:latest", "healthCheck": { "retries": 3, "command": [ "CMD-SHELL", "curl -f http://localhost:8080/__admin/mappings || exit 1" ], "timeout": 5, "interval": 10, "startPeriod": 30 }, "essential": true, "name": "wiremock" }, { "command": [ "curl", "-X", "POST", "--data", "{ \"request\": { \"url\": \"/test\", \"method\": \"GET\" }, \"response\": { \"status\": 200, \"body\": \"Hello world!\" }}", "http://localhost:8080/__admin/mappings" ], "cpu": 0, "image": "curlimages/curl:latest", "dependsOn": [ { "containerName": "wiremock", "condition": "HEALTHY" } ], "essential": false, "name": "curl" } ], "memory": "512", "family": "fargate-wiremock-with-curl", "requiresCompatibilities": [ "FARGATE" ], "networkMode": "awsvpc", "cpu": "256" }
実行例
タスクを起動してしばらくすると、 curl コンテナは Admin API を叩いた後に終了します。
GET /__admin/mappings
で期待通り定義されていることが確認できます。また、 GET /test
でも定義通りに WireMock がレスポンスを返却していることがわかります。
$ curl http://example.com:8080/__admin/mappings { "mappings" : [ { "id" : "f8819ad0-32ca-408a-b248-d77a05767409", "request" : { "url" : "/test", "method" : "GET" }, "response" : { "status" : 200, "body" : "Hello world!" }, "uuid" : "f8819ad0-32ca-408a-b248-d77a05767409" } ], "meta" : { "total" : 1 } }
$ curl -v http://example.com:8080/test (省略) < HTTP/1.1 200 OK < Matched-Stub-Id: f8819ad0-32ca-408a-b248-d77a05767409 < Vary: Accept-Encoding, User-Agent < Transfer-Encoding: chunked < Hello world!
お手軽で再現性もある
実際に活用しましたが、ちょっとしたモックサーバを準備したいときにピッタリでした。
- 設定ファイルを S3 からダウンロードしてマウントする、設定ファイルを含む自前の Docker イメージを作る、といった作業は不要
- 手で Admin API を叩く場合と比較して、モック定義に再現性がある
- タスク定義に閉じるため、管理するもの・考えるものが少なくて済む