Grafanaのdatasourceをスクリプトで一括登録する

2017.12.14

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