mixi engineer blog

ミクシィ・グループで、実際に開発に携わっているエンジニア達が執筆している公式ブログです。様々なサービスの開発や運用を行っていく際に得た技術情報から採用情報まで、有益な情報を幅広く取り扱っています。

新卒研修の受講レポート~データベース編~

17新卒エンジニアデータベース研修

今回は、XFLAG事業本部 SREグループの清水さん(@isaoshimizu)によるデータベース研修で学んだことについて、新卒エンジニアの左野と坂本がレポートしていきます。

f:id:mixi_engineers:20170627180122j:plain

↑研修中の様子です

研修内容

講義は以下の内容で進んでいきました! - MySQLの基本的な話 - データベースの基本的な話 - インデックス - 負荷対策 - 運用の話 - 演習

今回は研修内容については深く掘り下げませんが、研修を受けて得られた学びと感想について私たちが感じたことを書いていきます!

今年の新卒が使ったことのあるフレームワーク

1位. Ruby on Rails

2位. Sinatra

3位. FuelPHP

いきなり蛇足ですが、研修前に扱ったことがあるフレームワークについて事前にアンケートがありまして、Ruby on Railsが人気のようでした。ORMはActive Recordが人気でした。

照合順序と寿司とビールの話

前半は、MySQLを題材にデータベースの基礎的な部分について学習しました。ACID特性やトランザクション、正規化、インデックスなどです。聞いた話の中で印象に残ったのは、寿司ビール問題と言われているもので、例えばMySQLで設定しているUnicodeの照合順序によっては🍣や🍺などの絵文字が同一扱いになったりならなかったりする問題です。詳しくは以下の記事が参考になります。

MySQL と寿司ビール問題 - かみぽわーる http://blog.kamipo.net/entry/2015/03/23/093052

インデックスの話

わたくし坂本は、過去にMySQLを利用したサービスの開発やISUCONに参加したことがあるのですが、その際、速度向上を狙いインデックスを貼ることがありました。しかし実際にインデックスがどのように作用して速度向上するのか、ということは全く理解せずにインデックスを追加していました。 今回の研修では改めてインデックスの挙動について学ぶことが出来ました。 例えば、「関数や式、否定構文、LIKEではインデックスは効かない(LIKEの前方一致では効く)」「LIMIT OFFSETはとても遅いのでWHEREで絞り込むと良い」などの注意すべき点を教わりました。これまでは、こういった点を知らずにクエリを発行していましたが、今後はどのようなクエリを発行するのか、学んだことを踏まえたインデックス設計を行いたいと思いました。

演習してみた話

最後に、演習として実際に効率の良いクエリ発行ができるか、の確認をしました。 データセットとしては、 https://github.com/datacharmer/test_db 内の employees.sql を利用しました。

演習1

USE employees;
SELECT SQL_NO_CACHE * FROM employees WHERE hire_date = '1985-02-01' AND birth_date = '1963-08-02';

このクエリを実行すると全件スキャンがおこなわれ、検索に時間がかかります。 最も短い時間で検索が行われるように工夫してください。

まずは、このまま実行をするとどうなるのかを確認します。

mysql> SELECT SQL_NO_CACHE * FROM employees WHERE hire_date = '1985-02-01' AND birth_date = '1963-08-02';
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  20539 | 1963-08-02 | Poorav     | Gecsei    | M      | 1985-02-01 |
+--------+------------+------------+-----------+--------+------------+
1 row in set (0.13 sec)

この時点で0.13secかかっており既に遅いということが分かります。実際にどの程度スキャンされているのかを explain を用いて確認します。

mysql> explain SELECT SQL_NO_CACHE * FROM employees WHERE hire_date = '1985-02-01' AND birth_date = '1963-08-02';
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table     | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | employees | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 299290 |     1.00 | Using where |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

rows の項目を見ると分かるように、30万件近いスキャンが走っていることが分かります。

この場合は、インデックスを追加することでスキャンする数を減らすことができます。 今回はインデックスを hire_date に追加します。

mysql> alter table employees add index hire_date_index(hire_date);
Query OK, 0 rows affected (0.48 sec)
Records: 0  Duplicates: 0  Warnings: 0

その後、同じクエリを実行すると以下のようになります。

mysql> SELECT SQL_NO_CACHE * FROM employees WHERE hire_date = '1985-02-01' AND birth_date = '1963-08-02';
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  20539 | 1963-08-02 | Poorav     | Gecsei    | M      | 1985-02-01 |
+--------+------------+------------+-----------+--------+------------+
1 row in set (0.01 sec)

最初0.13secかかっていた時間が、0.01secまで短縮できました!explainでスキャン数も確認してみます。

mysql> explain SELECT SQL_NO_CACHE * FROM employees WHERE hire_date = '1985-02-01' AND birth_date = '1963-08-02';
+----+-------------+-----------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------------+
| id | select_type | table     | partitions | type | possible_keys   | key             | key_len | ref   | rows | filtered | Extra       |
+----+-------------+-----------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------------+
|  1 | SIMPLE      | employees | NULL       | ref  | hire_date_index | hire_date_index | 3       | const |   15 |    10.00 | Using where |
+----+-------------+-----------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

30万件近くスキャンしていたのが、15件まで減らすことができました! key を見ると先程設定した hire_date_index が利用されていることも確認できました。

演習2

次の演習は以下のような課題です

USE employees;
SELECT SQL_NO_CACHE * FROM employees WHERE birth_date > '1959-01-01' ORDER BY hire_date LIMIT 5;

上のクエリを実行すると、ファイルソートが発生して検索速度が遅いことが分かります。ファイルソートが起きないように工夫をしてみましょう。

mysql> SELECT SQL_NO_CACHE * FROM employees WHERE birth_date > '1959-01-01' ORDER BY hire_date LIMIT 5;
+--------+------------+-------------+-----------+--------+------------+
| emp_no | birth_date | first_name  | last_name | gender | hire_date  |
+--------+------------+-------------+-----------+--------+------------+
| 111400 | 1959-11-09 | Arie        | Staelin   | M      | 1985-01-01 |
| 110725 | 1961-03-14 | Peternela   | Onuegbe   | F      | 1985-01-01 |
| 111035 | 1962-02-24 | Przemyslawa | Kaelbling | M      | 1985-01-01 |
| 110085 | 1959-10-28 | Ebru        | Alpin     | M      | 1985-01-01 |
|  87761 | 1960-08-19 | Shir        | Munck     | F      | 1985-02-01 |
+--------+------------+-------------+-----------+--------+------------+
5 rows in set (0.14 sec)

実行結果です。0.14 sec とクエリが遅いことが確認できました。EXPLAINを使ってクエリを確認してみましょう。

mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM employees WHERE birth_date > '1959-01-01' ORDER BY hire_date LIMIT 5;
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
| id | select_type | table     | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra                       |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
|  1 | SIMPLE      | employees | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 299157 |    33.33 | Using where; Using filesort |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
1 row in set, 1 warning (0.00 sec)

ここで Extra という項目に注目してみましょう。Using filesort からファイルソートが発生していることが確認できます。これはテーブルにインデックスが存在しないために ORDER BY で指定されたソートを行うためのメモリ使用量が増加しており、一時的な記憶領域としてファイルを利用するためクエリが遅くなります。1つ目の演習と同じように hire_date にインデックスを追加してみましょう。

mysql> alter table employees add index index_name(hire_date);
Query OK, 0 rows affected (0.40 sec)
Records: 0  Duplicates: 0  Warnings: 0

再びクエリを実行してみます。

mysql> SELECT SQL_NO_CACHE * FROM employees WHERE birth_date > '1959-01-01' ORDER BY hire_date LIMIT 5;
+--------+------------+-------------+-----------+--------+------------+
| emp_no | birth_date | first_name  | last_name | gender | hire_date  |
+--------+------------+-------------+-----------+--------+------------+
| 110085 | 1959-10-28 | Ebru        | Alpin     | M      | 1985-01-01 |
| 110725 | 1961-03-14 | Peternela   | Onuegbe   | F      | 1985-01-01 |
| 111035 | 1962-02-24 | Przemyslawa | Kaelbling | M      | 1985-01-01 |
| 111400 | 1959-11-09 | Arie        | Staelin   | M      | 1985-01-01 |
|  20539 | 1963-08-02 | Poorav      | Gecsei    | M      | 1985-02-01 |
+--------+------------+-------------+-----------+--------+------------+
5 rows in set (0.00 sec)

0.00 sec まで改善できました。EXPLAINでファイルソートが起きていないか確認してみましょう。

mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM employees WHERE birth_date > '1959-01-01' ORDER BY hire_date LIMIT 5;
+----+-------------+-----------+------------+-------+---------------+------------+---------+------+------+----------+-------------+
| id | select_type | table     | partitions | type  | possible_keys | key        | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-----------+------------+-------+---------------+------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | employees | NULL       | index | NULL          | index_name | 3       | NULL |    5 |    33.33 | Using where |
+----+-------------+-----------+------------+-------+---------------+------------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

Using filesort が消えてファイルソートが起きなくなったことを確認できました。

感想

坂本: 今までデータベースについていろいろなアンチパターンや高速化について勉強をしてきましたが、今回の研修を通じて体系的に学べたおかげで点と点が線になり、今後につながる学びが得られたと思います。今後は、業務で役に立つようにさらに勉強を重ねて自分の武器となるようにしていきたいです。

左野: 今回の研修ではデータベースについて知らないことばかりだと痛感しました。データベースの知識は業務で欠かせないものになると思うので、講義資料を読み込んで勉強していきます。

git challengeの自動採点高速化に向けたインフラのハナシ

git challengeのインフラを担当している2016年度新卒エンジニアの轟 (@tdrk18) と、2017年度新卒エンジニアでSREの見習いをやっております佐藤 (@jtwp470) です。今回は、git challengeという技術競技イベントの自動採点の高速化に向けたインフラのお話です。

続きを読む

伝承進化し続ける技術イベント: git challenge開催記念インタビュー

こんにちは、ミクシィグループ 人事部です。

今回で第6回目*1を迎える、競技型技術イベント「git challenge (ギット・チャレンジ)」開催にあたり、運営に携わるエンジニア社員の国分さんと轟さんにお話を聞いてきました。
過去5回の大会を振り返るとともに、git challengeへの想いを語っていただきます。 #mixi_git

 

f:id:mixi_engineers:20170727135539j:plain 

続きを読む

新卒研修受講レポート~テスト編~

はじめまして、17新卒エンジニアの村上と林です。

今回は「テスト」という「プログラムが正しく動作しているかチェックするためのプログラム」についての研修を受けたので、まとめていきたいと思います。

 

本研修の内容は以下のようなものでした。

・テスト/設計についての簡単な講義

・ペアプログラミングでの実習

  • 車窓からのTDD
  • 円の面積を求めるプログラムをTDD
  • emailアドレスの正誤判定プログラムをTDD

 

テストについての簡単な講義

 

テスト研修の目的

まず、なんでこんな事やるの?という事で、研修の目的について述べたいと思います。

研修の目的は「良い設計を覚える」、これだけです。

 

良い設計ってなんなの?

そこで、良い設計とは?となると思います。

疎結合?可読性?

色々あると思いますが

「経営的な要求・条件に応えられること」です!

経営判断としてスピードが求められる場合には可読性よりも開発スピードを優先する場合もあります。良い設計に重要なものはその時の状況によって変わるということです。

 

しかしながら、突然のメンバー変更や仕様変更などが往々にして発生し、保守しづらいコードでは何をしているのかよく分からなくなるため、結果的に保守しやすい設計の方が(引き継ぎなども含めて)開発スピードが早くなります。

なので今回の研修では「保守のしやすさ」に焦点を当てます。

 

いい(保守しやすい)設計方法

保守しやすい設計方法として、テスト駆動開発(test-driven development:TDD)を利用します。この手法では、大きく3段階の手順を踏みます。

  1. テストを書く
  2. テストを失敗させる
  3. 実装してテストを成功させる

この3つの手順を実施することにより保守しやすい設計になります。


TDDのメリット

メリットは以下の3点です。

・テストを先に書くので、テストしづらいコードを書けない

・テストしやすいコードは疎結合で副作用もなく分岐も少ない

・この作業をやっていくと自然に保守しやすい設計になる

 

ペアプログラミングでの実習

ここまでの講義内容をペアプロで実践しました!

(※ペアプログラミング: 2人でプログラミングすること。常に片方がレビューをやっているので様々なメリットがある)

f:id:mixi_engineers:20170510162530j:plain

車窓からのTDD

「車窓からのTDD」はweb上に公開されており、内容としても簡単なのでTDDを体験してみたい方はリンク先を確認してみてください!

http://objectclub.jp/technicaldoc/testing/stack_tdd.pdf

 

「車窓からのTDD」には対話形式でTDDのやり方が書かれており、手順通りに進めていくだけで良いため、手始めのTDDの理解にとても役立ちました。

 

「車窓からのTDD」はスタックを構築するだけの簡単な内容で、上記したTDDの流れの通り、テスト作成し失敗、実装、再度テストを実行させ成功、のサイクルで行います。これはTDDでは基本の流れになります。今回の研修では、各自経験のある言語(RubyやPythonなど)で作業を進めていきましたが、どの言語でも基本の流れを抑えれば大丈夫です。

 

テストを書いてから実装をするので、実装の目的が明確になることで無駄なコードが減り綺麗なコードになると感じました。


円の面積を求めるプログラムをTDD

この課題では、「標準入力経由で円の半径が渡されるので、円の面積を求め四捨五入して整数に丸める」というプログラムを書いていきました。

入力が外から入ってくるため入力値に対するテストが必要になります。

この課題の採点が一回しか行われないという条件だったため、絶対に正解するように多くのテストを書きました。

(テストケースをたくさん書いて置くことで途中でコードの間違いを素早く見つけることができました。間違いなく実装するという点においてもすごくテストが役に立ち、重要なんだと実感しました!)

 

また、今回の課題でのポイントは標準入力でデータが渡ってくるという点です。テスト(今回の場合ユニットテスト)はロジックだけをテストしたいので依存性がないものが理想です。標準入力に依存しないように、スタブやモックオブジェクトで切り離す方が良いでしょう。

 

emailアドレスの正誤判定プログラムをTDD

「emailアドレスが"RFC5312 addr-spec"の部分的な仕様として正当なものであればok、違えばng」のテストを作成しました。

今回の場合、大量のテストケース(ngになるメールアドレス、okなメールアドレス)が必要になります。

なので、どのテストケースで失敗したかを分かりやすくする工夫が必要でした。

 

テストの速度は上げつつ、どこで失敗したかを判別したいのですが様々な方法があるようです。Rubyの黒魔術的な方法もあるようですが、後日調べたところこのような書き方もあるようです。

qiita.com

 (テスト書いててどんなテストケースあるかなってなったとき、キレイに書いてると「このケースもあったな」となりやすいので、保守性と速度が確保されると感じました)

 

まとめ

今回の研修ではテストの重要性について学びました。

保守しやすい設計で、引き継ぎの方や後輩達に、先輩はいいコード書くやろ?ってドヤ顔しましょう!!!!

新卒研修受講レポート~セキュリティ編~

こんにちは。2017年新卒エンジニアの追田と服部です。

本記事では、4月におこなわれた新卒エンジニア向けのセキュリティ研修の大まかな概要や感想を受講者の立場からお伝えしたいと思います。

講師はXFLAG事業本部 たんぽぽGの亀山さんです。

 

内容

研修は以下の3部構成で実施されました。 

  1. セキュリティの必要性や脆弱性とその対策についての説明
  2. WebGoat(研修用やられサイト)を用いた実習
  3. スマートフォンゲームのチート事情についての解説


1. セキュリティの必要性や脆弱性とその対策についての説明
まず、企業が情報セキュリティ上の過失によって個人情報漏洩などの事故を起こしてしまった場合、どのような影響が考えられるでしょうか。
その企業の信頼の低下やイメージダウンを招いてしまうことはもちろん、それに伴う業績悪化や対応費用によって数百億円規模の損失を計上してしまう場合もあります。

本研修では過去に発生した実際のセキュリティ事故の事例を知るとともに、具体的な脆弱性の対策手法について学びました。

脆弱性の攻撃手法で最も有名なものと言えばSQLインジェクションが思い浮かぶかと思いますが、ウェブアプリケーションエンジニアが気を付けるべき脆弱性はこれ以外にも数多くあります。
IPA(情報処理推進機構)が公開している「安全なウェブサイトの作り方」によると、攻撃手法は以下の11種類に分類され、それぞれについて適切な対策をとる必要があります。

1. SQLインジェクション
2. OSコマンド・インジェクション
3. パス名パラメータの未チェック/ディレクトリ・トラバーサル
4. セッション管理の不備
5. クロスサイト・スクリプティング
6. CSRF(クロスサイト・リクエスト・フォージェリ)
7. HTTPヘッダ・インジェクション
8. メールヘッダ・インジェクション
9. クリックジャッキング
10. バッファオーバーフロー
11. アクセス制御や認可制御の欠落

次のセクションでは、研修用に用意された実際のWebサイトを攻撃することを通してこれら脆弱性を対策することの重要性を学んでいきました。

2. WebGoat(研修用やられサイト)を用いた実習
ここでは、WebGoatと呼ばれる練習用Webサイトを攻撃することで前述の様々な種類の脆弱性について手を動かしながら学びました。

f:id:mixi_engineers:20170510162020j:plain

攻撃手法についてですが、例えばBurp Suiteという脆弱性診断ツールを用いるとHTTP通信のキャプチャやリクエスト内容の書き換えを簡単に行うことができます。※悪用は厳禁です!

3. スマートフォンゲームのチート事情についての解説
ここからは、講師の亀山さんの専門分野でもあるスマートフォンゲームにおけるチートに関するお話を聞きました。
日本最大級のユーザー数を誇る、スマホアプリである「モンスターストライク」のチート対策について、実際にセキュリティエンジニアからお話を聞くことができるのはミクシィの研修ならではのことです。

資料の一部はXFLAGサイトのブログでも公開されていますので、興味のある方はぜひご覧ください。
スマートフォンゲームのチート事情(@ITセキュリティセミナー)|XFLAG ケタハズレな冒険を。
 

当日の様子(感想) 

当日印象的だったハプニングがあります。この研修ではWebGoatを使って脆弱性のあるWebサイトを攻撃してその防御手段を学ぶのですが、研修用のサーバがトラブルによってうまく動かなくなってしまったのです。

 

そんな時に同期がDockerのWebGoatイメージがあることを発見して、それぞれのPCにそのイメージを用いたDockerコンテナを立てることを立案しました。新卒同士助け合いながらそれぞれのマシンにWebGoatのDockerコンテナを立てて無事にトラブルを乗り切りました。その時は同期のチームワークを強く感じ、トラブルを通じて研修の士気が高まりました!

f:id:mixi_engineers:20170510162053j:plain

1.セキュリティの必要性や、脆弱性とその対策についての説明

 

Webサイトを作る上で脆弱性を意識して開発することの重要性はわかっていたつもりでした。しかし、これまでに起きたセキュリティ事故の事例やその被害規模を紹介されると、認識が甘かったなと感じると同時にどのようにすればセキュリティ事故を防ぐことができるのか俄然関心が高まりました!

中でもセキュリティ事故と株価の関係が紹介された時が一番盛り上がっていましたね(笑)。

 

2.WebGoat(研修用やられサイト)を用いた実習

 

Webサイトを攻撃するというのは本当なら犯罪ですが、今回はWebGoatという攻撃用のWebサイトなので安心して攻撃することができました(笑)。

このWebGoat、攻撃手法ごとに問題を解いていくようにできており、その問題量も膨大で研修時間で全て解くことは不可能なので、私は、

 

1.SQLインジェクション

2.XSS(クロスサイトスクリプティング)

 

の2つに絞って問題を解き進めました。

 

どちらも有名な攻撃手法ですが、実際に攻撃者側に立ってみて攻撃してみると、意外と簡単に情報の入手や改ざんができてしまうものだと感じました。

 

攻撃手法に詳しくなくてもネット上の情報があれば、意味を理解していなくても簡単にWebサイトを攻撃できてしまいます。攻撃が簡単にできてしまうからこそ、常に防御のことを考えてアプリケーション開発をしなくてはいけないのだなと改めて感じました。

 

3.スマートフォンゲームのチート事情についての解説

 

Webサイトに対する攻撃は多少なりとも知っていましたが、昨今のスマホゲームのチート事情がどうなっているのかは恥ずかしながら知りませんでした。

 

しかし、チートに利用できるツールが出回っており、メモリの値を書き換えたり通信内容を改変することによって簡単にできてしまうことがわかりました。ツールさえあれば中学生でも簡単にチートすることは可能です。だからこそ、しっかりと対策を練らなければいけないのだなと痛感しました。

 

ゲームの不正行為で狙われやすい箇所はおおまかに、

1.メモリデータ

2.ストレージデータ

3.ロジック

4.通信

5.操作

と分類され、データ改変や操作の自動化などが行われる可能性があります。

 

例えば、メモリデータの改変はチートでもメジャーな手法なのですが、今回弊社のモンスターストライク(以下、モンスト)を題材に考えてみます。

 

モンストでは、ガチャを引く際「オーブ」というアイテムを使用します。現在10個のオーブを所持しているとします。

不正ユーザはこのメモリ上の10という数値をプロセスメモリエディタというツールを使って数値を999に改変し、オーブを不正に増やそうとするかもしれません。

 

では、この場合どのような対策が考えられるでしょうか?

 

-メモリ上の値を暗号化する

-計算に利用する数量をクライアント側に持たない

 

など、考えられる対策はいくつかあります。

 

この時大切なのは、選んだ対策はそもそもの目的との折り合いがつく対策であるのか、などを考えしっかりと吟味することです。

 

また、サーバの処理はほぼ手出しができないので、近い将来クラウドゲーミングのように処理の大半をサーバ上で行うようになれば昨今のチート手法はほぼ無意味となるかもしれません。

 

しかし、現状はスマホ側でゲーム処理を行うケースも少なくないため、これらのポイントを押さえた対策が必要となります(操作の自動化は厳密にはチートではないが不正行為を目的に行われる事もある)。

 

また開発時は面白さや快適さを重視するので、Webアプリほどセキュリティに意識が向かないことが課題として挙がっていたことに納得すると同時に、難しさも感じました。

ゲーム開発者としてユーザに対してワクワク感を提供することを第一に考えたいけれども、そうするとセキュリティがおろそかになってしまうというジレンマは辛いものです。

 

まとめ

今回の研修では座学のみならず、実際に攻撃してみることでWebアプリを開発する上でのセキュリティの重要性を実感することができました。

 

また、昨今巷を賑わせているスマホゲームのチート対策も学ぶことができます。

アプリからゲームまで様々なセキュリティを取り扱う研修はなかなか珍しいのではないでしょうか。

 

Amazon EC2 リザーブドインスタンスの利用状況をDatadogで監視する(AWS Summit Tokyo 2017 で発表してきました)

はじめまして。北村です。
 
先日行われた AWS Summit Tokyo 2017 で、Datadog 様の EXPO セッション枠の一部を頂いて SNS「mixi」における Datadog 活用事例について紹介させていただきました。

speakerdeck.com

今回は、その発表の中で紹介させていただいた EC2 リザーブドインスタンスの管理・購入を支援する以下の自作ツールについて紹介をしたいと思います。

github.com

ツールの概要

先にツールの概要を解説しますと AWS の API から得られた EC2 インスタンスの稼働状況とリザーブドインスタンス契約情報を集計し

  • 稼働中のインスタンス数
  • 有効なリザーブドインスタンス数
  • オンデマンドインスタンス数
  • 未使用状態のリザーブドインスタンス数

以上の推移を、Datadog 上でリアルタイムで可視化するというインスタンス集計プログラムとなります。

ここで、Datadog について簡単に紹介しますと「クラウド型のサーバ監視ツール」となっております。AWS 移行のタイミングで SNS「mixi」には導入しており、日々活用させていただいています。

www.datadoghq.com

Datadog は「多機能かつ柔軟なグラフ機能、ダッシュボード機能を持つこと」に加えて「カスタムメトリクスと呼ばれるユーザ定義のメトリクスを利用することで、自由な数値を簡単に可視化ができること」が非常に魅力的なサービスです。
今回のツールでも、その機能を利用し、集計した各数値をカスタムメトリクスで Datadog に送信することで可視化を実現しています。
 

f:id:mixi_engineers:20170612112154p:plain

 
Datadog で描画したサンプルグラフ(数値はダミーです)がこちらとなっています。
 

f:id:mixi_engineers:20170608135048p:plain

これは、t2.medium のインスタンス数の推移を可視化させた例となっており、以下の推移が分かると思います。
  • Running Instances (稼働中のインスタンス数)
  • Reserved Instances(リザーブドインスタンス数)
  • Unused Reserved Instances(未利用状態のリザーブドインスタンス数)
  • On-demand Instances(オンデマンドインスタンス数)
グラフ中央付近のタイミングで13台のリザーブドインスタンスを購入しているのですが、それによって各値が変動していることも分かると思います。

ツール作成のモチベーション

AWS で EC2 を利用されている方ならば、リザーブドインスタンスの利用検討を少なからずしているのではないかと思います。
オンデマンドインスタンスをリザーブドインスタンスに切り替えることで、最低1年の利用コミットが発生してしまいますが、オンデマンドインスタンスよりも最大75%引きの値段でEC2を利用することができるからです(詳しくは AWS のサイトを参照していただければと思います)。
 
SNS「mixi」は長年オンプレミスで運用してきましたが、2015年よりほとんどのサーバを AWS に移行を行いました。
オンプレミスからの移行ということもあり EC2 が非常に多く、リザーブドインスタンスを積極的に活用することで大きなコスト削減を実現しています。
 
しかしながら、移行が進むにつれてインスタンス数が増え、インスタンスタイプも増えてくるとリザーブドインスタンス契約の管理が煩雑になってきて
  • 一体どれだけのオンデマンドインスタンスが存在しているのか?
  • リザーブドインスタンス契約数は適切であるのか?
  • 余っているリザーブドインスタンスはないのか?
を把握するのが苦しくなってきました。
 
中には AutoScaling であったり、平日昼間、逆に夜中にしか稼働させていないサーバも混在しており、1日の EC2 の台数の上下が激しくなっています。
これもリザーブドインスタンス契約の判断を複雑にしています。
 
リザーブドインスタンスの利用状況はAWSコンソールの「EC2レポート」を参照すると把握することができるのですが、以下のデメリットがあります。
  • リアルタイムではない(1〜3日の遅延)
    以下は「EC2レポート」で直近のインスタンス使用状況を表示させた例となっています。直近の2日間は値が完全に取れていないことが分かります。このため、リザーブドインスタンスの過不足状態を確認するまで時間がかかってしまいます。

    f:id:mixi_engineers:20170612113459p:plain

  • 時間毎の詳細な利用状況が分からない(利用状況が1日でまるめられてしまう)
    • なので、未使用リザーブドインスタンスがあったとしても、まるまる1日余っているのか、一定時間だけ余っているのか分からない状態になっています
    • AWS Detailed Billing Reports を参照すると分かりますが、別途集計処理が必要になってしまいます
 
そこで、AWS の API よりインスタンスの利用状況を取得、集計し、リアルタイムで Datadog で可視化してしまおう!というのが、今回の紹介させていただいたツール作成のモチベーションでした。
 
このツールを活用することで SNS「mixi」では複数のリザーブドインスタンス契約の管理に加え、リザーブドインスタンス契約判断を行っています。

おわりに

AWS Summit Tokyo 2017 のセッションでは以上のツール紹介に加えて、なぜ Datadog を選択し導入したのかについても紹介させていただきました。
当日は多くの魅力的なセッションがあるなか、足を運んでいただいた方もいらっしゃり、大変ありがたかったです!
 
また、最後になりましたが Datadog 様には、このような機会を与えてくださり、ありがとうございました。Datadog 様からは Datadog ロゴが刺繍されたパーカーをプレゼントしていただきました。American Giant というサンフランシスコのアパレルスタートアップ製のパーカーで自分も大好きなメーカーです。
セッション当日は、嬉しくて、パーカーを着るには暑い日でしたが汗をかきながら着用して発表させていただいたのもいい思い出です。
 

f:id:mixi_engineers:20170608135654j:plain

 
最後まで読んで頂きありがとうございました!

PyCon JP 2016 にダイヤモンドスポンサーとして参加してきました。

はじめまして、株式会社フンザの尾関と申します。

普段はチケットキャンプのサーバサイドをPython/Djangoで開発しています。
趣味はドローンでの空撮です。

エンジニアブログですが、技術的な話は特にありません。すみません。

 

9/21, 9/22の2日間、PyCon JP 2016という日本最大のPythonistaが集うカンファレンスに参加してきました。

 

当社では創業時からチケットキャンプのサーバサイドをDjangoで開発しており、我々のビジネスができているのも全てPythonという存在のおかげ!という思いもありまして、その恩返しとしてダイヤモンドスポンサーとして出資させていただきました。

 

個人的には、2013年と2015年に一般で参加したので雰囲気は分かっていましたが、今回はスポンサーとしてブースを出す!ということでまた違った視点から参加できました。

 

もちろん、ブースを出すからには、フンザという会社を知ってもらいたい!チケットキャンプを知ってもらいたい!いい人がいれば採用につなげたい!という目的があり、それを全面に打ち出すブースづくりを心がけました。

↓設営の様子

f:id:mixi_engineers:20160929190420j:plain

 

このあたりは、我々のようにイベント慣れしていない担当者が、初めてブースを出すことになった場合の参考に少しでもなればいいなと思って書いています。

と言っても、我々も反省点だらけでまだまだ改善の余地があるので、来年またスポンサーとして出展できるのであれば、もっと良い形にできるだろうと思っています。

ブースでやったこと 

f:id:mixi_engineers:20160929192200j:plain

話さなくても事業・社内の様子が分かるように

実際に開発者が使っている32インチ4Kのディスプレイを2台持ってきて、片方はTVCMの動画を流すことで事業の紹介と、もう片方は社内イベント・社内風景などの様子も流して、会社全体の雰囲気が伝わるように心がけました。

けっこう立ち止まって見てくれる方もいらっしゃったり、実際にお話したときに「楽しそうな職場ですね」と言って頂けたりしたのでこれは見る側としても良かったんじゃないかと思いました。

ブースに来てくれた方にプレゼント

これはやっぱりノベルティですね。今回は奮発してTシャツとステッカーを配りました。1日目に配ったものを2日目に着てくれていた方もいて、配っているこちら側も嬉しい気持ちになれました。

さらに、『積極採用中!』と記載された名刺サイズのカードも沿えて配りました。これは『よくある採用のチラシを配っても、正直あまり見られない』と親会社からアドバイスをうけて作りましたが、配る方も配りやすく、もらう方も負担にならないのでかなり良かったんじゃないかと思いました。

実際に渡したデザインがこちらです。必要なメッセージだけに絞っています。

f:id:mixi_engineers:20160930170054p:plain

キャラクターで認知してもらう

他の企業を見ていると、特に、モノタロウさんはすごく良く出来ていて、というかモノタロウ侍のマスコットだけで、参加者の心を鷲掴みにしていましたね。やっぱかわいいゆるキャラはみんな好きですよね。

去年のPyConでも人気者でしたし、当然今年もモノタロウ侍が会場に来ることは分かっていたので、我々も負けじとチケットキャンプのマスコットであるチケキャン犬というキャラクターでアピールしました。

 

モノタロウ侍とのコラボ。チケキャン犬の彼ももちろんエンジニアです。

現在はもう契約上、動画は載せられませんが、、実はこれ、小島瑠璃子さんがCMで実際に着ていた衣装です。なんだか台無しにしてしまった気もするので、ファンから怒られないか心配です。気になる方はググってください

PyConJP2016に参加されている方への印象

ありがたいことにそんなブースに足を止めてくださった方も多く、様々な方とお話させていただきましたが、今年は思った以上に学生さんが多い印象でした。

聞けば、大学の研究で機械学習を使っていて、それをPythonで書いているという方の多いこと多いこと!

去年参加した時も、機械学習系の方が多い印象でしたが、今年はさらに多く、また傾向としては『機械学習』がメインの研究テーマというよりも、何か別の研究テーマがあって、その精度を上げるために機械学習を用いているという方が多く、かなり実用的なところで使われているんだなぁと関心しました(小並感) 

一方、アプリケーションエンジニアとしてPythonを使っている企業というのは日本ではまだまだ少ないなぁという印象でした。

弊社の発表 

2日目にジョブフェアというセッションがあり、お昼ごはんを食べながら企業の話を聞く機会がありまして、そこで弊社CTOの酒徳もパネルディスカッションに参加しました。

f:id:mixi_engineers:20160930141548p:plain

企業のブースで直接話を聞くのは緊張するけど、企業側の話を聞きたいという方にとってはすごくいい機会になりますね。

 

また、弊社エンジニアの小松もLTに登壇しました。こちらは動画・資料も公開されています。 

www.youtube.com

 

2日目のLT終了後、プレゼントのコーナーがあり、受け取ると景品がもらえるカラーボールを弊社の小松 チケキャン犬くんが頑張ってたくさん投げていました。受け取れた方、おめでとうございます。 

f:id:mixi_engineers:20160930144544p:plain

まとめ&所感

Everyone's different, all are wonderful.「みんなちがって、みんないい」

今年は上記のテーマで開催されたPyConJPでしたが、実際に業務でPythonを使っている身としては、こういうコミュニティを通して知り合いを増やし、楽しく仕事や相談の出来る仲間が増えるといいなと思っていまして、その受け皿としてこのコミュニティはとても居心地がよく、今後もPyConJPに参加していきたいなと思った所存でございます。

 

最後に 

最後まで読んで頂き、ありがとうございました。

 

株式会社フンザはPythonエンジニアを大募集しています。

もし興味がありましたらご連絡ください!