このプロジェクトはAWS EKS上で動作する CQRS + Event Sourcing システムです
- インフラ環境
- 本番環境はAWS EKS
- ローカル環境はDocker for MacのKubernetes
- 書き込み用DBはDynamoDB
- 読み込み用DBはAurora(MySQL)
- アプリケーション
- DDD(ドメイン駆動設計)がベース
- CQRS + Event Sourcingを採用
- ツールキットにはakkaを採用
- akka-actor
- akka-persistence
- akka-cluster
- akka-cluster-sharding
- akka-cluster-tools
- 負荷試験
- アプリケーションに対して、Gatlingコンテナ(複数可)を使って負荷試験を実行できます
- 実行したGatlingを集約して、S3静的サイトとしてレポート出力できます
- Account
- 本システムの利用者を識別するアカウント情報
- Thread
- Messageを交換するための場を示す
- Message
- 何らかの言語で表現された伝言
- Administrator
- 当該Threadの管理者
- Member
- 当該Threadの利用者
- 必須
$ brew update
$ brew install kubernetes-cli kubernetes-helm gettext
$ brew cask install docker minikube virtualbox
# terminal 1
$ sbt
> local-dynamodb/run
# terminal 2
$ sbt
> local-mysql/run
# terminal 3
$ THREAD_WEAVER_API_SERVER_HTTP_PORT=18080 THREAD_WEAVER_MANAGEMENT_PORT=8558 sbt api-server/run
# terminal 4
$ THREAD_WEAVER_API_SERVER_HTTP_PORT=18081 THREAD_WEAVER_MANAGEMENT_PORT=8559 sbt api-server/run
# terminal 5
$ THREAD_WEAVER_API_SERVER_HTTP_PORT=18082 THREAD_WEAVER_MANAGEMENT_PORT=8560 sbt api-server/run
# terminal 6
$ curl -X POST "http://127.0.0.1:18080/v1/threads/create" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"accountId\":\"01DB5QXD4NP0XQTV92K42B3XBF\",\"title\":\"string\",\"remarks\":\"string\",\"administratorIds\":[\"01DB5QXD4NP0XQTV92K42B3XBF\"],\"memberIds\":[\"01DB5QXD4NP0XQTV92K42B3XBF\"],\"createAt\":10000}"
{"threadId":"01DB6VK6E7PTQQFYJ6NMMEMTEB","error_messages":[]}%
$ curl -X GET "http://127.0.0.1:18080/v1/threads/01DB6VK6E7PTQQFYJ6NMMEMTEB?account_id=01DB5QXD4NP0XQTV92K42B3XBF" -H "accept: application/json"
{"result":{"id":"01DB6VK6E7PTQQFYJ6NMMEMTEB","creatorId":"01DB5QXD4NP0XQTV92K42B3XBF","parentThreadId":null,"title":"string","remarks":"string","createdAt":10000,"updatedAt":10000},"error_messages":[]}%
$ sbt gatling-test/gatling-it:testOnly com.github.j5ik2o.gatling.ThreadSimulation
Docker for MacのKubernetes機能を有効にして、コンテキストを切り替えてください。
$ cd tools/deploy
tools/deploy $ ./k8s-setup.sh
tools/deploy $ ./k8s-d4m/deploy-local-db.sh -e local
tools/deploy $ ./k8s-d4m/migrate-local-db.sh
tools/deploy $ kubectl apply -f ./k8s-d4m/secrets.yaml
tools/deploy $ ./k8s-d4m/build-image.sh
tools/deploy $ ./deploy-app.sh -e local
以下のコマンドで動作確認できます。
tools/deploy $ ./k8s-d4m/test-application.sh
tools/deploy $ ./k8s-d4m/test-management.sh
AWS CONSOLEなどからIAM Userを作成しアクセスキーを発行してください。 アクセス権は面倒なのでAdministratorにしています。
プロファイル名はthread-weaver
にしてください。
$ vi ~/.aws/credentials
[thread-weaver]
aws_access_key_id = XXXXX
aws_secret_access_key = XXXXX
region = ap-northeast-1
以下で本番環境を構築する。
tfstate
ファイルはS3で管理します。eks-terraform-env.sh
のTF_BUCKET_NAME
のバケットを事前に作成してください。
$ cd tools/terraform
tools/terraform $ cp eks-terraform-env.sh.default eks-terraform-env.sh
tools/terraform $ vi eks-terraform-env.sh # 編集する。TF_BUCKET_NAMEはユニークなものが必要です。
tools/terraform $ cp eks.tfvars.default eks.tfvars
tools/terraform $ vi eks.tfvars # 編集する
tools/terraform $ ./eks-terraform-init.sh
tools/terraform $ ./eks-terraform-plan.sh
tools/terraform $ ./eks-terraform-apply.sh
生成されるとconfig/
にkubeconfig
が生成されます。KUBECONFIGを設定してください。
KUBECONFIG
にパスを指定して、pod一覧が取得できるか確認してみてください。
$ export KUBECONFIG=$(pwd)/config/kubeconfig_j5ik2o-eks-XXXXX
$ kubectl get pod --all-namespaces ✔ 5944 19:45:55
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system aws-node-kffbb 1/1 Running 0 4h25m
kube-system aws-node-ngtpz 1/1 Running 0 4h25m
kube-system aws-node-phhs7 1/1 Running 0 4h25m
kube-system coredns-57df9447f5-8p9rl 1/1 Running 0 4h28m
kube-system coredns-57df9447f5-vhw7x 1/1 Running 0 4h28m
kube-system kube-proxy-bcnb6 1/1 Running 0 4h25m
kube-system kube-proxy-nzh9h 1/1 Running 0 4h25m
kube-system kube-proxy-rq4tn 1/1 Running 0 4h25m
tools/deploy $ ./k8s-setup.sh
ネームスペース,サービスアカウント,RBAC設定,Helm(Tiller)のインストールなどが作られます。
datadog-agentをdaemonsetとしてデプロイします。メトリクスはthread-weaver-api-server
プレフィクスで取得できます。
tools/deploy/eks $ cp dd-agent-values.yaml.default dd-agent-values.yaml # datadog.apiKeyを設定してください
tools/deploy/eks $ ./eks/deploy-dd-agent.sh
$ cd tools/flyway
tools/flyway $ make release # docker build & push
tools/flyway $ cd ../deploy
tools/deploy $ AWS_PROFILE=thread-weaver \
FLYWAY_HOST=terraformで生成されたAuroraのホスト名 FLYWAY_PORT=3306 \
FLYWAY_DB=thread_waver FLYWAY_USER=root FLYWAY_PASSWORD=xxxx \
./deploy-flyway.sh -e prod
$ cd tools/deploy/eks
tools/deploy/eks $ cp secret.yaml.default secret.yaml
tools/deploy/eks $ echo -n 'xxxx' | base64 # terraform構築時出力されたパスワードをエンコードする
tools/deploy/eks $ vi secret.yaml # エンコードしたパスワードを設定する
tools/deploy/eks $ kubectl apply -f secret.yaml
$ AWS_DEFAULT_PROFILE=thread-weaver sbt api-server/ecr:push # docker build & push
$ cd tools/deploy
tools/deploy $ AWS_PROFILE=thread-weaver ./deploy-app.sh -e prod
$ cd tools/deploy
tools/deploy $ ./eks/test-application.sh
tools/deploy $ ./eks/test-management.sh
ECS(Fargate)上にGatlingコンテナを起動してS3にレポートを出力します。
- gatling-runner
- Gatlingシナリオを実行するコンテナ(複数起動される場合があります)。実行後にS3にログを出力します
- gatling-s3-reporter
- gatling-runnerが出力したログからレポートを出力します
- gatling-aggregate-runner
- 上記のコンテナを使った一連のタスクを実行するコンテナ。具体的には複数のgatling-runnerの実行→レポート出力までのワークフローを制御します。
# Gatling RunnerイメージのBuild & Push
$ AWS_DEFAULT_PROFILE=thread-weaver sbt gatling-runner/ecr:push # docker build & push
# Gatling Aggregate RunnerイメージのBuild & Push
$ AWS_DEFAULT_PROFILE=thread-weaver sbt gatling-aggregate-runner/ecr:push # docker build & push
# Gatling ReporterイメージのBuild & Push
$ cd tools/gatling-s3-reporter
tools/gatling-s3-reporter $ make release # docker build & push
# Gatling Aggregate Runnerの設定調整
$ vi project/Settings.scala # gatlingAggregateRunTaskSettings の設定を調整
# Gatling Aggregate Runnerの実行
$ cd ../../
$ AWS_PROFILE=thread-weaver \
TW_GATLING_NOTICE_SLACK_INCOMING_WEBHOOK_URL=https://hooks.slack.com/services/xxxxx \
TW_GATLING_TARGET_HOST=$(kubectl get svc thread-weaver-api-server -n thread-weaver -ojsonpath="{.status.loadBalancer.ingress[0].hostname}") \
sbt gatling-aggregate-runner/gatling::runTask
# 最後にreport urlがログに出力されます