kakakakakku blog

Weekly Tech Blog: Keep on Learning!

SQL 選択実行など便利な新機能が追加された「Redash v7.0.0」紹介

2019年3月末に Redash の最新バージョン「Redash v7.0.0」がリリースされた.Change Log を読むと機能追加が多くあり,今回は「個人的に気になった Redash v7 新機能(もしくは UI 変更)」「9点」紹介しようと思う.

もし既存環境を Redash v7 にアップデートするのであれば,GitHub に公開されている docker-compose.yml と以下のドキュメントを確認しておくこと.バックアップを忘れずに!

redash.io

1. Version 表記

細かな UI 変更ではあるけど,Redash v6 までフッターにあった Version 表記が Redash v7 ではメニューバーに移動していた.個人的にはフッターがスッキリして良いかなと!

f:id:kakku22:20190414205148p:plain

2. Knowledge Base

Redash の操作に悩んだときによく見る「Redash Help (Knowledge Base)」のリンクがナビゲーションバーに追加されていた.全文検索にも対応しているし,結構使うことになりそう.Redash の普及に合わせて,ユーザーフレンドリーな UI 変更も増えている印象がある.

f:id:kakku22:20190414205731p:plain

3. データソース追加

Redash はバージョンアップごとに対応データソースを増やしている.今回 Redash v7 では「計5種類」追加となり「計44種類」になった.今後もどんどん増えていきそう!

  • Amazon Elasticsearch Service
  • Apache Drill
  • Mapd
  • Snowflake
  • Uptycs

f:id:kakku22:20190414205828p:plain

4. SQL 選択実行

個人的に Redash v7 で神アップデートだと感じるのは「SQL 選択実行」で,SQL の一部を選択して実行できるようになった.データ分析をするときはサブクエリを多用することもあるけど,今までだと SQL ごとに実行確認をしながら組み立てる必要があり,比較的面倒なオペレーションだと感じていた.Redash v7 では大規模 SQL を書くときもストレスなく使える.最高!

f:id:kakku22:20190414210510p:plain

5. クエリ自動実行

今までもあった「Refresh Schedule」「終了日 (Ends)」を設定できるようになった.広告出稿中など,限定的な期間にクエリ自動実行をできるようになり,より自由度が高くなったと思う.

f:id:kakku22:20190414210903p:plain

6. 最終アクセス日時

Redash User 管理画面に「最終アクセス日時 (Last Active At)」の項目が追加された.Redash 運用担当の視点から作られたまま放置された Redash User を精査するときなどに使えそう.

f:id:kakku22:20190414211045p:plain

7. 招待中

Redash v6 だと Redash User 管理画面に「Active Users」「Disabled Users」しかなく,今回 Redash v7 では「Pending Invitations」も追加された.Active と Pending を区別できるのは Redash 運用担当だと助かる機能と言える.

f:id:kakku22:20190414211225p:plain

8. User API Key 更新

Redash v7 では User API Key を「更新 (Regenerate)」できるようになった.コンプライアンス的に要件はありそう.とは言え,推奨は User API Key ではなく Query API Key となり,使う前に一度ドキュメントを読んでおくと良いと思う.詳しくは過去記事にまとめてある.

kakakakakku.hatenablog.com

f:id:kakku22:20190414211419p:plain

9. Google Hangouts Chat 通知

アラート機能の通知先に「Google Hangouts Chat」が追加された.データソースと同じく,必要に応じてどんどん増えていく気がする.

f:id:kakku22:20190414211711p:plain

まとめ

  • Redash v7.0.0 を試した
  • 個人的に気になった新機能(もしくは UI 変更)を「9点」紹介した
  • 「SQL 選択実行」は Redash v7 の神アップデートだと思う
  • Redash ハンズオン資料 (redash-hands-on) の v7 対応はもう少しお待ちを🙏

github.com

どうすればうまく教えられるのか /「インストラクショナルデザイン」を読んだ

アウトプットとは「情報を伝えること」であり,視点によっては「教えること」と言い換えることもできる.1年半前の登壇資料(アウトプット駆動学習を習慣化する)にも書いた通り,僕はアウトプットの延長線として「教えること」に強く興味があり,プログラミング講師を約2年,ブログメンタリングを約1年半,技術講師を約8ヶ月と,直近数年間は「教えること」を追求するために多くの時間を割いている.どうすればうまく教えられるのか.どうすればうまく教えられないのか.そんなことばかり考えている.

f:id:kakku22:20190408214833j:plain

インストラクショナルデザイン

とは言え,まだまだ「教える技術」を磨くために,最近「インストラクショナルデザイン」を読んだ.本書を引用すると「インストラクション = 何らかの行動を引き起こすための仕掛け」と書いてあり,教育だけではなく,例えば道路標識や取扱説明書なども含まれる.よって「インストラクション」は,より幅広い意味で「教える」「伝える」ことを表現している言葉と言える.今回は「インストラクショナルデザイン」の書評をまとめる.

インストラクショナルデザイン―教師のためのルールブック

インストラクショナルデザイン―教師のためのルールブック

目次

本書は二部構成になっている.調べてもあまり目次が出てこなかったので,内容をザッと把握できるようにするためにも載せておく.

  • 前編 : インストラクションの鉄則
    • 鉄則 1 : 何を教えるのかをはっきりさせる
    • 鉄則 2 : 学びにコミットする
    • 鉄則 3 : 教える理由をはっきりさせる
    • 鉄則 4 : 成功の基準をはっきりさせる
    • 鉄則 5 : 標的行動を見せてやらせて確認させる
    • 鉄則 6 : 意味ある行動を引き出す
    • 鉄則 7 : 引き出した行動はすぐに強化する
    • 鉄則 8 : 正答を教える
    • 鉄則 9 : 誤答を教える
    • 鉄則 10 : スペックを明記する
    • 鉄則 11 : 学び手を知る
    • 鉄則 12 : 学び手は常に正しい
    • 鉄則 13 : 教え手を知る
    • 鉄則 14 : 学ばせて楽しませる
    • 鉄則 15 : 個人差に配慮する
    • 鉄則 16 : 「分かりました」で安心しない
    • 鉄則 17 : 改善に役立つ評価をする
  • 後編 : インストラクションのデザイン
    • ステップ 1 : 本当にインストラクションが必要ですか?
    • ステップ 2 : しない・できないの原因は? 問題の原因分析
    • ステップ 3 : 何を教えるか明らかにする 課題分析 (1)
    • ステップ 4 : 何を教えるか明らかにする 職務分析
    • ステップ 5 : 何を教えるか明らかにする 課題分析 (2)
    • ステップ 6 : 学び手のプロフィールを書く
    • ステップ 7 : どこからどこまで教えるのかを決める (1)
    • ステップ 8 : どこからどこまで教えるのかを決める (2)
    • ステップ 9 : どこからどこまで教えるのかを決める (3)
    • ステップ 10 : 教える内容を分析する RULEG Part 1
    • ステップ 11 : 説明のための材料を用意する RULEG Part 2
    • ステップ 12 : 練習のための教材を用意する RULEG Part 3
    • ステップ 13 : 改善に活かせる評価をする
    • ステップ 14 : 開発評価を行う
    • ステップ 15 : 性能評価を行う
    • ステップ 16 : 実地評価を行う

鉄則 12 : 学び手は常に正しい

「鉄則 12」は非常に考えさせられる内容だった.例えば,相手にうまく教えられないときに「相手のやる気がなかった」とか「教科書が悪い」など「個人攻撃の罠」に陥らないようにするべきという内容だった.言い換えると「他責を自責に」と表現することもできる.どんな状況でも「学び手は常に正しい」と考えることで,うまく教えるために自分自身の行動をどのように改善できるのかを考えようと思う.本書では「インストラクションを受ける側」のことを「学び手」と表現している.

鉄則 15 : 個人差に配慮する

学び手は誰しも知識と経験に差があるので,同じインストラクションを使っても,当然ながら理解度に差が出る可能性がある.特に10名以上など,クラスルーム型研修をする場合は,差が顕著になる.本書に書いてあり,重要だなと感じたことは「個人差に対処するため事前に対策を考えておく」という点で,理解はしていても,案外「個人差に対処する対策」を洗い出せていないことも多く,改めて考えてみたいと思う.

鉄則 16 : 「分かりました」で安心しない

「わかりましたか?」は確かによく言ってしまうけど,本書では「禁じ手のひとつ」と書かれていた.重要なのは「本当にわかったのかどうか」を確認する方法を事前に用意しておくことで,本書では,以下の4種類が確認基準として紹介されている.教えながら「言い換えられそう?」や「例外はありそう?」など,対話をしながら「本当にわかったのかどうか」を確認したいと思う.

  • その定義を言えるようになる
  • その定義を自分の言葉で言い換えられるようになる
  • その定義にあてはまる例と例外を区別できるようになる
  • その定義の例を自分で考えられるようになる

ステップ 2 : しない・できないの原因は? 問題の原因分析

インストラクションは,あくまで学び手の「知識や技能の未習得」がわからない原因になっている場合に必要かつ有効であり,それ以外の場合はインストラクションが有効な解決策にならない場合もあるという話だった.代表的なものは「動機づけ」で,その場合は「パフォーマンスマネジメント」が必要かつ有効であると書いてあった.本書では「インストラクションを与える側」のことを「教え手」と表現しているけど,教え手は適切に原因を判断し,場合によっては「パフォーマンスマネジメント」に時間を割く必要がある.詳しくは以下の本に載っている.

パフォーマンス・マネジメント―問題解決のための行動分析学

パフォーマンス・マネジメント―問題解決のための行動分析学

ステップ 15 : 性能評価を行う

インストラクションが,教えるべきことを教えられているかを確認することを「性能評価」と呼ぶ.例えば,インストラクションの後のテストで間違いが多くある場合,「個人攻撃の罠」に陥るのではなく,インストラクションに問題があることを疑う姿勢が重要になる.技術講師をしているときも,意図的に「2種類のインストラクション(説明資料)」を用意して,A/B テストのように比較をする場合がある.今まで実施していたことを「性能評価」と表現するんだなと気付くことができた.

まとめ

本書を読んだことにより,当然ながら新しく学べたこともあったし,日々の仕事(技術講師)をしながら既に意識できていることをうまく言語化してもらえた!と感じる部分もあった.技術講師など「情報を伝えること」を仕事にしている人はもちろんのこと,例えば「新人教育を任されたエンジニア」だったり,メンバーと 1 on 1 をする機会が多くありそうな「Engineering Manager」だったり,幅広くオススメできる.

なお,今月から「放送大学」に科目履修生として入学し,現在は「教育心理学概論」を履修している.今期はアカデミックな観点からも「教えること」を学んでいる.どうすればうまく教えられるのか.どうすればうまく教えられないのか.アウトプットの延長線として,僕は「教えること」を追求していくぞ!

インストラクショナルデザイン―教師のためのルールブック

インストラクショナルデザイン―教師のためのルールブック

TED Talk

少し文脈は変わるけど,教育改革などのテーマを学ぶなら以下に載せた Ken Robinson 氏の TED Talk を見ると良いと思う.内容もさることながらプレゼンテーション自体も非常に面白く勉強になる.

Sir Ken Robinson: Do schools kill creativity? | TED Talk

www.ted.com

Sir Ken Robinson: Bring on the learning revolution! | TED Talk

www.ted.com

関連本

「教育/教える/コーチング」に関連する本は今までも読んでいる.オススメ本として,以下に参考リンクとして載せておく!

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

関連記事

冒頭に載せた登壇資料は以下にある.

kakakakakku.hatenablog.com

Markdown Extensions / 検索機能などをサポートした静的サイトジェネレーター「VuePress」を試した

ポートフォリオ的な静的サイトを実装する機会があり,選択肢として GatsbyHugo も検討したけど,前から気になっていた「VuePress」を試すことにした.VuePress は Vue で実装された「Vue-Powered な」静的サイトジェネレーターで,Markdown で書くことができ,さらに設定次第では Service Worker を有効化することもできる.今回はドキュメントを読みながら VuePress に入門して,良さそう!と感じた機能を紹介する.ローカル環境で実装をして,ホスティングは Netlify や AWS Amplify Console を使えばお手軽にできるのも助かる.

vuepress.vuejs.org

github.com

インストール

まず,ドキュメントにある Getting Started を参考に進める.VuePress は今日時点で「v0.14.10」が最新バージョンとなり,並行して「v1.0.0-alpha.46」も開発が進められている.今回は v1 で使える新機能(後述する)を試したくて,「v1.0.0-alpha.46」をインストールすることにした.yarnnpm をサポートしているけど,ドキュメントには yarn 推奨と書いてある.

$ yarn add vuepress@next -D

vuepress.vuejs.org

次に自動生成された package.json に以下を追記する.

{
  "scripts": {
    "docs:dev": "vuepress dev docs",
    "docs:build": "vuepress build docs"
  }
}

さっそく ./docs/README.md に1行追記し,yarn docs:dev を実行すると,ローカル環境が起動する.もう http://localhost:8080 にアクセスできるようになっている!タイトルと検索機能のみだけどー.

$ mkdir docs
$ echo '# Hello VuePress' > ./docs/README.md
$ yarn docs:dev 

f:id:kakku22:20190403181637p:plain

設定

次に VuePress の設定ファイル ./docs/.vuepress/config.js を作成する.

$ mkdir ./docs/.vuepress
$ vim ./docs/.vuepress/config.js

最初に以下の項目を設定した.

  • title ... title tag
  • description ... meta tag
  • themeConfig.nav ... ナビゲーションバー
module.exports = {
  title: 'Hello @kakakakakku',
  description: 'Hello @kakakakakku',
  themeConfig: {
    nav: [
      {text: 'Top', link: '/'},
      {text: 'VuePress', link: 'https://vuepress.vuejs.org/'},
      {text: 'kakakakakku blog', link: 'https://kakakakakku.hatenablog.com/'}
    ]
  }
}

themeConfig.nav にリンクを定義するとナビゲーションバーを生成できるのは便利だと思う.

f:id:kakku22:20190403181654p:plain

他にも Google Analytics を設定したり,Service Worker を有効化したり,設定できる項目が多くある.詳しくはドキュメントに載っている.

vuepress.vuejs.org

vuepress.vuejs.org

Markdown

よく使う一般的な Markdown 記法を試す.今回は「リスト記法」「テーブル記法」を書いてみた.特に違和感はなく,期待通り!

f:id:kakku22:20190403181721p:plain

Markdown Extensions

VuePress には「Markdown Extensions」という機能があり,Markdown を拡張した独自記法をサポートしている.VuePress を使うメリットの1個とも言える.今回は3種類を紹介する(キャプチャは最後に載せてある).

  • 目次
  • メッセージ
  • シンタックスハイライト

Markdown Extensions : 目次

以下のように [[toc]] と書くと,目次になる.デフォルトだと「h2 / h3」を対象にしているけど,設定ファイルに markdown.toc を定義すれば,カスタマイズもできる.

## 目次

[[toc]]

Markdown Extensions : メッセージ

以下のように ::: を使うと,メッセージを書くことができる.今までよく見てきた Bootstrap で言えば,Alerts とほぼ同じ.

## メッセージ

::: tip
This is a tip
:::

::: warning
This is a warning
:::

::: danger
This is a danger
:::

Markdown Extensions : シンタックスハイライト

以下のように書くと,コードにシンタックスハイライトを適用できる.さらに js{4} のように書くことにより,特定の行を強調することもできる.なお,今回の記事は Markdown で書いているため,期待通りにレンダリングできず,今回は意図的に *"``" にしている.正しくは "```" となる.

`` js{4}
export default {
  data () {
    return {
      msg: 'Highlighted!'
    }
  }
}
``

さらに VuePress v1 で使える新機能に「Line Numbers」があり,有効化するとコードに行数を表示できるようになる.今回は「v1.0.0-alpha.46」を使っているので,./docs/.vuepress/config.js に以下の設定を追加して,有効化した.

module.exports = {
  (中略)
  markdown: {
    lineNumbers: true
  },
  (中略)
}

最終的に「Markdown Extensions」3種類を使って,以下のようにサイトをリッチに表示できるようになった.

f:id:kakku22:20190403181744p:plain

検索機能

ナビゲーションバーに「検索機能」があり,特に設定をしなくても「インクリメンタルサーチ」をサポートしている.静的サイトジェネレータだからこそ,ビルド時にインデックスを作ることができるし,超便利機能だと思う.本格的に全文検索をするなら Elasticsearch や Algolia を検討することになるけど,簡易的な検索なら十分に使える.今回は docs 直下を以下の構成にしている.

$ tree .
.
├── README.md
├── topic_a.md
├── topic_b.md
└── topic_c.md

Toa で正常に検索できている.

f:id:kakku22:20190403182113p:plain

ドキュメントを読むと「title / h2 / h3」をインデックス対象にしていると書いてあった!

vuepress.vuejs.org

まとめ

  • 静的サイトを実装する機会があり「VuePress」を試した
  • 一般的な Markdown 以外に「Markdown Extensions」が多くあり,リッチにサイトを作れる
  • 細かな設定も .vuepress/config.js に定義できる
  • サクッと VuePress でサイトを実装し,ホスティングは Netlify や AWS Amplify Console を使えばお手軽にできる
  • 今回試した VuePress のサンプルコードは GitHub に置いてある

github.com

HashiCorp Learn の Consul コース「Getting Started with Kubernetes」を実施した

引き続き Consul を検証している.前回の記事では「HashiCorp Learn Platform」を活用して,Consul の「Getting Started」を実施したので,今回は「Getting Started with Kubernetes」を実施した.Consul に限らず,Kubernetes と Envoy を使ったマイクロサービスを試すことができる点もメリットだと思う.興味がある人は是非やってみると良いのでは!とは言え,Consul 要素は少ないようにも感じた.

kakakakakku.hatenablog.com

「HashiCorp Learn Platform」には,Consul 以外にも Vault / Terraform / Nomad のコンテンツがあるので,継続的に学んでいく.

learn.hashicorp.com

HashiCorp Learn 画面

画面は前回と同じで,基本的に動画を見ながら受講する.コマンドをコピーするときは下部にあるスクリプトを使う.

f:id:kakku22:20190330180924p:plain

Learn how to deploy a service mesh with HashiCorp Consul : Getting Started with Kubernetes

今回実施した「Getting Started with Kubernetes」は,前回実施した「Getting Started」と比較すると内容は軽く,計2ステップある.

  • 1 : Consul Installation to Minikube via Helm (8 min)
    • 実際に動画を観ると 9 min を超えているし,実際に動作確認をしながら進めるため,1時間ぐらいを想定しておくと良さそう
  • 2 : Deploy Consul with Kubernetes (8 min)

1 : Consul Installation to Minikube via Helm

learn.hashicorp.com

Prerequisites

Minikube と Helm をインストールしておく.今回は brew を使う.

$ brew cask install minikube
$ brew install kubernetes-cli
$ brew install kubernetes-helm

kubernetes.io

Task 1: Start Minikube and Install Consul with Helm

Step 1: Start Minikube

まず,Minikube を使って VirtualBox 上に Kubernetes を起動する.起動後に minikube dashboard を実行すると,Kubernetes Dashboard にアクセスできる.

$ minikube start --memory 8192
$ minikube dashboard

f:id:kakku22:20190330180954p:plain

Step 2: Install the Consul Helm Chart to the Cluster

今回は HashiCorp Training でも使われている「hashicorp/demo-consul-101」を使う.

github.com

さらに Consul Helm Chart を使う.Helm Charts の stable にもあるけど,どう違うんだろう.

github.com

最後に helm install を実行する.

$ git clone https://github.com/hashicorp/demo-consul-101.git
$ cd demo-consul-101/k8s
$ helm init
$ git clone https://github.com/hashicorp/consul-helm.git
$ helm install -f helm-consul-values.yaml --name hedgehog ./consul-helm

Task 2: Deploy a Consul-aware Application to the Cluster

Step 1: View the Consul Web UI

minikube service list を実行すると,起動しているサービスを確認できる.

$ minikube service list
|-------------|--------------------------------------|-----------------------------|
|  NAMESPACE  |                 NAME                 |             URL             |
|-------------|--------------------------------------|-----------------------------|
| default     | hedgehog-consul-connect-injector-svc | No node port                |
| default     | hedgehog-consul-dns                  | No node port                |
| default     | hedgehog-consul-server               | No node port                |
| default     | hedgehog-consul-ui                   | http://192.168.99.100:30367 |
| default     | kubernetes                           | No node port                |
| kube-system | kube-dns                             | No node port                |
| kube-system | kubernetes-dashboard                 | No node port                |
| kube-system | tiller-deploy                        | No node port                |
|-------------|--------------------------------------|-----------------------------|

サービス一覧から hedgehog-consul-ui を起動すると,Consul Web UI にアクセスできる.

$ minikube service hedgehog-consul-ui

f:id:kakku22:20190330181043p:plain

Step 2: Deploy Custom Applications

アプリケーションを2種類起動する.

  • Counting Service
  • Dashboard Service
$ kubectl create -f 04-yaml-connect-envoy
pod/counting created
pod/dashboard created
service/dashboard-service-load-balancer created

f:id:kakku22:20190330181103p:plain

Step 3: View the Web Application

起動した Dashboard Service に接続するために,ポートフォワードを設定する.既に http://localhost:9002 にアクセスできるようになっている.ちなみに Counting Service と Dashboard Service は Envoy を経由した構成になっている.

$ kubectl port-forward dashboard 9002:9002
Forwarding from 127.0.0.1:9002 -> 9002
Forwarding from [::1]:9002 -> 9002

f:id:kakku22:20190330184535p:plain

Task 3: Use Consul Connect

最後に Consul Intentions を設定する.まず,全サービスのアクセスを拒否する.

f:id:kakku22:20190330181145p:plain

すると,Dashboard Service から Counting Service にアクセスできず,Unreachable エラーになる.

f:id:kakku22:20190330181202p:plain

次に Dashboard Service から Counting Service にアクセスできるように許可すると,正常にアクセスできるようになった.

f:id:kakku22:20190330181226p:plain

2 : Deploy Consul with Kubernetes

Consul Helm Chart を使って Kubernetes 上に Consul をデプロイする.「Consul Installation to Minikube via Helm」と重複する箇所も多く,一通り実施はしたけど,割愛する.

learn.hashicorp.com

まとめ

  • HashiCorp プロダクトを学ぶなら「HashiCorp Learn Platform」を活用する
  • 今回は「Learn how to deploy a service mesh with HashiCorp Consul」「Getting Started with Kubernetes」を実施した
  • Minikube で起動した Kubernetes 上にマイクロサービスを起動して Consul Connect で制御できるようになった

参考記事

www.consul.io

HashiCorp 学習コンテンツ「HashiCorp Learn Platform」を活用して Consul を学ぶ

最近 Consul を検証する機会があり,まず全体概要を把握するために「HashiConf 2018」で発表された「HashiCorp Learn Platform」を活用することにした.「HashiCorp Learn Platform」は HashiCorp が提供する学習コンテンツで,現在は Vault / Consul / Terraform / Nomad をサポートしている.Getting Started と Advanced Tracks があり,習熟度に合ったコンテンツを選ぶことができる.興味のある HashiCorp プロダクトがあったらすぐに試してみると良いかと!

  • HashiCorp Vault
    • Getting Started
    • Advanced Tracks
      • Day 1: Deploying Your First Vault Cluster
      • Secrets Management
      • Identity and Access Management
      • Encryption as a Service
      • Security
      • Operations
      • Developer
  • HashiCorp Consul
    • Getting Started
    • Getting Started with Kubernetes
    • Advanced Tracks
      • Day 1: Deploying Your First Datacenter
      • Day 2: Advanced Operations
  • HashiCorp Terraform
    • Getting Started
    • Advanced Tracks
      • Getting Started - Azure
      • Terraform Enterprise
      • Developer
      • Operations
      • AWS Provider
      • Azure Provider
  • HashiCorp Nomad
    • Getting Started

learn.hashicorp.com

HashiCorp Learn 画面

基本的に動画を見ながら受講する.字幕機能はないけど,下部にスクリプトが載っているので困ることはないし,コマンドをコピーするときにも便利だった.英語も非常に聞き取りやすくなっている.

f:id:kakku22:20190322091804p:plain

Learn how to deploy a service mesh with HashiCorp Consul : Getting Started

今回は「Learn how to deploy a service mesh with HashiCorp Consul」「Getting Started」を実施した.全9ステップから構成されている.累計時間も「49 min」と,コンパクトにまとまっている.

  • Install Consul (4 min)
  • Run the Consul Agent (7 min)
  • Registering Services (6 min)
  • Connect (7 min)
  • Consul Cluster (8 min)
  • Registering Health Checks (5 min)
  • KV Data (5 min)
  • Web UI (4 min)
  • Next Steps (3 min)

learn.hashicorp.com

Install Consul

まず,Consul をインストールする.今回は Mac で動かすため,brew を使うことにした.

$ brew install consul

$ consul version
Consul v1.4.2
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

OS ごとにバイナリも公開されている.

www.consul.io

Run the Consul Agent

次に,Consul Agent を「development server mode」で起動する.Mac で動かす場合,kakakakakku.local のようにコンピュータ名にピリオドが含まれている場合があり,Consul DNS に影響がある.今回は -node オプションを使って,名前を指定することにした.

$ consul agent -dev -node machine

$ consul members
Node     Address         Status  Type    Build  Protocol  DC   Segment
machine  127.0.0.1:8301  alive   server  1.4.2  2         dc1  <all>

www.consul.io

Consul では,ノード情報を API と DNS から取得できる.以下は API からノード情報を取得している.

$ curl localhost:8500/v1/catalog/nodes
[
    {
        "ID": "11111111-2222-3333-4444-555555555555",
        "Node": "machine",
        "Address": "127.0.0.1",
        "Datacenter": "dc1",
        "TaggedAddresses": {
            "lan": "127.0.0.1",
            "wan": "127.0.0.1"
        },
        "Meta": {
            "consul-network-segment": ""
        },
        "CreateIndex": 9,
        "ModifyIndex": 10
    }
]

そして Consul DNS にノードの IP を問い合わせる.

$ dig @127.0.0.1 -p 8600 machine.node.consul

(中略)

;; QUESTION SECTION:
;web.service.consul.        IN  A

;; ANSWER SECTION:
machine.node.consul.    0  IN  A   127.0.0.1

;; ADDITIONAL SECTION:
machine.node.consul.    0  IN  TXT "consul-network-segment="

(中略)

Registering Services

Consul にサービスを登録する.まず設定ファイルを管理する ./consul.d ディレクトリを作成し,以下のように web サービス用の ./consul.d/web.json を作成した.

{
  "service": {
    "name": "web",
    "tags": [
      "rails"
    ],
    "port": 80
  }
}

Consul Agent を起動するときに -config-dir オプションを指定するとディレクトリを指定できる.今回は以下のように起動すると,コンソールにサービスを認識したログが出ていた.

$ consul agent -dev -config-dir=./consul.d -node machine

(中略)

2019/03/20 00:00:00 [DEBUG] agent: Service "web" in sync

(中略)

Consul DNS にサービスを問い合わせることもできる.

$ dig @127.0.0.1 -p 8600 web.service.consul

;; QUESTION SECTION:
;web.service.consul.        IN  A

;; ANSWER SECTION:
web.service.consul. 0  IN  A   127.0.0.1

;; ADDITIONAL SECTION:
web.service.consul. 0  IN  TXT "consul-network-segment="

Consul DNS は SRV レコードを問い合わせることもでき,今回は machine.node.dc1.consul の 80 ポートで web サービスが動いていることがわかる.

$ dig @127.0.0.1 -p 8600 web.service.consul SRV

;; QUESTION SECTION:
;web.service.consul.        IN  SRV

;; ANSWER SECTION:
web.service.consul. 0  IN  SRV 1 1 80 machine.node.dc1.consul.

;; ADDITIONAL SECTION:
machine.node.dc1.consul. 0 IN  A   127.0.0.1
machine.node.dc1.consul. 0 IN  TXT "consul-network-segment="

当然ながら API でサービスを確認することもできる.また /health エンドポイントと ?passing パラメータを組み合わせると正常なインスタンスを確認することもできる.

$ curl http://localhost:8500/v1/catalog/service/web
$ curl 'http://localhost:8500/v1/health/service/web?passing'

Connect

次に Consul Connect を学ぶ.Consul Connect とはサービス間の通信を担当するための Sidecar Pattern Proxy と表現することができて,詳細は以下の公式ドキュメントに載っている.

www.consul.io

まず,Consul Connect を使わずに,socat コマンドを使った echo サービスを実装する.Mac に socat をインストールしておく必要がある.nc で接続すると,正常に echo できる(オウム返し).

$ brew install socat

$ socat -v tcp-l:8181,fork exec:"/bin/cat"

$ nc 127.0.0.1 8181
hello
hello
echo
echo

以下の JSON を ./consul.d/socat.json として保存する.

{
  "service": {
    "name": "socat",
    "port": 8181,
    "connect": {
      "sidecar_service": {}
    }
  }
}

Consul に設定ファイルを反映する.正確に言うと consul reload を実行すると Consul プロセスに SIGHUP シグナルを送ることになる.

$ consul reload
Configuration reload triggered

次に Consul Connect の設定をし,サービスに接続すると,Proxy を経由して echo できるようになる.

$ consul connect proxy -sidecar-for socat
$ consul connect proxy -service web -upstream socat:9191

$ nc 127.0.0.1 9191
Hello Consul via Connect
Hello Consul via Connect

実際に使う場合は ./consul.d/web.json に依存関係を書くことになる.

{
  "service": {
    "name": "web",
    "port": 8080,
    "connect": {
      "sidecar_service": {
        "proxy": {
          "upstreams": [{
             "destination_name": "socat",
             "local_bind_port": 9191
          }]
        }
      }
    }
  }
}

改めて Proxy を起動すると echo できるようになる.

$ consul reload
Configuration reload triggered

$ consul connect proxy -sidecar-for web

さらに,Consul Connect には Intentions と言う「サービス認可」の仕組みもある.以下のように websocat を deny すると echo できなくなり,設定を削除すると echo できなくなる.

$ consul intention create -deny web socat
Created: web => socat (deny)

$ nc 127.0.0.1 9191

$ consul intention delete web socat
Intention deleted.

$ nc 127.0.0.1 9191
Hello Consul via Connect
Hello Consul via Connect

Intentions の詳細は公式ドキュメントに載っている.サービスメッシュを実装するときにより詳しく理解しておく必要がある.

www.consul.io

Consul Cluster

次に Vagrant を使って仮想環境を2台構築し,Consul Cluster を試す.以下にある Consul デモ用の Vagrantfile を起動すると n1n2 を起動できる.

今回は n1 を Consul Agent Server として,n2 を Consul Agent Client として使う.

[n1] $ consul agent -server -bootstrap-expect=1 \
    -data-dir=/tmp/consul -node=agent-one -bind=172.20.20.10 \
    -enable-script-checks=true -config-dir=/etc/consul.d

[n2] $ consul agent -data-dir=/tmp/consul -node=agent-two \
    -bind=172.20.20.11 -enable-script-checks=true -config-dir=/etc/consul.d

n1n2 を Consul Cluster に join させると,ノード情報を共有できるようになる.

[n1] $ consul members
Node       Address            Status  Type    Build  Protocol  DC   Segment
agent-one  172.20.20.10:8301  alive   server  1.4.3  2         dc1  <all>

[n1] $ consul join 172.20.20.11
Successfully joined cluster by contacting 1 nodes.

[n1] $ consul members
Node       Address            Status  Type    Build  Protocol  DC   Segment
agent-one  172.20.20.10:8301  alive   server  1.4.3  2         dc1  <all>
agent-two  172.20.20.11:8301  alive   client  1.4.3  2         dc1  <default>

[n2] $ consul members
Node       Address            Status  Type    Build  Protocol  DC   Segment
agent-one  172.20.20.10:8301  alive   server  1.4.3  2         dc1  <all>
agent-two  172.20.20.11:8301  alive   client  1.4.3  2         dc1  <default>

そして Consul DNS を使ってノード情報を問い合わせることもできる.

[n1] $ dig @127.0.0.1 -p 8600 agent-two.node.consul

;; QUESTION SECTION:
;agent-two.node.consul.     IN  A

;; ANSWER SECTION:
agent-two.node.consul.  0  IN  A   172.20.20.11

;; ADDITIONAL SECTION:
agent-two.node.consul.  0  IN  TXT "consul-network-segment="

なお,クラウド環境で Auto Scaling をする場合,自動的に Consul Cluster に join させる必要がある.Amazon EC2 なら tag を指定し,自動化できる.詳細は公式ドキュメントに載っている.

www.consul.io

Registering Health Checks

引き続き Consul Cluster 環境を使って,ヘルスチェックを設定する.まず,n2 に2個の設定をする.1個目は google.com に ping をする /etc/consul.d/ping.json となる.

{
  "check": {
    "name": "ping",
    "args": [
      "ping",
      "-c1",
      "google.com"
    ],
    "interval": "30s"
  }
}

2個目は localhost に curl をする /etc/consul.d/web.json となる.意図的にヘルスチェックは失敗するようになっている.そして設定後は consul reload を実行する.

{
  "service": {
    "name": "web",
    "tags": [
      "rails"
    ],
    "port": 80,
    "check": {
      "args": [
        "curl",
        "localhost"
      ],
      "interval": "10s"
    }
  }
}

以下のエンドポイントを叩くと,異常を確認できる.

[n1] $ curl http://localhost:8500/v1/health/state/critical

異常と判定されているため,Consul DNS に問い合わせをしても,何も返ってこなくなる.

[n1] dig @127.0.0.1 -p 8600 web.service.consul

(中略)

;; QUESTION SECTION:
;ping.service.consul.       IN  A

(中略)

KV Data

次に Consul KVS を試す.サンプルとして Redis Configuration などを設定する.-recurse オプションは覚えておくと良さそう.

$ consul kv get redis/config/minconns
Error! No key exists at: redis/config/minconns

$ consul kv put redis/config/minconns 1
Success! Data written to: redis/config/minconns

$ consul kv put redis/config/maxconns 25
Success! Data written to: redis/config/maxconns

$ consul kv put -flags=42 redis/config/users/admin abcd1234
Success! Data written to: redis/config/users/admin

$ consul kv get redis/config/minconns
1

$ consul kv get -detailed redis/config/minconns
CreateIndex      19
Flags            0
Key              redis/config/minconns
LockIndex        0
ModifyIndex      19
Session          -
Value            1

$ consul kv get -recurse
redis/config/maxconns:25
redis/config/minconns:1
redis/config/users/admin:abcd1234

$ consul kv delete redis/config/minconns
Success! Deleted key: redis/config/minconns

$ consul kv delete -recurse redis
Success! Deleted keys with prefix: redis

また Consul KVS は「Check-And-Set operation」をサポートしている.最新更新を表現する ModifyIndex を指定することにより,アトミックに更新できるようになる.

$ consul kv put foo bar
Success! Data written to: foo

$ consul kv get foo
bar

$ consul kv put foo zip
Success! Data written to: foo

$ consul kv get foo
zip

$ consul kv get -detailed foo
CreateIndex      39
Flags            0
Key              foo
LockIndex        0
ModifyIndex      41
Session          -
Value            zip

$ consul kv put -cas -modify-index=123 foo bar
Error! Did not write to foo: CAS failed

$ consul kv put -cas -modify-index=41 foo bar
Success! Data written to: foo

$ consul kv put -cas -modify-index=41 foo bar
Error! Did not write to foo: CAS failed

$ consul kv get -detailed foo
CreateIndex      39
Flags            0
Key              foo
LockIndex        0
ModifyIndex      46
Session          -
Value            bar

KV Store Endpoints の詳細は公式ドキュメントに載っている.

www.consul.io

また Consul KVS の値は Consul Web UI から確認することもできる.

f:id:kakku22:20190322104653p:plain

Web UI

特に内容はなく,Consul Web UI を確認する.-ui オプションを追加すると,http://localhost:8500/ui にアクセスできるようになる.

$ consul agent -dev -ui -node machine

f:id:kakku22:20190322105757p:plain

Next Steps

次は「Advanced Tracks」に進んだり,ドキュメントを読もう!という内容になっている.他コースもどんどん学んでいく.

まとめ

  • HashiCorp プロダクトを学ぶなら「HashiCorp Learn Platform」を活用する
    • 現在 Vault / Consul / Terraform / Nomad をサポートしている
  • 今回は「Learn how to deploy a service mesh with HashiCorp Consul」「Getting Started」を実施した
  • Consul の基本機能を網羅的に学ぶことができた
  • 興味のある HashiCorp プロダクトがあったらすぐに試してみると良いかと!