この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
About
お久しぶりです。tjinjinです。ちょいネタです。
背景
弊プロダクトのAWSアカウント数がどんどん増えて来ており、マネジメントコンソールでswitch roleしながら管理するのは辛くなって来ました。本番はdatadog入れてはいるものの、その他のアカウントもそれなりの数があるのでcloudwatchの情報をローカルで見るべく個人的にGrafanaを使っています。
docker-composeでGrafanaを立てる
まずGrafanaを立てます。
version: '3'
volumes:
grafana_data: {}
services:
grafana:
image: grafana/grafana
ports:
- "3000:3000"
volumes:
- ./grafana_data:/var/lib/grafana
- ~/.aws/credentials:/usr/share/grafana/.aws/credentials:ro
environment:
- GF_SECURITY_ADMIN_PASSWORD=foobar
- GF_USERS_ALLOW_SIGN_UP=false
ホストマシン上の~/.aws/credentials
をマウントしているので、そのまま利用できて便利です。localhost:3000にアクセスするとログイン画面が出ます。
datasourceを一括で登録するスクリプト
GrafanaはAPIがあるのでスクリプト経由で設定しています。
# user画面からkeyを発行する
require 'net/http'
require 'json'
def create_datasouce(name, region, arn)
url = URI.parse('http://localhost:3000/api/datasources')
req = Net::HTTP::Post.new(url.request_uri)
# 発行したtokenをheaderに入れます
req['Authorization'] = 'Bearer xxx'
req['Accept'] = 'application/json'
req['Content-type'] = 'application/json'
req.body = {
"name": "#{name} CW",
"type": "cloudwatch",
"url": "",
"access": "proxy",
"jsonData": {
"timeField": "@timestamp",
"authType": "arn",
"defaultRegion": "#{region}",
"assumeRoleArn": "#{arn}"
},
"secureJsonFields": {},
"database": ""
}.to_json
res = Net::HTTP.start(url.host, url.port) do |http|
http.request(req)
end
puts name
puts res.code
puts res.body
end
accounts = [
{ name: "test", value: { arn: "arn:aws:iam::012345678901:role/hogehoge", region: "ap-northeast-1" } },
]
accounts.each do |line|
create_datasouce(line[:name], line[:value][:region], line[:value][:arn])
end
あとはaccountsのところに追記していって実行すれば完成です。
$ ruby create_datasource.rb
これでdatasourceは登録できました。あとは適当にちょちょいとdashboardをimportすれば完成です。dashboardはいろいろあるのでこの辺から探すとよさそうです。 https://grafana.com/dashboard