kakakakakku blog

Weekly Tech Blog: Keep on Learning!

技術ブロガー必読!と言える「Technical Blogging, Second Edition」を読んだ

技術ブロガー必読!と言える「Technical Blogging, Second Edition - Amplify Your Influence」を読んだ.タイトルにある通り「技術ブログ」にフォーカスした本となる.本書は2012年に出版された歴史のある本で,最新版となる Second Edition が6月末に出版された.なお,Second Edition は今年1月から β として公開されていて,β 1.0 → β 5.0 と進化しながら出版されている.

技術ブロガーとして,今まで10年以上育ててきた暗黙知をうまく整理する機会になった.本書の内容は非常に共感できるし,僕自身新しく気付けたこともあった.何よりも「技術ブログ」に対する様々なアプローチを完璧に言語化されている点が素晴らしく,正直言って「本書って僕が書いたの?」と頭が混乱するほどにシンクロを感じる場面もあった.シンクロ具合を表現するために,過去の登壇資料を並べながらまとめる.

pragprog.com

目次

本書は「技術ブログ」にフォーカスしながら「全5パート」から構成されている.Plan It / Build It / Promote It / Benefit from It / Scale It となり,目次で既に興味を惹かれてしまう!

  • Plan It
    • 1: What Kind of Blog Are You Going to Run?
    • 2: Rock-Solid Planning for Your Blog
  • Build It
    • 3: Setting Up Your Blog
    • 4: Customizing and Fine-Tuning Your Blog
    • 5: Creating Remarkable Content
    • 6: Producing Content Regularly
    • 7: Finding Time to Blog
  • Promote It
    • 8: Promoting Your Blog
    • 9: Understanding Traffic Statistics
    • 10: Building a Community Around Your Blog
  • Benefit from It
    • 11: Advancing Your Career with Blogging
    • 12: Promoting Your Own Business
  • Scale It
    • 13: Scaling Your Blogging Activities
    • 14: Beyond Blogging: Strategizing for Social Media
    • 15: Final Words of Advice

本書は6月に「DevLOVE X」に登壇したときにも資料に載せている.正式に出版されてから書評記事を公開しようと考えていた.

f:id:kakku22:20190807201005p:plain

Plan It 🌟

「Plan It」パートでは,ブログを始める前に準備しておくべき内容がまとまっている.

General vs. Niche

ブログで取り扱うテーマを決めるときに「General(一般)」「Niche(ニッチ)」だったらどちらにするべきだろう?という内容だった.本書では,多くの技術的な内容を表現するなら「General(一般)」だけど,特定の技術に限定した「Niche(ニッチ)」を選べば,テーマが明確になり,ブログを人気にできる可能性が高いと書いてある.僕の kakakakakku blog もそうだけど,個人的には「General(一般)」を選ぶと良いと思う.理由としては,ブログを「自分の学習履歴を残す場 = 外部記憶装置」として使うと効果的だと考えているから.

Identify Your Niche

ブログで取り扱うテーマを決めたら,次に「記事タイトルを10個洗い出す」というステップが紹介されていた.さらに事前に洗い出しておくと「ネタ切れを心配する必要がなくなる」とも書いてある.それな!

まさにブログメンタリングの1日目でメンティと一緒に取り組んでいる内容で,僕の場合は最初に「20個」出してもらって,そこから「30-50個」まで増やしている.ネタの粒度が大きすぎることを指摘できる機会にもなる.

f:id:kakku22:20190807211527p:plain

さらに本書では Google Keyword PlannerGoogle Trends を使って「Niche(ニッチ)」かどうかを調査するテクニックが紹介されていた.Google Trends は比較的よく使うけど,Google Keyword Planner は今まで使ったことがなく,Ad を配信するときに使うツールだけど,確かに検索ボリュームを把握するために使えそうだと思う.本書だと「少なくとも 1ヶ月 10000 以上のキーボリューム」を持っているキーワードをブログのメインテーマにすると良いという指標が載っていた.

f:id:kakku22:20190807212138p:plain

ads.google.com

Build It 🌟

「Build It」パートでは,ブログを構築したり,ブログを書く時間を捻出する内容がまとまっている.

Your Three Main Software Options

ブログを構築する選択肢として,以下の3種類が紹介されている.本書だと WordPress の内容も多くあるけど,個人的にはブログサービスを使って記事を書くことに集中するのが良いと思う.デメリットとして,カスタマイズの自由度が低かったり,サービスにロックインしてしまうと書かれているけど,このあたりはサービスの機能にもよると思う.

  • ホスティング(WordPress など)
  • 静的サイトジェネレーター(Jekyll / Hugo など)
  • ブログサービス

Customize Your Sidebar

ブログにとって「サイドバー」は非常に重要なコンポーネントであるという内容で,サイドバーをカスタマイズするべきと書かれていた.具体的にはサイドバーに検索ボックスを置いたり,カテゴリ一覧を置いたり,人気記事一覧を置いたりする.さらにヒートマップサービスを活用するとサイドバーの分析もできると書かれていた.それな!(2回目)

ブログメンタリングでも「サイドバーの見直し」はメンティによく伝えていて,特に「ファーストビュー」を意識することが重要だと思う.ブログに流入したときに他の記事まで回遊して欲しいし,他にどういう技術系の記事があるのかを知ってもらうこともできる.

Finding Time to Blog

次にブログを書く時間を捻出しよう!というテーマで,具体的には TODO リストを活用したり,仕事など優先順位を明確にしたり,できる限り割り込みを減らしたり,一般的な時間管理術として知られている内容だった.特にカレンダーに「Blogging(ブログ書く)」という予定を入れておくというテクニックは素晴らしく,習慣化に悩んでいる人は取り入れてみると良さそう.さらにポモドーロを使って集中するという内容もあった.ポモドーロが大好きな僕としては「ブログ x ポモドーロ」という話題が出てくることに興奮した!

kakakakakku.hatenablog.com

Promote It 🌟

「Promote It」パートでは,ブログを宣伝することにフォーカスした内容になっている.ウェブマーケティング手法とも言える.本書には多くのブロガーは宣伝をしていないと書いてあるし,ブログを成功させるためには宣伝が必要であるとも書かれている.

Promote Your Articles on Social Networks

Twitter / Facebook など,ソーシャルメディアに積極的にシェアする.サムネイル画像も重要であると書かれていた.また Reddit / Hacker News / DEV Community などに投稿するという海外ならではのアプローチも書かれていた.重要なのは「どんなに素晴らしい記事でも読まれないと埋もれてしまう」ということで,ブログメンタリングでも積極的にシェアしていく大切さを伝えるようにしている.

Understanding Traffic Statistics

ブログのトラフィックを理解するために Google Analytics を導入し,活用するという内容になっている.特に見るべき指標として以下が挙がっていた.例えば「新規ユーザー」が多いと,幅広くリーチしていると言える反面,リピートしてもらえていないという側面もあり,トラフィックを分析するメリットがある.正直言って,僕は以下の全ての指標を Google Analytics でモニタリングしているし,特に「ページ/セッション」を気にしているけど,具体的なアクションプランまで落とし込めていないなと気付けた.ホッテントリに入ると全ての指標が異常値になるし,Google の検索アルゴリズムの変更にも影響を受けるので,例外はありつつも,もう少し分析をしたいと思う.

  • Visit Quantity
    • ページビュー数
    • セッション
  • Visit Quality
    • ユーザー
    • 新規ユーザー
    • 直帰率
    • 平均セッション時間

Keep Track of Your Blog’s Growth

ブログに関連する KPI を Excel / Google Spread Sheet などにまとめるという内容も書いてあった.メンタリングでも毎週 KPI を取得してもらっている.それな!(3回目)

f:id:kakku22:20190807230515p:plain

Benefit from It 🌟

「Benefit from It」パートでは,ブログを書くことで「様々な恩恵を受けられる」という内容がまとまっている.メインは「キャリア的な恩恵」となり,興味のある人のために「マネタイズ」の話も入っている.

Improve Your Skills

まず,ブログを習慣化して書くことにより,ライティングスキルが向上する.また「議論をうまく引き起こすことができるようになる」「情報を広く伝えるインフルエンサーになれる」といった内容もあり,言語化が上手だなと感じた.さらにブログ記事を書くことは「人に教える」ことにも繋がるため,技術的な理解が深まるという恩恵も受けられる.個人的には「ブログを書くモチベーション(フェーズ)」と表現していて,非常に似ていると思う.

f:id:kakku22:20190807221746p:plain

Advance Your Career

キャリア的な観点だと,新しい仕事を見つけられるようになると書いてあった.特に履歴書にブログの URL を載せることで,技術的な興味を伝えられたり,スキルの証明にもなるため「ブログ自体が履歴書になる」という話は共感できる.それな!(4回目)

f:id:kakku22:20190807222431p:plain

Deal with Opportunities

ブログを書き続けていると,多くの人から様々な機会を得られるという話があり,例えば,技術的なアドバイスをしてもらう技術顧問的な機会を得られたり,カンファレンスに登壇する機会を得られたりする.すごく共感できるし,実際に僕自身もカンファレンスに登壇する機会を頂けたことが多くある.また技術書が出版されたときに献本を頂ける機会も最近は増えていて,これも「恩恵を受けている」と言えると思う.

Scale It 🌟

最後の「Scale It」パートでは,ブログの可能性を限界まで伸ばすという内容で,垂直スケールも水平スケールもできると書いてあった.最初に書いてあったのは「ブログをオンラインマガジンに変える」「ブログをニュースサイトに変える」という内容だったり,テクニカルライターを採用するという内容だったり,個人的な興味範囲とは違っていたので,あまり深くまでは読まなかった.

How to Get Your Initial Followers

後半はソーシャルメディアを活用して,どのようにフォロワーを増やすか?という内容で,一部は「Promote It」と似ている.例えば,Twitter などに毎日 10-20 回は投稿するという内容もある.ブログメンタリングでもメンティに「最低1日1ツイートしましょう!」というアドバイスをしている場合もあり,共感できる内容になっていた.

f:id:kakku22:20190807223807p:plain

まとめ

技術ブロガー必読!と言える「Technical Blogging, Second Edition - Amplify Your Influence」を読んだ.「技術ブログ」にフォーカスした本とは言え,300 ページもあり,比較的読むのは大変だった.ブログメンタリングで伝えている内容が網羅的にまとまっているため,今までブログメンタリングで伝えてきたことは正しかったんだな!と暗黙知をうまく整理する機会になって良かった.是非興味があれば読んで欲しいし,技術ブロガー同士で輪読会をしたら絶対に楽しいと思う!

また僕自身,本書の存在に気付いてなく,「分散システムデザインパターン」の出版レビューでお世話になった @dblmkt さんに会ったときに「ブログメンタリングに関連しているから読んでみたら?」と紹介してもらって,β の途中から読み進めていたという経緯がある.本書に出会えて本当に良かった.ありがとうございました!

合わせて読んでもらえると!

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

ドットインストールで「Lua 入門」を受講した

先月に「ngx_http_mirror_module」の検証記事を書いた通り,最近 nginx を調べ直している.次に「lua-nginx-module」を検証する予定だけど,今まで Lua 自体をあまり書いたことがなく,まずは Lua の基礎を学ぶことにした.まさに Yak Shaving!

kakakakakku.hatenablog.com

Lua 環境

今回 Mac を使うため,brew で Lua をインストールする.

$ brew install lua

$ which lua
/usr/local/bin/lua

$ brew info lua | grep stable
lua: stable 5.3.5 (bottled)

$ lua -e 'print(_VERSION)'
Lua 5.3

Lua の Version History を見ると,2015年にリリースされた Lua 5.3 が現在も最新となり,Patch まで含めると,2018年に Lua 5.3.5 がリリースされている.

www.lua.org

エディタは VS Code + Lua Extension にした.

marketplace.visualstudio.com

ドットインストール : Lua 入門 (全17回)

「Lua Reference Manual」などを参考に闇雲に学ぶより,個人的には Step by Step に学びたく,教材を探していたら,なんと「ドットインストール」「Lua 入門」があった!公開日を見るとまさかの「2013年」で,流石に古いかなと思ったけど,Lua のリリースもあまり進んでないこともあり,実際に受講してみることにした.結果的に何も問題なく,Lua 5.3 でも学ぶことができた.

  • 01 : Luaとはなにか?
  • 02 : はじめてのLuaプログラミング
  • 03 : 変数とデータ型について
  • 04 : 数値データを扱ってみよう
  • 05 : 文字列データを扱ってみよう
  • 06 : テーブルデータを扱ってみよう
  • 07 : if文で条件分岐をしてみよう
  • 08 : 条件式をマスターしよう
  • 09 : ループ処理をしてみよう (1)
  • 10 : ループ処理をしてみよう (2)
  • 11 : 関数をつくってみよう (1)
  • 12 : 関数をつくってみよう (2)
  • 13 : 数値の便利な命令を使ってみよう
  • 14 : 文字列の便利な命令を使ってみよう (1)
  • 15 : 文字列の便利な命令を使ってみよう (2)
  • 16 : テーブルの便利な命令を使ってみよう
  • 17 : 日付/時刻の便利な命令を使ってみよう

レッスンごとに写経した Lua コードは GitHub に push してある.今回の記事では全てをまとめるのではなく,個人的に Lua の特徴として印象に残った部分に限定してまとめておこうと思う.

github.com

03 : 変数とデータ型について

Lua で変数を使う場合,以下のように多重代入 (multiple assignments) も実装できる.

x, y = 10, 15
-- 10
print(x)
-- 15
print(y)

06 : テーブルデータを扱ってみよう

Lua の特徴的な機能に「テーブル」がある.配列 / 連想配列 / 構造体に似ていると表現することもできるけど,異なる型を並べることができたり,関数自体を設定することもできたり,幅広く使える.以下の例はシンプルだけど,実行結果は 234 となる.テーブルに対する添字が「"1" 開始」という点は覚えておく必要がありそう.

a = {23, 234, "hello"}
-- 234
print(a[2])

テーブルにキー名を指定したデータを登録する場合,user["name"] のように実装することもできるし,よりシンプルに user.name と実装することもできる.

user = {name = "kakakakakku", score = 120}
-- kakakakakku
print(user["name"])
-- kakakakakku
print(user.name)

10 : ループ処理をしてみよう (2)

テーブルをループする場合,イテレータと呼ばれる ipairspairs を使う.

a = {12, 24, "hey"}
b = {name = "kakakakakku", score = 120}

-- 1   12
-- 2   24
-- 3   hey
for i, value in ipairs(a) do
    print(i, value)
end

-- score   120
-- name    kakakakakku
for i, value in pairs(b) do
    print(i, value)
end

12 : 関数をつくってみよう (2)

Lua の関数には可変長引数 ... を使える.覚えておこう.

function sum(...)
    local a = {...}
    local total = 0
    for i = 1, #a do
        total = total + a[i]
    end
    return total
end

-- 9
-- 26
print(sum(2, 7))
print(sum(2, 7, 8, 9))

まとめ

  • ドットインストールで「Lua 入門」を受講した
    • 2013年に公開されたレッスンだけど,現在でも色褪せず,基礎の基礎を学ぶことができた
  • 今後は Lua Reference Manual を参考により実践的な実装を学んでいく予定

www.lua.org

ドットインストール関連

最近だと textlint のレッスンも受講した.Step by Step に第一歩を踏み出すときにドットインストールは本当に便利!

kakakakakku.hatenablog.com

VS Code 拡張機能を実装する第一歩を踏み出すために「Get Started: Your First Extension」を試した

「VS Code 拡張機能」ってどう実装するんだろう.最近 VS Code を使う場面が多いため,便利な拡張機能にコントリビュートしたり,自分用に拡張機能を作ったりする機会もありそう.さらに今まで TypeScript をほとんど書いたことがなく,書く機会を探していたという側面もある.今回は VS Code ドキュメントに載っている「Get Started: Your First Extension」を試してみた.

code.visualstudio.com

雛形を自動生成する

まず,Yeoman を使って雛形となる「Hello World Sample」を自動生成する.今回はドキュメントの通りに TypeScriptHelloWorld という名前の「VS Code 拡張機能」を作ることにした.

$ npm install -g yo generator-code

$ yo code

     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Visual  │
    |--(o)--|    │   Studio Code Extension  │
   `---------´   │        generator!
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? What type of extension do you want to create? New Extension (TypeScript)
? What's the name of your extension? HelloWorld
? What's the identifier of your extension? helloworld
? What's the description of your extension?
? Initialize a git repository? Yes
? Which package manager to use? npm

自動生成したディレクトリ階層は以下のようになる.

$ tree -L 1
.
├── CHANGELOG.md
├── README.md
├── node_modules
├── out
├── package-lock.json
├── package.json
├── src
├── tsconfig.json
├── tslint.json
└── vsc-extension-quickstart.md

3 directories, 7 files

Extension Development Host ウィンドウ

VS Code で helloworld ディレクトリを開き,さっそく F5 を押すと,拡張機能の動作確認をする「Extension Development Host ウィンドウ」が起動する.次に「コマンドパレット」から「Hello World」を選択すると,画面右下にメッセージが表示される.おおおー!

f:id:kakku22:20190803170008p:plain

src/extension.ts を修正する

src/extension.ts を開くと,画面右下にメッセージを表示する実装を確認できる.

vscode.window.showInformationMessage('Hello World!');

以下のように文字列部分を修正すると,実際に反映された.

vscode.window.showInformationMessage('Hello VS Code!');

ドキュメントに「現在時刻を表示してみよう!」という追加課題もあり,実際に書いてみた.おおおー!

vscode.window.showInformationMessage(new Date().toString());

f:id:kakku22:20190803183523p:plain

拡張機能をデバッグする

VS Code のデバッグ機能を使うと,簡単にステップ実行もできる.これは便利!

f:id:kakku22:20190803224143p:plain

「Get Started: Your First Extension」の内容はここまでとなり,あくまで第一歩ではあるけど,拡張機能をどのように実装し,デバッグするのかを知ることができた点で,非常に価値があった.続くドキュメント「Extension Anatomy」も合わせて読んでおくと良いと思う.

code.visualstudio.com

Contribution Points : contributes.commands

作成した HelloWorld をもう少し変えていく.今回は以下のドキュメント「Contribution Points」を読みながら試してみた.

code.visualstudio.com

package.json の中に定義されている contributes.commandscategory を追加すると,「コマンドパレット」からコマンドを検索するときにカテゴリー表示(カテゴリ名: コマンド名)となる.確かによく使う拡張機能は全部カテゴリー表示になっている.

{
    (中略)
    "contributes": {
        "commands": [
            {
                "command": "extension.helloWorld",
                "title": "Hello World",
                "category": "Hello"
            }
        ]
    },
    (中略)
}

f:id:kakku22:20190803230409p:plain

vscode-extension-samples

以下の GitHub リポジトリに VS Code 拡張機能のサンプルが多く公開されている.今回作成した「Hello World Sample」helloworld-sample ディレクトリにある.他のサンプルを動かしながら拡張機能でできることを把握したり,実装例を確認したり,よく見るリポジトリになりそう.

github.com

まとめ

  • 「VS Code 拡張機能」を実装する第一歩を踏み出してみた
  • 最初は VS Code ドキュメントに載っている「Get Started: Your First Extension」を参考にすると良さそう
  • 今後はサンプル集などを参考に理解を深めていく
  • ブログ関連の拡張機能を作ってみるかなぁー!

アジャイル開発の基礎知識を問う「アジャイルソフトウエア開発技術者検定試験 Lv.1」に合格した

昨日「アジャイルソフトウエア開発技術者検定試験 Lv.1」に合格した.試験問題に関係する内容は NDA を厳守するため書かず,今回は「試験紹介(普及のため!)」にフォーカスする.正直言って,まだまだ知られていない資格だと思う.また,あくまで理解度を証明する「資格」であるため,合格したらすぐにアジャイル開発を実践できるという意味ではなく,あくまでマインドセットを合わせられる程度だとは思う.とは言え,個人的には「アジャイル開発を知る第一歩として」なら価値があるように思う.

agilecert.org

僕自身はアジャイル開発の経験(スクラムマスター含む)が4年ほどあり,さらに「認定スクラムマスター (CSM : Certified ScrumMaster)」も取得しているため,試験対策はほとんどせず,移動時間に試験対策本を Kindle でザッと流し読みした程度となる.試験対策本らしく体系的に書かれていて,入門書としても良いと思う.

アジャイル検定公式テキスト アジャイルソフトウエア開発技術者検定試験 レベル1対応

アジャイル検定公式テキスト アジャイルソフトウエア開発技術者検定試験 レベル1対応

  • 作者: アジャイルソフトウエア開発技術者検定試験コンソーシアム
  • 出版社/メーカー: リックテレコム
  • 発売日: 2017/02/15
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (1件) を見る

アジャイルソフトウエア開発技術者検定試験とは?

「アジャイルソフトウエア開発技術者検定試験(アジャイル検定)」「アジャイルソフトウエア開発技術者検定試験コンソーシアム」が運営している試験で,現在は「Lv.1」「Lv.2」が提供されている.特に「Lv.2」に関しては,今年6月に受験できるようになった新試験となる.近々「Lv.2」も受験してみようと思っている.

試験概要

「アジャイルソフトウエア開発技術者検定試験」の試験概要を公式サイトを引用しながら紹介する.試験は「プロメトリック」で受験する.会場ごとに受験可能日が異なり,予約が取れれば希望日に受験できる.料金は10800円となる.僕は今回慣れた「渋谷会場」で受験した.問題数は「60問」となり,合格ラインが「80%」と公開されているため,単純計算で「48問正解」がボーダーラインとなる.

  • 問題数 : 60問(四肢択一)
  • 試験時間 : 60分
  • 合格ライン : 正解率 80%以上

試験範囲

  • アジャイル開発に対する基礎知識
    • アジャイル・マニフェスト
    • アジャイル原則
  • 開発チームの運営
    • コミュニケーション
    • 自律性と協調
    • ルール
    • 振り返り
  • アジャイル開発プロジェクト管理
    • 会議体
    • ロール(役割)
    • 反復
    • ドキュメント
    • チーム編成
    • 計画
    • 見積り
    • ビジョン
    • 品質
  • アジャイル開発の技能
    • ペアプログラミング
    • リファクタリング
    • 常時結合
    • テスト駆動開発

試験対策

試験対策本以外だと,やはり「アジャイルソフトウェア開発宣言」「アジャイル宣言の背後にある原則」を繰り返し読む.

他は試験対策本に参考文献として載っているアジャイル関連の名著を合わせて読むと効果的だと思う.例えば「アジャイルサムライ」「エクストリームプログラミング」「アジャイルレトロスペクティブズ」など.スクラム関連の名著も多く参考文献に載っているけど,本試験は「アジャイル開発」全般をテーマにするため,スクラム用語は出てこなく,個人的には戸惑う場面もあった.

アジャイルサムライ−達人開発者への道−

アジャイルサムライ−達人開発者への道−

  • 作者: Jonathan Rasmusson,西村直人,角谷信太郎,近藤修平,角掛拓未
  • 出版社/メーカー: オーム社
  • 発売日: 2011/07/16
  • メディア: 単行本(ソフトカバー)
  • 購入: 42人 クリック: 1,991回
  • この商品を含むブログ (257件) を見る

エクストリームプログラミング

エクストリームプログラミング

アジャイルレトロスペクティブズ 強いチームを育てる「ふりかえり」の手引き

アジャイルレトロスペクティブズ 強いチームを育てる「ふりかえり」の手引き

試験結果レポート 🎉

試験を終えると,すぐに試験結果レポートが出る.満点合格できたら良いなぁーと考えていたけど,選択肢の日本語が微妙なものもあり,結果としては「93点」だった.単純計算だと4問間違えているらしく残念だった.どこを間違えたんだろう!

分野 正答率
基礎知識 88%
開発チームの運営 100%
プロジェクト管理 92%
開発技能 92%

まとめ

  • 「アジャイルソフトウエア開発技術者検定試験 Lv.1」に合格した
  • あくまで理解度を証明する「資格」であるため「アジャイル開発を知る第一歩として」なら価値があるように思う
  • 先月から受験できるようになった新試験「Lv.2」も近々受験してみようと思う

小ネタ : Scrum Alliance Certificant Directory

今回の試験とは直接関係ないけど,「認定スクラムマスター」など Scrum Alliance で認定されている場合,Certificant Directory で認定者を検索できる.例えば「Japan x Certified ScrumMaster」だと,既に4000人を超えている!案外知られてなく,小ネタとして紹介しておく.

nginx でリクエストを複製できるモジュール「ngx_http_mirror_module」

nginx でリクエストを複製できるモジュール「ngx_http_mirror_module」を使うと,簡易的な「Shadow Proxy」を構築することができる.例えば,本番環境のリクエストの一部を開発環境に流せるようになる.この「ngx_http_mirror_module」は nginx 1.13.4 で実装された機能で,2017年8月リリースなので,最近のバージョンだとデフォルトで使えるようになっている.今回は「リクエストの複製」を試すため,Docker Compose を使って検証環境を構築した.

nginx.org

検証環境

今回 Docker Compose を使って,nginx と Sinatra を起動する検証環境を構築した.コンテナは計3種類で,以下の構成図にまとめた.基本は FrontendBackend でリクエストを処理し,今回は Mirror にもリクエストを複製する構成にしている.ドキュメントにも記載されている通り,Mirror からのレスポンスは無視される仕様になっている.

  • Frontend (nginx)
  • Backend (Sinatra)
  • Mirror (Sinatra)

f:id:kakku22:20190722223752p:plain

特に設定はなく,すぐに docker-compose up で起動できるようにした.今回エンドポイントは Sinatra で //ping を実装している.なお,Docker Compose の設定などは GitHub に公開した.

$ docker-compose up

$ curl http://localhost
Hello, backend!

$ curl http://localhost/ping
Pong, backend!

github.com

Frontend (nginx)

ドキュメントを参考に nginx.confmirror を設定した.リクエストは proxy_passBackend に転送し,さらに複製されたリクエストは proxy_passMirror に転送される.ポイントは複製用の /mirror ロケーションを内部用にしておくことと,転送先の URL に $request_uri を追加する点で,ドキュメントにも記載されている.なお,デフォルトで mirror_request_bodyon になっているため body も転送される.

location / {
    mirror /mirror;
    proxy_pass http://backend;
}

location /mirror {
    internal;
    proxy_pass http://mirror$request_uri;
}

動作確認

さっそく //ping にリクエストを投げる.

$ curl http://localhost
Hello, backend!

$ curl http://localhost/ping
Pong, backend!

すると,Docker Compose のログに以下のようなアクセスログが出力される.今回 WEBrick のアクセスログは抑止しているため,nginx と Sinatra のアクセスログとなる.そして,期待通りに BackendMirror に転送されていることが確認できる.簡単にリクエストを複製できる「ngx_http_mirror_module」は便利だ!

mirror_1    | 172.22.0.4 - - [22/Jul/2019:13:17:44 +0000] "GET / HTTP/1.1" 200 14 0.0073
backend_1   | 172.22.0.4 - - [22/Jul/2019:13:17:44 +0000] "GET / HTTP/1.1" 200 15 0.0074
frontend_1  | 172.22.0.1 - - [22/Jul/2019:13:17:44 +0000] "GET / HTTP/1.1" 200 14 "-" "curl/7.54.0" "-"

backend_1   | 172.22.0.4 - - [22/Jul/2019:13:18:20 +0000] "GET /ping HTTP/1.1" 200 14 0.0071
mirror_1    | 172.22.0.4 - - [22/Jul/2019:13:18:20 +0000] "GET /ping HTTP/1.1" 200 14 0.0118
frontend_1  | 172.22.0.1 - - [22/Jul/2019:13:18:20 +0000] "GET /ping HTTP/1.1" 200 14 "-" "curl/7.54.0" "-"

nginx : resolver 127.0.0.11

検証中にうまくリクエストを Mirror に転送できず,nginx から出力される no resolver defined to resolve mirror というエラーに悩まされていた.実際に出力されていたエラーは以下となる.

frontend_1  | 2019/07/22 13:28:06 [error] 6#6: *3 no resolver defined to resolve mirror, client: 172.22.0.1, server: localhost, request: "GET / HTTP/1.1", subrequest: "/mirror", host: "localhost"
frontend_1  | 2019/07/22 13:28:11 [error] 6#6: *1 no resolver defined to resolve mirror, client: 172.22.0.1, server: localhost, request: "GET /ping HTTP/1.1", subrequest: "/mirror", host: "localhost"

調査したところ,Docker の Embedded DNS に関係していることに気付き,今回は nginx.confresolver を指定して解決をした.Embedded DNS の詳細は以下のドキュメントに載っている.正直結構ハマった!

server {
    (中略)
    resolver 127.0.0.11;
    (中略)
}

docs.docker.com

まとめ

nginx でリクエストを複製できるモジュール「ngx_http_mirror_module」を試した.簡易的な「Shadow Proxy」を構築することができる.今回は Docker Compose を使って検証環境を構築して,疎通確認をしたけど,トラフィックを増やした場合に複製による負荷がどの程度なのか,追加で検証してみたいと思う.