TerraformでGitHubのチーム管理を自動化して事故った話

はじめまして。
ICTトラブルシューティングコンテストの実行委員をやっている黒崎 (@kuro_m88) です。
学生時代に第3回の運営をやり、社会人になってからは運営学生のサポートをしています。

ICTトラブルシューティングコンテスト(以下ICTSC)とは、学生による、学生のためのインフラ技術コンテストです。
来月の2016年8月27日 にNTT西日本杯 第6回 ICTトラブルシューティングコンテストが大阪で開催されます。
トラコンに関する過去のツチノコエントリーは以下をご参照ください。

ツチノコブログICTSCエントリ集

TerraformでGitHubのチーム管理を自動化してみた

ICTSCでは出題に利用するコードや出題する問題案の管理をGitHubを利用して行っています。
https://github.com/ictsc

ICTSCに携わる学生や社会人は基本的にこのGitHub Organizationに入っているのですが、回によって運営に携わる学生も違います。
第4回だけ運営だった人もいれば、第4回, 第5回は運営だったけど、第6回は競技者として参加するといったケースもあります。

ICTSCのGitHub Organizationに入っている人は今回で50人くらいになるので、誰が第何回の運営だったかぱっと把握するのが難しくなってきました。

一番簡単なのはその回の運営に関係ない人をOrganizationからはずすことなのですが、せっかく運営に関わってくれたのにはずすのも寂しいなと思い、ユーザ管理をある程度自動化できないかなと思い立った訳です。(課金体系が変わったら運用方法を考えないといけませんが…)

Terraform GitHub Provider

その頃会社でTerraformを使い始めたので、GitHubも同じような感じで管理できないかなー?と調べてみると…!

なんと、Terraform GitHub Providerがあるではないですか…!🎉
https://www.terraform.io/docs/providers/github/index.html

これを使えばGitHubのOrganizationの

  • メンバー管理
  • チーム管理
  • チームのメンバー管理
  • リポジトリの権限管理

ができるようです。やりたい操作が全部用意されていました!!

ドキュメントを読みながら、こんな感じのものを作ってみました。
https://github.com/ictsc/ictsc-github-member

簡単に説明しますと、まずICTSCのGitHub Organizationのメンバーをここで定義します。
ictsc-github-member/members.tf

次に、チームを作ります。例えば第6回の運営参加メンバーはICTSC6というチームに所属させます。
また、そのチームが読み書きできるリポジトリも定義しています。
ictsc-github-member/team-ictsc6.tf

過去の運営チーム(ICTSC5等)のチームはプライベートリポジトリを見られないようにしています。
ictsc-github-member/team-ictsc5.tf

最後にこれらの操作をCircle CIで自動化できるようにします。
こんな感じの設定ファイルを書きました。
ictsc-github-member/circle.yml

運用方法

ICTSCのチームメンバに追加して欲しい人はプルリクエストを投げます。
https://github.com/ictsc/ictsc-github-member/pull/40

(ちなみに、彼は第5回の運営委員で、第6回は運営ではなく競技者として参加するのでこのプルリクエストは拒否します)

このリポジトリはpublicですが、マージする権限があるのは実行委員(社会人サポートチーム)の人だけなので、レビューののち production ブランチにマージするとCircleCI上でterraform applyが走り記述したとおりの権限がメンバーに与えられます👍

いい感じですね!👏

事故は突然に

github_membership.membership_for_kurochanという名前が冗長に感じたのでmembership_for_を取り払ってgithub_membership.kurochanのような書き方に統一したくなったので統一しました。

terraform planで変更内容を確認して、terraform applyしてみました。以下がその時のログです。

$ ~/terraform/terraform apply --var-file=conf/github.tfvars
github_membership.membership_for_kurochan: Refreshing state... (ID: ictsc:kurochan)
github_membership.membership_for_kurochan: Destroying...
github_membership.netmarkjp: Creating...
role: "" → "admin"
username: "" → "netmarkjp"
github_membership.kurochan: Creating...
role: "" → "admin"
username: "" → "kurochan"
github_membership.membership_for_kyontan: Destruction complete
github_membership.membership_for_kurochan: Destruction complete
github_membership.netmarkjp: Creation complete
github_membership.kurochan: Creation complete

コマンドの実行も成功し、当時管理者権限を持っていた僕ともう一名のアカウント設定の名前が、変更されています。
うんうん、ちゃんとうまく行ったようです。

ひととおり仕組みを作ったので学生に自慢しようと思った矢先、GitHubから一通の不穏なメールが…😨

!?!?

誰かに僕のアカウントの管理者権限が外されたようです。

せっかくterraformで管理しているのでもう一度terraform applyしてみましょう。

2 error(s) occurred:

* github_membership.netmarkjp: PUT https://api.github.com/orgs/ictsc/memberships/netmarkjp: 403 You must be an admin to add or update an organization membership. []
* github_membership.kurochan: PUT https://api.github.com/orgs/ictsc/memberships/kurochan: 403 You must be an admin to add or update an organization membership. []

Terraform does not automatically rollback in the face of errors.

403 You must be an admin to add or update an organization membership.

🔥🔥なんかやばそう!!🔥🔥

とりあえずもう一人の管理者権限を持っている方に僕を管理者に戻すようにお願いしました。

えっ、もうこれはどうしようもないのでは…😇

そしてだれもいなくなった…

管理者権限のあるユーザ全員(自分含め)から権限を剥奪してしまったようです。
誰一人管理者がいない状態なので、復旧のしようがありません。
学生にドヤ顔するつもりがなんと説明すればいいのか分からない状態になりました…。こんなことってあるのか…😱

困ったときの神頼み

どうしようもなくなったので神様(サポート)に連絡するしかありません。
自分の英語力で通じるのか自信なかったですがとりあえず連絡…

すると

よかった…回復してもらえそうです。

どうしてこうなったのか

最初のログを見ると一見成功したように見えます。
ただ、2度目実行した時には権限がなくなっていてエラーになっていたので、APIコールした瞬間はすくなくとも権限を持っていたようです。

ここからは僕の想像なので本当にこうなっていたのか分かりませんが、例えばGitHub側が

こんな感じの権限の更新の処理が非同期に行われる仕組みになっていたとしたらTerraformのように高速でAPIを叩くアプリケーションを実行した場合、今回ような事故が起きそうです。。

対策

Terraformを実行する用のユーザを作成しました。
このユーザに管理者権限をもたせ、このユーザのアカウントに関してはTerraformの管理外としました。
これで自分で自分の権限を剥奪するような事故は起きないはずです。

教訓

terraform planはあくまでも実行計画を表示するだけであって、実際に適用したら成功するかどうかは別の話で保証されないということを身を持って経験しました…。
実行される内容が問題ないかしっかり確認してから適用しましょう。。(以後気をつけます)

さいごに

ICTトラブルシューティングコンテストではこのような実際の経験を元にしたトラブルの問題を運営学生がたくさん作っています!
次回コンテストも面白い(つらい?)トラブルが出題されると思いますのでご期待ください!!

Illustrator初心者がツチノコブログステッカーを作成してみた

SONY DSC

ドーモ、arimoです。

このたびステッカー作成大使に任命されまして、IllustratorというAdobeのソフトを駆使して発注するまでのまとめをつづります。

今回発注した商品はこれです。http://www.graphic.jp/lineup/ondemand/sticker.php
入稿から5営業日で発送してくれるのですごいです。
作り方の注意はhttp://www.graphic.jp/technical/data_goods/sticker.phpに書いてありますがよくわからない。

0,準備編

スクリーンショット 2016-06-29 16.03.19

まずステッカーにしたいロゴのaiデータがあります。ない場合はどうしようもないのでがんばって発掘するか、ご自身で作ってください。

スクリーンショット 2016-06-29 16.03.57

ウィンドウ>レイヤーでレイヤーウィンドウを表示させて、右下のゴミ箱の隣の新規レイヤー作成ボタンを2回押してレイヤーを2つ作ります。

レイヤー名のところをダブルクリックして、デザイン(元のai)、ホワイト版、カットパスと名前を変えてわかりやすくします。

透明塩ビのステッカーを作る際にホワイト版というものがないと、白くしたいところが透明になってしまうので作る必要があります。たとえばチーノくんの目玉とかです。チーノくんの目玉が透明になると貼ったときにかなり恐ろしい仕上がりになります。ホワイト版といいつつ黒いシルエットのような画像のレイヤーです。

カットパスというのはシールをはがすときの切り込み線です。

1,ホワイト版レイヤーにロゴをコピーします

スクリーンショット 2016-06-29 16.06.53

デザインレイヤーにいる状態で、command+Aで全選択するか、左上の黒い矢印(選択ツール)をクリックして全体を囲うようにドラッグします。
すると全部のオブジェクトが選択されている状態になるので、command+Cまたは編集>コピーでコピーします。

レイヤーパネルで「ホワイト版」をクリックして、編集>同じ位置にペーストをすると、同じ位置にロゴがコピーされます。

2,ごちゃごちゃしたところをくっつけて、黒くしてホワイト版を作る

スクリーンショット 2016-06-29 16.15.09

ごちゃごちゃしたチーノくんのところを黒い矢印(選択ツール)で選択します。

線とか色とかがいっぱいあってわけがわからないところはとりあえず選択します。shiftを押しながらクリックすると選択が追加されたり、選択が解除されたりします。

スクリーンショット 2016-06-29 17.46.01

ウィンドウ>パスファインダーでパスファインダーパネルを表示させて、一番左上の四角が2個くっついているアイコンをクリックします。

スクリーンショット 2016-06-29 16.15.42

選択したところがくっつきました。色を黒にしなければならないので左下の色四角と白斜線があるところの色四角(ここではピンク)の部分をダブルクリックします。カラーピッカーで黒にします。

スクリーンショット 2016-06-29 16.15.56

「ツチノコブログ」の部分も選択ツールで選択して先ほどと同じようにカラーピッカーから黒にします。

スクリーンショット 2016-06-29 16.16.22

3,ホワイト版をグレースケールに変換して確認します

グレースケールでないとダメだとサイトに書いてあったのでいちおうグレースケールに変換します。
黒い部分を全部選択した状態で、編集>カラーを編集>グレースケールに変換

スクリーンショット 2016-06-29 16.17.43

ウィンドウ>カラーでカラーウィンドウを表示させ、

スクリーンショット 2016-06-29 16.18.06

カラーの下の四角が斜線と黒と白のみになっていることを確認します。

スクリーンショット 2016-06-29 16.18.15

レイヤーの順番をカットパス、デザイン、ホワイト版の順にします。ドラッグで重なり順が変えられます。

スクリーンショット 2016-06-29 16.18.46

チーノくんとロゴを別々に処理しないで、最初から全部選択してパスファインダーでくっつければいいじゃんと思っていたのですが、そうするとDMMのDの穴とブログのロの穴も埋まってしまうので、分けています。(Dとロの穴は透明にしたいためホワイト版がいらない)

4,地道にカットパスを作ってシールの切れ込みを指定する

スクリーンショット 2016-06-29 16.19.22

手順1と同様に、「カットパス」レイヤーに「ホワイト版」レイヤーを全選択したものをコピー、同じ位置にペーストをします。

わかりやすいように「デザイン」と「ホワイト版」のレイヤーの左側にある目玉アイコンをクリックして、非表示にしておきます。

スクリーンショット 2016-06-29 18.03.34

オブジェクト>パス>パスのオフセットを選択し、

スクリーンショット 2016-06-29 16.25.45

オフセット2mm(ロゴの位置から2mmぐらいのところを切り取り線にしたいため。用途に応じて変えてください)

角の形状をラウンドにしてOKを押します。

スクリーンショット 2016-06-29 16.25.53

モコモコしたのができます。

左下の色四角と白斜線があるところの入れ替え矢印を押します。

スクリーンショット 2016-06-29 18.08.15

モコモコの何かが線と中身に分かれます。再度選択ツールで全選択して、オブジェクト>グループ解除をします。

スクリーンショット 2016-06-29 16.26.23

中身だけを選択ツールで選択し、deleteボタンで削除していきます。

スクリーンショット 2016-06-29 16.27.00

ポチポチ消していって、こんなかんじでモコモコの線だけになります。線は削除しないように気をつけてください。

線だけになったら全選択して、パスファインダーで一番左上の四角が2個くっついているアイコンをクリックします。

スクリーンショット 2016-06-29 17.46.01

スクリーンショット 2016-06-29 16.27.44

カットパスの原型ができました。

5,カットパスの整形をする

Dのところに余分な線があるので「アンカーポイントの削除ツール」で削除します。

選択ツールの2つ下にあるペンツールを長押しするとマイナスのついたペン先が出てくるのでそれでアンカーポイントをクリックして消していきます。

image1

白い四角を探して、ポチポチ。いずれ消えます。

 

スクリーンショット 2016-06-29 16.29.59

こういう鋭利なところや込み入ったところがあると、うまくカットできないのでアンカーポイントの削除ツールでなめらかにします。

スクリーンショット 2016-06-29 16.30.19

数個アンカーポイントを削除するとこんな感じでなめらかになります。

気になる部分を削除してきれいにします。

スクリーンショット 2016-06-29 18.27.31

「デザイン」レイヤーと「ホワイト版」レイヤーの左にある目玉を表示させて保存して、完成です!

 

サーバセットアップの強い味方、ノートパソコン接続KVMコンソールの紹介

最近ギックリ腰(筋膜炎)で腰の大切さ、ありがたさを実感したトウマツです。こんにちは。
今回は、便利ツールを見つけましたので、みなさまに紹介したいと思います。

DMM.comラボは、DMM.comのサービスを快適にご利用いただくために、毎日のようにサーバを増設しています。

このサーバ増設には、サーバに対してIPアドレス等の初期設定をする為に、キーボード、ディスプレイ、マウスの3点セットが必要となる場合があります。
しかし、これらは大きく、重く、そしてかさばるので持ち運びに適さず、ギックリ腰の僕には苦行です。また、ディスプレイは電源を必要とするため200V供給のみのラックでは電源の確保も一苦労なのです。

というわけで、そんな悩みを解決してくれそうなツールを探してみたところ、良さげなツールを発見したので実際にどんな使い方が出来るのかを試してみました。

ノートパソコン接続KVMコンソール
http://www.startech.com/jp/Server-Management/KVM-Switches/USB-Crash-Cart-Adapter~NOTECONS02

CrashCartAdapter単体

 

実際にMacBook Pro‎とノートパソコン接続KVMコンソールを接続し、サーバをセットアップしてみるの図

CrashCartAdapter全体

 

このノートパソコン接続KVMコンソールをノートパソコンに接続して専用アプリケーションを起動すると、ノートパソコンのキーボードとマウスの入力信号をサーバにそのまま転送し、サーバから出力されるビデオ出力をノートパソコンの画面上に表示します。
つまり、従来サーバの初期設定に必要であったキーボード、ディスプレイ、マウスは不要となり、ノートパソコン1台とこのノートパソコン接続KVMコンソールのみ持っていけば済むのです。

ノートパソコン接続KVMコンソールの専用アプリケーションは、Mac OS XやWindowsにはもちろん、Linuxにも対応しています。また操作画面の録画機能を搭載していたり、USB CD-ROMに見せかけてISOイメージを読み込ませたりできるなど、「現場」で必要な機能が詰まっており、DMM.comラボのサーバデータセンタチームでも評判のツールの一つです。

というわけで、今後も面白そう、便利そうなツールをどんどん紹介していきますのでよろしくお願いします。

 

※こちらから購入しました@2015/12/02時点 $323.99
KVM Console to USB 2.0 Portable Laptop Crash Cart Adapter
(もちろんアフェリエイトではありません)