職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

関西モバイルアプリ研究会 #関モバ 第19回 に参加

関西モバイルアプリ研究会(通称 関モバ)の第19回に参加してきました。

kanmoba.connpass.com

会場

今回の会場は、このブログなどでもお世話になっている 株式会社はてな さんの京都オフィス!
本当によくお世話になってます。
はてな記法 にも、結構長いことお世話になっています。このブログ「職業プログラマの休日出勤」も はてな記法 で書いています。

自分で発表した内容

某所において先日、サーバ復旧したと思ったらすぐに再び落ちたという事象を目の当たりにしたことから、この話をしようと思いました。
そのサーバはモバイルアプリのバックエンドではないですし、「再び落ちた」原因もアクセス集中ではなかったのですが、やはりモバイルアプリの世界では多いのはこのスライドの中で紹介しているパターンだろうなーと思っています。

終盤の まとめ のページに掲載している言葉「サーバ管理者に優しい言葉をかけ続けると綺麗なAPI設計が返ってくる」は完全にネタですが、そこまで外していないような気もします。
あと、「札束」が強力な武器であることは誰もが理解しているはずなのですが、企業の会議室の中においては無かったことにされるケースもよく耳にしますので、敢えて言及しました。

対策の例として Exponential Backoff を紹介しましたが、このような考え方が素晴らしいモバイルアプリ開発につながっていったら、非常に嬉しいです。

さいごに

はてなの皆さん、運営の皆さん、参加者の皆さんに感謝!

v6喋る串

「これからはIPv6の時代だ!」そんなふうに考えていた時期が筆者にもありました。確か2005年頃の話だったかと思います。

それから10数年の時が流れ、世の中は未だにIPv4だらけです。人生の進捗もダメなままです。
そんな折、某所でIPv6の需要が急激に高まってきたので、久し振りにIPv6と戯れてみました。

今回のお題は「v6喋る串」、平たく言えば「IPv4だけ喋るクライアントからの HTTP Request を、IPv6な HTTP Server へ送るプロクシ」です。こんなものの需要はほとんど無いでしょうけれども、手元の環境はIPv4の回線しか無いけどIPv6での接続確認も取りたい!という検証用には非常に有用でしょう。

IPv6 アドレスを容易に獲得できるインフラ

AWSでのIPv6サポートは(本記事執筆時点では)限定的なものであり、EC2のサーバに直接IPv6アドレスを割り付けることはできないようです。今回の検証にはAWSを使うことはできません。
AWSに匹敵するほど我々に身近なサーバ屋さんの中でIPv6対応を謳っているのは、さくらインターネットさんの「さくらのVPS」と「さくらのクラウド」です。今回はこれらのお世話になりつつ実験を進めたいと思います。

この記事では さくらのVPSさくらのクラウド の両方を使っていますが、おそらく片方だけを2環境用意するという方法でも上手く行くでしょう。
「どちらを使ったら良いの?」という方には、ただ単に実験するだけなら さくらのクラウド の方がオススメです。長期的に使い続けて、かつ、負荷の程度が見えている状況なら さくらのVPS の方が良いでしょう。クラウドの方はクレカ必須であるように見えるので、持っていないという方はご注意を。さくらのクラウド の場合は後述の「ルーター+スイッチ」が最低でも3500円程度/月・1ネットワーク、VPSの場合は初期費用が1600円程度/月・1台 かかるので、いずれにせよ実験するために5000円くらい使うことになります。

筆者が用意した環境

IPv4 / IPv6 両方喋る HTTP Server : Debian

Apacheのセットアップ

たぶん sudo apt-get install apache2 とかやれば、Apacheは入るでしょう。
とりあえず、インストールした後にアクセスして、テスト用ページが表示されることと、アクセスログが吐かれることを確認しましょう。アクセスログは、後でIPv6のアクセスを受け付けるようになったときに、接続確認にも使います。今はIPv4でのアクセスログが吐かれていることでしょう。

eth0 で IPv6 を有効に

さくらのVPS のコンパネにアクセスすると、

を教えてくれるので、その情報を /etc/network/interfaces に書き込み、サーバ再起動します(恐らく、ネットワーク関係のサービスだけ再起動しても有効なはずだけど、調べるのが面倒臭くてサーバ再起動してましたw)。
詳しい書き方や動作検証の方法などは、こんな解説もあるので参考にしましょう。

さくらVPS で IPv6 アドレスを Debian 7 wheezy に設定する – ymyzk’s blog

ip6tables

基本的な考え方は通常のIPv4での iptables と同じです。ですが、IPv4 で効いていた設定が効かなかったり、指定したらエラーを吐いて設定を食ってくれないということが非常に多くありました。今回の検証の中で、筆者が最も時間を費やしてしまったのはこの部分です。
最終的にはこんな設定を /etc/iptables/rules.v6 に書き込みましたが、まだザルだらけなので改善の余地は大いにあります。

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:LOG_PINGDEATH - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -j DROP
-A FORWARD -m limit --limit 1/sec -j LOG --log-prefix "[IPTABLES6 FORWARD] : "
-A FORWARD -j DROP
-A OUTPUT -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
-A OUTPUT -p udp -m multiport --sports 135,137,138,139,445 -j DROP
COMMIT

どうも -m のオプションが機能していないような感覚がありますが、裏づけまでは取れていません。

こうやって書いた設定を有効にするにはroot権限で netfilter-persistent reload を実行していました(Debianです)。実行後、反映されるまでには数秒〜10秒程度の遅延がありました。

DNS設定

構築したHTTPサーバはIPv4アドレスとIPv6アドレスの両方がありますので、両方ともドメインのAレコード、AAAAレコードとしてDNSサーバに設定しましょう。


これで、IPv4 / IPv6 の両方で接続を受け付ける HTTP Server が完成したはずです。
以下の串の動作確認を効率的に行うべく、アクセスログを監視しておきましょう。tail -fなどで。

さて、さくらのクラウドのお世話になりながら、串をセットアップしていきましょう。冒頭に記載しました通り、Ubuntu 16.04 を使っています。

さくらのクラウドIPv6を使うためのテクニック

実は、さくらのクラウドで立てるサーバを単体で使っても、IPv6アドレスを獲得することはできません。
ルーター+スイッチ」を設置し、そこでIPv6を有効にし、その状態でサーバを新設してルーター+スイッチに接続させる必要があります。

このとき、サーバを共有セグメントで立ち上げた後でルーター+スイッチに接続しようとすると、IP(v4, v6)アドレスがDHCP的な仕組みではなくて静的にOS内に設定されていることから、後でそれを書き換えるための手間が増えます。サーバ起動よりも先にルーター+スイッチを用意しておくことで、少なくともIPv4アドレスについては何もしなくて良くなります。

IPv6を有効にするには、/etc/network/interfaces に以下の内容を追記し、サーバ再起動します(これも恐らく、ネットワーク関連のサービスの再起動だけでも行けるはず)。

iface eth0 inet6 static
address 2401:2500:***(ヒミツ)***
netmask 64
gateway fe80::1

ここで address の値は、ルーター+スイッチの詳細情報「IPv6割当可能範囲」を参考にして、他のサーバと衝突しないように自分で勝手に付けます。

Squid の設定

root権限で apt-get install squid みたいなコマンドを打てば、squid をインストールすることができます。
設定ファイルは /etc/squid/squid.conf に置いてあるので、バックアップを取った上で編集し、

acl theowner src ${自分のIPv4アドレス}/32
http_access allow theowner

という設定を先頭の方に差し込みましょう。設定ファイルの下の方に http_access deny all という一節がありますが、恐らくここよりも上に書いていれば良いのでしょう(下に書くことを検証してはいません)。best-practiceとしては、別のファイルに設定を書いておき、それをincludeして使う形が望ましいですが、ちょっと検証するだけのサーバならどうでもいいでしょう。

ip6tables

前述の、Debianで設定した時と考え方は同じです。
(ですが、筆者はここで 座流・咳百合亭 という大技を繰り出しましたとさ…orz)
長期的に設置したり、大事な情報を置いたりすることになるサーバなら、きちんと設定しましょう。v4に関しては さくらのクラウド のパケットフィルタ機能で制御できるようです。

Outgoing の IPv4 を殺す

恐らく、ここまでの手順を踏むだけで HTTP Proxy サーバとしては十分に機能するはずです。
お手元のブラウザまたはOSのプロクシ設定を、ここで建てた串に向けます。
(※squidのデフォルトポートは 3128 です)
この状態で、冒頭で建てたHTTPサーバへアクセスすると、きちんと IPv6 でのアクセスが記録されます。良かったですね!

実は、squid がプロクシとして動作するとき、IPv6IPv4の両方で HTTP Server にアクセスできるのならば、IPv6 を優先して使うという挙動を取ります。
[squid-users] Outgoing IPv6 address with no IPv4 address accessSquidメーリングリストに、2015年に投稿されている情報)
IPv6で HTTP Server に接続することが目的なら、この挙動を信じて、これ以上作業をする必要はありません。
もしも「IPv6でなければエラーにしたい」のであれば、iptablesをいじって、串からの outgoing の HTTP(S) のパケットを破棄すれば良いでしょう。iptablesの設定で「DROP」だとやたら待たされるでしょうから「REJECT」が良いでしょう。

参考図書

マスタリングTCP/IP IPv6編 第2版

マスタリングTCP/IP IPv6編 第2版

IPv6 エッセンシャルズ 第2版

IPv6 エッセンシャルズ 第2版

IPv6教科書 (インプレス標準教科書シリーズ)

IPv6教科書 (インプレス標準教科書シリーズ)

IPv6の本って、ちょっと古いのが多い気がしますが、理論を学ぶ上ではそれほど問題は無いでしょう。

さいごに

この記事の内容を応用すれば「IPv4しか喋れない HTTP Server に、IPv6しか喋れないクライアントからのリクエストを連携してあげるリバースプロクシ」も作ることができるでしょう。お試しあれ。
これから来るかもしれない IPv6 の時代、一足お先に慣れておき、数年後に楽をしようではありませんか。

麻疹風疹(MR)混合ワクチンの接種

8月に麻疹(はしか)日本国内発生のニュースが流れてきて、その後も発症例が増加しているという話を受けて、麻疹・風疹混合ワクチン(MRワクチン)の接種を受けてきた。



ワクチン接種を受ける意義

何故受けた方が良いか?について筆者が適当に語るコーナー。


基本的にはこういう思考である。

世代的な話

1977年4月2日~1990年4月1日に生まれた世代は1回接種法であり、キャッチアップキャンペーン非対象だった。免疫がついていない可能性が高く、最も感染の危険が高い年代。

https://ja.wikipedia.org/wiki/%E9%BA%BB%E7%96%B9#.E4.BA.88.E9.98.B2

ヤバそうである。

事業継続計画(BCP

筆者の勤め先においても 1977年度〜1989年度生まれ の人は非常に多く、麻疹の大規模な流行があれば従業員の健康のみでなく、事業継続そのものが脅かされることも考えられる。


リモートワークが整備されていたとしても、潜伏期間が長い、かつ、潜伏期間でも感染力のある伝染病 という存在には弱い、という話はおそらく正しい。だけど整備されていないよりは整備されている方が良いに決まっている。伝染病への合理的な対策というのは打っておくに越したことはない。

筆者の業務の一つであるサーバ管理、こういう仕事は、誰か一人以上の人間が活動できる状態であることが強く求められる。そんな中でサーバ管理者全員が麻疹で倒れたりしたら、鯖缶本人やその家族たちだけでなく事業も傾く。怖い話だ。



ワクチン接種を受けるための活動

冒頭に掲げたtweetをした9月1日より、接種についての情報を集め始めた。しかし、接種の情報の多くは子供達(の保護者)に向けたものであり、成人が接種を受けることを主目的にした情報はほとんど手に入らなかった。接種実施の病院の一覧も、簡単には手に入らないようである(筆者は結局入手することができなかった)。

やっぱり接種を受けるのは無理なのだろうか?と思いながら、数年前に一度お世話になった内科の先生のWebサイトを見てみると、そこにはMRワクチン接種をやっていることが明記されていたため、電話で問合せた。予約も予想外にすんなりと取ることができた(9月5日時点)。
電話で喋った感じだと、医院では通常は在庫を持たず、予約を受けてから業者さんから仕入れるような感じだった。電話問い合わせから接種までの間には数営業日を空ける必要があった。

そして予約していた日に病院に行くと…、なんと接種を見送りされてしまった。理由は筆者自身の風邪。自分では大丈夫なつもりだったが、先生の判断だから仕方がない。
通常の手当てを受けてから数日が経過した今日、無事に接種を受けることができた。費用は1万円とちょっとくらいだった。

これから受ける皆さんへ

筆者が接種を受けた病院の先生曰く

  • 卸売りの業者さんのところにも、そんなに在庫は残ってないし、入ってこないようである
  • ワクチンは病原体を培養して製造されるという性質から、いきなり増産できるようなものではない
  • 病院への問い合わせは増えてきている

という話だったので、今年中の接種は難しいかもしれない。健闘を祈る。

CloudWatch Logs のログを華麗に読む CWLReader を公開

CWLReader という小さなソフトウェアを公開しました。

github.com

解決しようとした課題

AWS でいろいろ運用している皆さんの多くは、各種ログを CloudWatch Logs へ溜め込んでいることでしょう。
ログの内容に不審な点があれば通知を投げるといった仕組みも一緒に設けられていることが多いと思いますが、特に立ち上げ間もないシステムの場合は、人力で全てのエラーログに目を通すことは重要です。何故なら、どういったログがどのように出ていれば通知を投げれば良いのかという知見が蓄積されていないからです。

そこでログを見る訳ですが、公式の CloudWatch Logs のツールだと、「どこまで読んだ」という情報が管理されないため、全てのログを漏れなく見るためには、自分でその情報を管理する必要があります。

CWLReader の特徴

  • ログを見る権限だけの IAM ユーザを用意し、そのキーを使ってログを取得できる
  • IAM ユーザのキーは、ブラウザの LocalStorage で管理される
  • 「どこまで読んだ」の情報は、LogGroup ごとに、これも LocalStorage で管理される
  • ログの続きを読もうとするとき、前回の「どこまで読んだ」の情報に基づいて続きからロードできる
  • ファイル1個で稼働する
    • file:// で読ませることも可能だけど、これは LocalStorage の内容を他のスクリプトに読まれる危険性があるのでオススメはできない

さいごに

何かお気付きの点などございましたら、issue を上げて頂きますと嬉しいです。
英語書くのしんどいよ〜という方は、Twitterで連絡下さい(ブロックしてたらゴメンなさい)。

第24回 #シェル芸 勉強会に参加してきました

タイトルの通りです。今回も大阪サテライトに参加しました。

本家
usptomo.doorkeeper.jp

大阪サテライト
atnd.org

Togetterまとめ
togetter.com

問題 【問題のみ】第24回◯◯o◯裏番組シェル芸勉強会 – 上田ブログ
問題+解答例 【問題と解答】第24回◯◯o◯裏番組シェル芸勉強会 – 上田ブログ

この日の自分の tweet T.Motooka(@t_motooka)/2016年08月27日 - Twilog
シェル芸とは無関係の発言も含んでいるとは言え、149tweetsもしており、不健全な感じがします。

続きを読む