kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Redash には2種類の API Key が存在する

社内で Redash の話をしていて「API key はクエリ単位に存在する」という仕様があまり知られていなかったので,まとめておこうと思う.

API Key の種類

Redash には2種類の API Key が存在する.恐らく Query API Key の存在を知らない人が多いのではないかなと思う.

  • User API Key
  • Query API Key

ドキュメントにも書いてある通り,できる限り Query API Key を使うべきと書いてある.

help.redash.io

PostgreSQL で確認してみる

Redash ハンズオンで構築した PostgreSQL コンテナを使って,実際にクエリを投げてみる.

github.com

以下のように queries テーブルのデータを確認すると,クエリごとに api_key が存在していることがわかる.

/ # psql -U postgres -d postgres

postgres=# SELECT id, name, user_id, api_key FROM queries ORDER BY id;
 id |    name    | user_id |                 api_key
----+------------+---------+------------------------------------------
  1 | 国の一覧   |       1 | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  2 | 国の件数   |       1 | yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
  3 | 都市の件数 |       1 | zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
(3 rows)

postgres-# \q

Query API Key を使う

じゃあ Query API Key をどこで使うの?と言うと,API 経由でクエリ結果を取得するときに使う.クエリ編集で右側のメニューから「Show API Key」を押すと,API 経由でクエリ結果を CSV と JSON で取得するための URL が出力される.

f:id:kakku22:20180126175436p:plain

(Show API Key メニュー)

f:id:kakku22:20180126175532p:plain

(クエリ結果を取得する URL)

クエリ結果を JSON で取得して jq でパースする

例えば,jq で JSON 結果の上位2件を取得することもできる.クエリ結果を JSON で取得できるのは,いろいろと応用できて便利かと!

$ curl -s http://localhost/api/queries/1/results.json\?api_key\=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jq '.query_result.data.rows | [limit(2;.[])]'
[
  {
    "GovernmentForm": "Nonmetropolitan Territory of The Netherlands",
    "GNP": 828,
    "Code": "ABW",
    "Name": "Aruba",
    "HeadOfState": "Beatrix",
    "SurfaceArea": 193,
    "Region": "Caribbean",
    "Code2": "AW",
    "LifeExpectancy": 78.4,
    "Capital": 129,
    "LocalName": "Aruba",
    "GNPOld": 793,
    "Continent": "North America",
    "IndepYear": null,
    "Population": 103000
  },
  {
    "GovernmentForm": "Islamic Emirate",
    "GNP": 5976,
    "Code": "AFG",
    "Name": "Afghanistan",
    "HeadOfState": "Mohammad Omar",
    "SurfaceArea": 652090,
    "Region": "Southern and Central Asia",
    "Code2": "AF",
    "LifeExpectancy": 45.9,
    "Capital": 1,
    "LocalName": "Afganistan/Afqanestan",
    "GNPOld": null,
    "Continent": "Asia",
    "IndepYear": 1919,
    "Population": 22720000
  }
]

リフレッシュ API を試す

ただし,API 経由でクエリ結果を取得しても,クエリ結果がキャッシュされてしまっている場合がある.そのためにリフレッシュ API も用意されている.リフレッシュ API を使う場合は User API Key を使う必要がある.あくまで Query API Key は「クエリ結果を取得するため」のものであり,リフレッシュなど「状態を変化させるため」には使えないようになっている.

$ curl -XPOST http://localhost/api/queries/1/refresh\?api_key\=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
{"job": {"status": 1, "error": "", "id": "fc820fb6-6c1b-46fc-9005-3ba1f3042084", "query_result_id": null, "updated_at": 0}}%

小ネタ : Redash v3 で修正されたリフレッシュ API のエラー処理

Query API Key を使ってリフレッシュ API を叩いたときの挙動が,Redash v2 と Redash v3 で異なる.正確に言うと,Redash v3 で正しくエラーが返されるように修正されている.

github.com

Redash v2

Redash v2 だと 500 になってしまっている.

$ curl -XPOST http://localhost/api/queries/1/refresh\?api_key\=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
{"message": "Internal Server Error"}%

Redash v3

Redash v3 だと,適切なエラーメッセージが返っている.

$ curl -XPOST http://localhost/api/queries/1/refresh\?api_key\=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
{"message": "Please use a user API key."}%

まとめ

  • Redash の API Key には User API KeyQuery API Key の2種類がある
  • API 経由でクエリ結果を取得できる(CSV と JSON)
  • クエリ結果を最新化するためのリフレッシュ API があり,User API Key を使う必要がある
  • Query API Key を使ってリフレッシュ API を叩いたときのエラー処理が Redash v2 と Redash v3 で異なる

簡単に IP アドレスの計算ができる sipcalc コマンド

例えば VPC 設計をするときなど,IP アドレスとサブネットの計算をしたり,ネットワークアドレスを確認したくなる場面がたまーにある.便利なサイトも多くあるけど,コマンドですぐ確認できると便利で,僕は sipcalc コマンドを使っている(ipcalc コマンドよりも便利).近々チームメンバーに「VPC 入門」を教える機会があるため,ネタの1個としてザッとまとめておく.

ipcalc コマンド

ipcalc は IP アドレスの計算を行うことができるコマンドで,Amazon Linux など RHEL 系ならすぐに使える.

$ which ipcalc
/bin/ipcalc

例えば,CIDR からネットワークアドレスを確認する場合,以下のように --network もしくは -n を使う.

$ ipcalc --network 172.31.10.20/24
NETWORK=172.31.10.0

次に,IP アドレスとサブネットマスクを指定する場合,以下のように --prefix もしくは -p を使う.

$ ipcalc --prefix 172.31.10.20 255.255.255.0
PREFIX=24

もし,複数の項目を一度に確認する場合は,以下のように -mpbn を使う.

$ ipcalc -mpbn 172.31.10.20/24
NETMASK=255.255.255.0
PREFIX=24
BROADCAST=172.31.10.255
NETWORK=172.31.10.0

sipcalc コマンド

次は sipcalc コマンドで,例えば Addresses in network など,ipcalc コマンドでは確認できなかった情報まで確認できるため,非常に便利!Amazon Linux だと epel からインストールすることができる.

$ sudo yum --enablerepo=epel install sipcalc

CIDR を指定すると,ネットワークアドレスとブロードキャストアドレス,ネットワーク範囲,IP アドレス数などの情報を出力してくれる.

$ sipcalc 172.31.10.20/24
-[ipv4 : 172.31.10.20/24] - 0

[CIDR]
Host address        - 172.31.10.20
Host address (decimal)  - 2887715348
Host address (hex)  - AC1F0A14
Network address     - 172.31.10.0
Network mask        - 255.255.255.0
Network mask (bits) - 24
Network mask (hex)  - FFFFFF00
Broadcast address   - 172.31.10.255
Cisco wildcard      - 0.0.0.255
Addresses in network  - 256
Network range       - 172.31.10.0 - 172.31.10.255
Usable range        - 172.31.10.1 - 172.31.10.254

-

さらに --all を使うと,CIDR を2進数で表示できたりもして,さらに情報量が増える.

$ sipcalc --all 172.31.10.20/24
-[ipv4 : 172.31.10.20/24] - 0

[Classful]
Host address        - 172.31.10.20
Host address (decimal)  - 2887715348
Host address (hex)  - AC1F0A14
Network address     - 172.31.0.0
Network class       - B
Network mask        - 255.255.0.0
Network mask (hex)  - FFFF0000
Broadcast address   - 172.31.255.255

[CIDR]
Host address        - 172.31.10.20
Host address (decimal)  - 2887715348
Host address (hex)  - AC1F0A14
Network address     - 172.31.10.0
Network mask        - 255.255.255.0
Network mask (bits) - 24
Network mask (hex)  - FFFFFF00
Broadcast address   - 172.31.10.255
Cisco wildcard      - 0.0.0.255
Addresses in network  - 256
Network range       - 172.31.10.0 - 172.31.10.255
Usable range        - 172.31.10.1 - 172.31.10.254

[Classful bitmaps]
Network address     - 10101100.00011111.00000000.00000000
Network mask        - 11111111.11111111.00000000.00000000

[CIDR bitmaps]
Host address        - 10101100.00011111.00001010.00010100
Network address     - 10101100.00011111.00001010.00000000
Network mask        - 11111111.11111111.11111111.00000000
Broadcast address   - 10101100.00011111.00001010.11111111
Cisco wildcard      - 00000000.00000000.00000000.11111111
Network range       - 10101100.00011111.00001010.00000000 -
              10101100.00011111.00001010.11111111
Usable range        - 10101100.00011111.00001010.00000001 -
              10101100.00011111.00001010.11111110

[Networks]
Network         - 172.31.10.0     - 172.31.10.255 (current)

-

他にも sipcalc コマンドでは,サブネットマスクを指定することもできるし,ネットワークインターフェースを指定することもできる.詳しくはヘルプに書いてある.

$ sipcalc 172.31.10.20 255.255.255.0
$ sipcalc eth0

実は sipcalc コマンドは Mac でも使える

Mac でも sipcalc コマンドを使えるようにしておくと良さそう!

$ brew install sipcalc

まとめ

  • IP アドレスの計算などが必要になったら sipcalc コマンドを使う
    • もっとシンプルで良ければ ipcalc も使える

Black Belt 2017 : Amazon VPC

EC2 を起動する前に VPC もある程度は理解しておく必要があって,まずは Black Belt で学んでおくと良さそう!良資料!

www.slideshare.net

ElastiCache Redis 3.2.10 で使える「オンラインリサイズ機能」を試した

最近 ElastiCache Redis の検証をしていて,最近の新機能をキャッチアップできていなかったので「オンラインリサイズ機能」を試してみた.

用語

まず ElastiCache Redis の資料を読んでいると,管理コンソールと API で用語が異なっていてとにかく混乱するので,最初に整理しておく.現状だと以下は同じ意味で使われるので,今回は「管理コンソール」を尊重して「クラスタ」「シャード」という用語を使うことにする.なお,用語のためのドキュメントもあり,今後のアップデートで用語が統一される予定があると書いてあった.待望過ぎる!

  • 「クラスタ」 = 「レプリケーショングループ」
  • 「シャード」 = 「ノードグループ」

docs.aws.amazon.com

クラスタ

ElastiCache Redis クラスタの中にも,以下の2種類のモードがある.「クラスタモード無効のクラスタ」ってどういうこと?という感じはあるけど,正しく言うと,Redis 自体の Redis Cluster 機能 ( Redis Cluster Specification – Redis ) を有効にするか,無効にするかという違いで,構成もスケール戦略も全然違うため,どちらも理解しておく必要がある.

  • クラスタモード有効(シャードごとに分散し,シャードの中にマスターノードとレプリカノードを持つ構成)
  • クラスタモード無効(マスターノードとレプリカノードを持つ構成)

なお「クラスタモード有効」にする場合,ElastiCache Redis のバージョンは 3.2 系を選ぶ必要がある.

  • 3.2.10
  • 3.2.6
  • 3.2.4

オンラインリサイズ機能

「オンラインリサイズ機能」は去年11月にリリースされたもので,「クラスタモード有効」にした ElastiCache Redis 3.2.10 だけで使える.

aws.amazon.com

簡単に言うと,シャードを無停止でスケールアウトしたり,スケールインしたりできる機能で,今まではダウンタイムをある程度考慮する必要があった Redis の運用を大きく改善することができる.詳しくは,去年12月に開催された最新の BlackBelt 資料に載っている.

www.slideshare.net

試してみた : スケールアウト

まず「クラスタモード有効」にして,以下のような ElastiCache Redis クラスタを構築した.2 シャード,1 レプリカとした.

  • シャード名
    • kakakakakku-0001
      • スロット
        • 0-8191
      • ノード
        • kakakakakku-0001-001 kakakakakku-0001-001.xxxxxx.0001.apne1.cache.amazonaws.com
        • kakakakakku-0001-002 kakakakakku-0001-002.xxxxxx.0001.apne1.cache.amazonaws.com
    • kakakakakku-0002
      • スロット
        • 8192-16383
      • ノード
        • kakakakakku-0002-001 kakakakakku-0002-001.xxxxxx.0001.apne1.cache.amazonaws.com
        • kakakakakku-0002-002 kakakakakku-0002-002.xxxxxx.0001.apne1.cache.amazonaws.com

この構成のまま,以下のコマンドでシャードをスケールアウトすると,シャードが増えているのが確認できる.なお --node-group-count オプションでスケールアウト後のシャード数を設定することができる.

$ aws elasticache modify-replication-group-shard-configuration --replication-group-id kakakakakku --node-group-count 3 --apply-immediately

f:id:kakku22:20180119125017p:plain

スケールアウトが完了すると,以下のようにスロットがリバランスされていることを確認できる.なお,CLI だと aws elasticache describe-replication-groups で確認できる.

f:id:kakku22:20180119125050p:plain

参考として,現状と同じシャード数を指定して実行すると,ちゃんとエラーになった.

$ aws elasticache modify-replication-group-shard-configuration --replication-group-id kakakakakku --node-group-count 3 --apply-immediately

An error occurred (InvalidReplicationGroupState) when calling the ModifyReplicationGroupShardConfiguration operation: Slots in the replication group are uniformly distributed. No action to perform.

コマンドのドキュメントは以下にある.

試してみた : スケールイン

スケールインの場合は --node-group-count オプションに合わせて --node-groups-to-remove も使う必要がある.さらに --node-groups-to-remove '0001' '0002' のように,実際に削除するシャードを指定する必要がある.指定する機能はあっても良いけど,指定せずにスケールインする方法があっても良いのになー?という気もした.

$ aws elasticache modify-replication-group-shard-configuration --replication-group-id kakakakakku --node-group-count 1 --node-groups-to-remove '0001' '0002' --apply-immediately

f:id:kakku22:20180119125113p:plain

最終的に 1 シャードにスケールインできた.

f:id:kakku22:20180119125142p:plain

詳しくは以下のドキュメントに載っている.ただし,現時点だと「オンラインリサイズ機能」関連の内容が日本語のドキュメントに反映されていない部分も多く,読むときに注意が必要だった.

docs.aws.amazon.com

エンドポイント

「クラスタモード有効」の ElastiCache Redis にアプリケーションから接続する場合,設定エンドポイント (Configuration Endpoint) に接続することになる.ドキュメントを見ると,R/W Splitting をする場合でも同じエンドポイントで良いとのことだった.

設定エンドポイントを読み取りと書き込みの両方のオペレーションに使用します。Redis によってアクセス先のクラスターのノードが決定されます。

docs.aws.amazon.com

まとめ

  • ElastiCache Redis 3.2.10 で「クラスタモード有効」にすると,新機能「オンラインリサイズ機能」が使える
  • 無停止でスケールできるメリットがある
  • ただし「クラスタモード無効」と比べると,構成もスケール戦略も違うため,ユースケースによって選ぶ必要がある

ECS コンテナインスタンスをモニタリングするときは mackerel-agent v0.49.0 以上にすると良さそう

例えば ECS コンテナインスタンスなど,Docker ホストとして使っているインスタンスを Mackerel でモニタリングする場合,以下のように diskinterfacefilesystem のメトリクスが非常に多くなってしまう.Mackerel では,メトリクス数が 200 を超えると,1インスタンス追加と換算されてしまうため,比較的コンテナを多く起動している ECS コンテナインスタンスだと,メトリクス数が 200 を超えてしまうことが実際にあった(他にも多くメトリクスを取得しているため).

f:id:kakku22:20180117122957p:plain

mackerel-agent v0.49.0

公式ブログでもアナウンスがあった通り,mackerel-agent v0.49.0 から Docker ホストで dm-*veth* のメトリクスを取得しないようになっている.Docker ホストをモニタリングしている場合は mackerel-agent v0.49.0 以上(現在だと,最新は mackerel-agent v0.50.1)にすると良さそう.僕の運用している環境はすぐにアップデートして,不要なメトリクスが取得されないようになった.

mackerel.io

取り込まれたプルリクは以下だった.簡単に言うと,メトリクス名が dm-*veth* に一致した場合に取得しないようになっている.

github.com

github.com

なお,dm-* のメトリクスは /proc/diskstats から取得されていて,veth* のメトリクスは /proc/net/dev から取得されている.さらに veth* は go-osstat ライブラリから取得されていることも知った.go-osstat は今まで知らなかったぞ!

github.com

Device Mapper と Virtual Ethernet

Device Mapper は Linux で論理デバイスを構成する機能で,Docker でも採用されている.Virtual Ethernet は仮想的な NIC で,コンテナごとに付与されている.Docker のネットワーク管理,デバイス管理の話は「Docker 実践入門」に載っていて,今回改めて読み直した.

Docker実践入門――Linuxコンテナ技術の基礎から応用まで (Software Design plus)

Docker実践入門――Linuxコンテナ技術の基礎から応用まで (Software Design plus)

まとめ

  • ECS コンテナインスタンスなど,Docker ホストをモニタリングする場合は mackerel-agent v0.49.0 以上にすると良さそう
  • mackerel-agent のアップデートは定期的に確認するべし

関連記事

Mackerel でメトリクスを取得しすぎると,1インスタンス追加と換算される仕様は,以下に詳しく載っている.

mackerel.io

「プログラミング初心者に Rails を教えるコツ」を発表した

昨日は「表参道.rb #30」に参加して,発表をしてきた.カジュアルな雰囲気で,ディスカッションも多くとても良かった.

omotesandorb.connpass.com

資料

今日は「プログラミング初心者に Rails を教えるコツ」というタイトルにした.技術的な話ではないけど,副業で1年間講師をして感じたことをまとめた.プログラミング初心者に教えることは,もはやエンジニアリングとは別次元のスキルだなと思う.今後も「最高の教え方」を追求していきたい.

speakerdeck.com

Rails 5.2 Credentials

Rails 5.2 は全然キャッチアップできてなくて,Credentials の話も知らなかったので,勉強になった.実際に使ってみるとまだバグもあるらしく,正式リリースまでにはいろいろと修正が入りそうな感じだった.試してみるかぁー.

www.slideshare.net

Rails 製 BI ツール Blazer

Blazer は名前すら聞いたことがなかった.複数の BI ツールを知っておくと比較検討ができるし,メリットも大きいと思う.

speakerdeck.com

Ruby のトップレベルについておさらい

ライブコーディングは見てて非常に勉強になったし,vim の操作もすごかった.あと Ruby でバージョンごとに動作確認をするときには Wandbox をいうサービスを使っていると教えてもらった.スニペットを複数のバージョンで実行できるのは良さそう.

fast-ruby

サンプルコードもあって,Ruby 2.2 じゃなくてもすぐに確認できるようになっていた.これは非常に勉強になるので,自分でも読み進めてみたいと思う.

まとめ

Rubyist の集まるコミュニティは最高!今年は積極的に「表参道.rb」に参加するー.

関連記事

ariarijp.hatenablog.com