長いものにMackerelことになりました。ryosmsです。

はい、というわけでねー、今回はAWS Elastic Beanstalk(EB)のMulti-container Docker環境でMackerel動かしてメトリクスを取っていきたいと思います。


やることはMackerel公式ヘルプのDockerページに書いてある内容を、EB用のDockerrun.aws.jsonに置き換えていくだけなんですけど、EB環境でデプロイするタイミングでmackerel-agent.confを展開したりするのがめんどくさいのでなるべくならDockerのオプションと環境変数だけでなんとかしたいのでなんとかします。 

Dockerrun.aws.jsonについてはAWSのヘルプページを参考にしてもらうとして、Mackerelのヘルプページに書いてある内容を素直に書き写してmackerel-agentのdockerコンテナを動かすには、以下のようなDockerrun.aws.jsonを作ります。
EB環境はAuto Scalingするため、スケールアウトした場合にMackerelのRoleを自動で付与したい、かつ、スケールインした場合に該当のインスタンスを退役させたいので、auto_retirementをtrueにして、環境変数としてoptsでRole名を指定しています。 
{
"AWSEBDockerrunVersion": 2,
"volumes": [
{
"name": "docker-sock",
"host": {
"sourcePath": "/var/run/docker.sock"
}
}
],
"containerDefinitions": [
{
"name": "your-app",
"image": "your-name/your-app",
"essential": true,
"portMappings": [
{
"hostPort": 80,
"containerPort": 80
}
]
},
{
"name": "mackerel-agent",
"image": "mackerel/mackerel-agent",
"mountPoints": [
{
"sourceVolume": "docker-sock",
"containerPath": "/var/run/docker.sock",
"readOnly": true
}
],
"links": [
"your-app"
],
"environment": [
{
"name": "apikey",
"value": "<your-api-key>"
},
{
"name": "enable_docker_plugin",
"value": true
},
{
"name": "auto_retirement",
"value": true
},
{
"name": "opts",
"value": "-role=YourService:app"
}
]
}
]
}
Mackerelを試すためには上記で十分ですが、実際のギョーミーな話になった時、このDockerrun.aws.jsonもリポジトリに入れて管理する必要がありますし、そうなるとAPIキーなんてクレデンシャルな内容を入れてGitHubにPushするわけにはいきません。
あと、できればProduction環境とStaging環境で同じDockerrun.aws.jsonを使用したいけど、Roleは別のものにしたいみたいな要件もでてくるかもしれません(ProductionとStagingでAPIキーを変えたい場合もあるかもしれない)。

このような要件はEBの機能を使って解決します。
EBで環境変数を設定すると、EC2のインスタンス上で動いているすべてのDockerのコンテナに環境変数を設定してくれます。
なので、Dockerrun.aws.jsonから可変にしたい環境変数の内容をざっくり削ってEB側で環境変数をセットしていきます。
EB側で環境変数をセットするには
こうして
eb-settings

こうじゃ!
eb-env


というわけで、最終的なDockerrun.aws.jsonはこう。


これでEB環境にアプリの最新バージョンをデプロイしたり、Auto Scalingでスケールアウト/インした場合に自動的にMackerelに反映されるようになりました。
できればmackerel-agentのDockerコンテナにRoleを設定する場合、opts環境変数じゃなくて独自の環境変数で渡せるようになると嬉しいところです。

mackerel-custom-metrics


ところで、Docker Pluginでdockerコンテナが使用しているCPU使用率のメトリクスを表示した時の単位ってどうなってるんでしょうね?
mackerel-docker-cpu


参考: