Masteries

技術的なことや仕事に関することを書いていきます.

Dockerコンテナの中でいい感じにCartonしたい

Dockerで建てたコンテナの上でPerlのWebサービスを開発している場合, 例えばテストを実行するとき等はコンテナ上で実行する必要があります. そういった時, 皆さんはどうしていますか?

例えばdocker-composeでコンテナ群を立ち上げていて, PerlのWebサービスがappというコンテナで動いている時, 次のような選択肢があると思います:

  • docker-compose exec app carton ...する
  • docker-compose exec app /bin/shでコンテナの中に入り, carton ...する

...これでも全然良いのですけれど, とはいえ個人的には面倒という気持ちがあります. やはり, 無意識にこれまで通りcartonでコマンドを実行をすると, 自動的にDockerコンテナの中で実行されて欲しい!!!

...と考えた結果, このようなスクリプトが生まれました.

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;

my $cmd;
my $argv = join ' ', @ARGV;

if ($ENV{'DISABLE_DOCKER'}) {
    $cmd = sprintf(q{$(plenv which carton) %s}, $argv);
} else {
    my $plack_env = $ENV{'PLACK_ENV'} || 'local';
    my $env       = join ' ', map { sprintf('%s=%s', $_, $ENV{$_}) } grep { $_ =~ /^PLACK_ENV$/ } keys %ENV;

    my @commands = 'carton';

    unshift @commands, $env if $env;
    push @commands, $argv if $argv;

    $cmd = sprintf(q{PLACK_ENV=%s docker-compose exec app /bin/sh -c '%s'}, $plack_env, join(' ', @commands));
    print "exec: $cmd\n";
}

exec $cmd;

あとはこのスクリプトをcartonとして呼び出せるようにしてあげればOKで, 例えばcarton exec prove tとすると,

PLACK_ENV=local docker-compose exec app /bin/sh -c 'PLACK_ENV=local carton exec prove t'

というコマンドが実行されます. もしDockerコンテナの中で実行したくないならば, DISABLE_DOCKER=1を付けて実行すればOK.

...ね, 簡単でしょう?


ちなみに, Dockerを使っている時だけこのcartonのラッパースクリプトを使いたい, という時はdirenvを使うと便利です. 例えば, このスクリプトが /path/to/script に設置されていて, /path/to/script/carton で使えるようになっているなら,

export PATH=/path/to/script:$PATH

という感じで.envrcを設置しれあげれば, そのディレクトリ下でのみ, cartonのラッパースクリプトが使われるようになります.

papix.hatenablog.com

EdgeRouter Xで/etc/hostsを変更する

EdgeRouter Xにはdnsmasqが載っています. dnsmasqは, /etc/hostsに書かれたルールに従ってDNSクエリに反応してくれるので, つまりEdgeRouter Xの/etc/hostsを書き換えれば, 家庭内ネットワークにある端末の名前解決をすることができます.

※そのためにはもちろん, LAN内における端末のIPを固定する必要があります. その辺りの手順はこちらのページが参考になります:

yabe.jp

/etc/hostsを変更する

EdgeRouter Xの/etc/hostsを書き換えたい場合, 直接/etc/hostsを変更するのではなく, 次のようにstatic-host-mappingコマンドで設定する必要があります: コマンド > configure > system - EdgeOS 日本語Wiki [非公式]

# set system static-host-mapping host-name [host] inet [ip addr]

例えば, test.homeというホスト名を192.168.1.10というIPで登録したい場合, 次のようにします.

$ configure
# set system static-host-mapping host-name test.home inet 192.168.1.10
# commit
# save

こうすることで, /etc/hostsにも設定が追加され, LAN内にある端末から, test.home192.168.1.10というIPアドレスを引くことができるようになります.

現在の設定を確認する/削除する

setではなく, showとすることで, 現在のstatic-host-mappingの設定を見ることができます.

# show system static-host-mapping

また, deleteで既存の設定を削除することができます.

# delete system static-host-mapping host-name [host]

参考にしたページ

qiita.com

EdgeRouter Xで公開鍵を使ってログインする

ちょっと... というか, だいぶ前に id:hoto17296 などと一緒にEdgeRouter Xを購入していました.

EdgeRouter Xは, ネットワーク機器ベンチャーUbiquiti Networksというところが開発しているルータ製品の1つで, 安価なわりに高機能で評判... らしく, いつか遊べると良いのでは? ということで買っていたのでした.

詳しくはこちらのサイトを見て下さい. 様々な設定手順とかも紹介されていて便利です:

yabe.jp

で, 買ってから半年くらいは, 単純にルータとして使っていたのですが, 流石に勿体無いし, そろそろ本腰入れていろいろやってみるか... ということで, この土日にいろいろやっていました. その中で幾つか知見があったので, ちまちまとではありますが, まとめて公開していこうと思います.

公開鍵を使ってログインする

EdgeRouter Xはブラウザから設定することもできますが, sshコマンドでEdgeRouter XにログインしてCLIで各種設定をすることもできます(EdgeRouter Xには, ネットワーク機器向けOSであるVyattaの派生版であるEdgeOSが載っています).

デフォルトだと, パスワードログインとなっていて「流石にナ〜」と思ったので, 公開鍵を使ってログインできるようにしました. とはいえ, 概ねここに書かれている通りにやればOK: SSH login with RSA keys on Vyatta/EdgeOS

$ configure
# loadkey <user> /path/to/id_rsa.pub
# commit
# save

適当な場所(上の例では/path/to/id_rsa.pub)に公開鍵を設置してコマンドを実行します. なお, <user> にはその公開鍵を使いたいユーザー名を入れます.

...ちなみに直接authorized_keysに追加した場合, ファームウェアアップデートなどで消えてしまったりするそうなので, 上記の手順で設定する必要があります.

注意点

ここで設置して読み込ませる公開鍵は, コメント部分が必要になります. というのも, loadkey コマンドの実装が, 公開鍵を半角スペースでsplitしたときに(このsplitはPerlのsplitです, なんとloadkeyを実行すると内部でPerlのスクリプトが動いていました), 3つの要素が存在しない場合エラーになるからです.

...というわけで,

ssh-rsa <...key...>

こういった形で公開鍵を用意するとダメで,

ssh-rsa <...key...> comment

このように, 適当なコメント(上記の例ではcommentのところ)を書いた上で読み込ませる必要があります. 最初, コメントがない状態で読み込ませようとして延々とエラーになり, 20分くらいロスしました...

パスワードログインを無効にする

さて, これでEdgeRouter Xに公開鍵を使ってログイン出来るようになりました. 続いて, パスワードログインの機能を無効にしましょう.

$ configure
# set service ssh disable-password-authentication
# commit
# save

で, OKです.

Mackerel Drink Up #6で, 「はてなブログにおけるMackerel活用術」というLTをしました

本日開催されたMackerel Drink Up #6で, 「はてなブログにおけるMackerel活用術」というLTをしました.

mackerelio.connpass.com

資料はこちらです.

speakerdeck.com

Mackerelは「サーバーの監視SaaS」として捉えられる事が多いですが, それ以外にも「サーバーの管理」, 「サービスの定期的な振り返り」, 「サービスに起こったイベントの記録(グラフアノテーション)」, 「サービスや開発チームの状況の可視化(サービスメトリック)」などなど, 様々な目的で利用できるツールだと思っています.

発表資料の中に登場するMackerel活用事例は, ほとんどがチームメンバーが試行錯誤の末に構築したものではあるのものの, 資料としてまとめているうちに「こういう使い方も出来そうでは?」といった気付きがあったので, 機会があれば実践してみたいですね.

引き続き, こういった形でMackerelの活用術など共有していきたいですし, いろいろな会社, いろいろなチームが工夫を凝らしながらMackerelを活用していると思うので, そういった知見もどんどん吸収して, はてなブログの開発に活かしていきたいと思います!

「Mackerel サーバ監視 [実践] 入門」発売中ですね!

www.songmu.jp

id:Songmu さんのブログでも紹介されている通り, 「Mackerel サーバ監視 [実践] 入門」が発売中です!

Mackerel サーバ監視[実践]入門

Mackerel サーバ監視[実践]入門

  • 作者: 井上大輔,粕谷大輔,杉山広通,田中慎司,坪内佑樹,松木雅幸
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/08/26
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

この本は, Software Designで連載されていた「Mackerelではじめるサーバ管理」を本にまとめたものになっています. 著者欄に自分の名前はないのですが, 実は自分が前職時代にこの連載に寄稿した, Mackerel活用術の記事が「付録」として掲載されていたりしますので, 興味を持った方は是非ご一読頂ければ幸いです.

Mackerelは, もはやインフラ監視/管理の基盤と言って差し支えないSaaSだと思っていて, 自分自身はてなブログというサービスを開発/運営するという業務の中で, バリバリ活用しています. …というLTを, 近々開催される「Mackerel Drink Up #6 Osaka」で出来た良いなと思っておりますので, こちらも是非(便乗宣伝).

mackerelio.connpass.com