AWSの話題を中心に、日々の業務やプログラミングの徒然を綴るエンジニアブログです。

HANDS LAB

HANDS LAB ENGINEERS BLOG

ハンズラボエンジニアブログ

Swaggerで作るSPECファイルを小さいファイルに分割する

Pocket

こんにちは、井上です。

Swaggerで始めるモデルファーストなAPI開発」を見て興味を持ったので、Swaggerをちょっと触ってみたのですが、すぐに、これ1ファイルの YAMLファイルでメンテナンスするの超しんどくない?と感じました。

なので、分割する方法を調べてみました。で、みつけたのが下記エントリ。
How to split a Swagger spec into smaller files

方法としては、別々のファイルに書いた定義を $ref で参照しておき、それを json-refs でマージして1ファイルに戻すというやり方のようです。

下記のような YAML ファイルを、

下記のように分割します。

起点となる index.yaml は下記のようにリンク集のような形になります。

サンプルが githubに上がっているので、それで試してみます。

全部マージして出力されました。

JSON形式になっていますが、resolve.js を下記のような感じに変更すると、YAML 形式で出力されます。
※ js-yaml が必要なので、別途 npm install js-yaml が必要です。

オプションに、resolveLocalRefs: false を加えると、ファイル内の $ref: ‘#/definitions/User’ は展開されず、別ファイルのみ展開されます。
同じ定義を繰り返し参照しているような場合には、展開しないほうが見通しが良いと思います。

使用できるオプションは、下記で参照できます。
json-refs/API.md at master · whitlockjc/json-refs

Pocket

おみやげAPIの裏側〜re:Invent企画〜

Pocket

10月にラスベガスで開催された「AWS re:Invent 2015」。

AWS re:Invent 2015

参加したメンバーは考えた…。
新サービスについて紹介するだけなら、”某ブログの会社”の方が早いし詳しい…。
それなら、新サービスを使って何かを作ればいいんじゃないか!?と。

そこで、メンバーに配るおみやげを抽選できる
おみやげAPIをつくるべく、「おみやげAPIプロジェクト」が発足!
無事おみやげは配れたのか?
今回は(やっと)その全貌・開発の裏側に迫ります!

おみやげAPIの立ち上げ

チーム構成は、
re:Inventに参加した 井上、今井。そこにAWSエンジニア加藤がJoin。
さらにデザイナー田名網も加わり強力な布陣に(えっへん)。
おみやげの写真撮影などサポートを青木が担当。

過去のブログ
おみやげAPIをつくろう〜AWS re:Invent参加メンバー企画スタート!
おみやげAPIをつくろう〜絶賛開発中!re:Invent企画〜
来たよ!re:Invent〜展示エリア(Central)を楽しもう編〜

写真の数はざっと20枚。ですが、実際には同じものやサイズ違いなどもあり、商品数はもっとありました!

おみやげ配布大会(re:Invent報告会)スタート!

計3名分ともなると、長机に乗り切らないほど!
omiyage02

多くのメンバーが参加しました〜おみやげ応募は事前に案内して「応募しておいてね」と伝えていました。

reinventhoukokukai

おみやげに応募する画面はこのような感じです。
希望のおみやげを選択して、エントリー。

omiyagegamen

管理側(抽選する側)の画面です。ラスベガス風。

chuusengamen

おみやげAPIの裏側

決め事としては、以下の2つです。
・できるだけAWSの新サービス(re:Inventで発表されたもの中心)を使う
・NoEC2

また、ざっくり要件は以下のとおりです。
・ユーザー側機能
 -おみやげの一覧を見ることができる
 -欲しいおみやげに応募できる
・管理者側
 -応募状況が確認できる
 -おみやげの抽選が行える

設計したものがこちら。ついた字名が「新技術の無駄遣い」。

omiyageapisekkei

・アプリケーション
 -JavaScriptによるシングルページアプリケーション
 -iOSアプリもあり
 -配信はCloudFront(S3オリジン)
 -無駄にWAF

iOSアプリのアイコンはこちら(デザイナー田名網作)
omiyageicon

・認証
 -Facebook

・権限付与
 -Cognito

・データ
 -応募やユーザー作成はAPIGateway
 -APIGateway+Lambdaを経由してDynamoDBへ
 -LambdaはPythonを使用(JS非同期処理多い…Pythonならシンプルにいける)
-Lambda SNS使って処理が管理者に飛んでくる
 -登録状況確認 無駄にcron使いたかった
 -DynamoDBに入った応募データはLambdaからFirehoseでS3経由Redshiftへ
  (ただ、Lambdaコンテナ上のSDKが古くてFirehoseが呼び出せず→実現せず)
 -Lambdaの定期実行(CRON)を使って応募状況をSNSでサポート

やってみてよかったこと

新サービスを無理やり使う方針によって
・どんなサービスがあったか復習できた
・想定ユースケースの確認ができた

新サービスを使ってみて
・サービスの概要を把握できた
・一回手を動かしてみることで、苦手意識が低下した
・Lambda力がました
・APIGatewayが使えるようになった
・Node.jsの辛さを再認識した
・Pythonに目覚めた
・サーバレスアーキテクチャも行けそうな気がしてきた

サーバレスアーキテクチャについて
・APIGatewayの登場により、より現実感が増した
・2 Tireアーキテクチャは用途が限定的なイメージ
・デプロイ系はまだこなれてない
・開発方法、運用方法についてノウハウの蓄積が必要
 デプロイ方法の確立(JAWS frameworkなど)
 ブラウザでポチポチするのは辛い
 ログまわり(CloudwatchLogs辛い)
・認証まわりがまだふわっとしてる(自分の中で)
・うまくいけばコストダウンになりそう

・新しい技術を学ぶのには”しばり”があると面白い
新サービスしばり、Lambdaしばり、EC2レスしばり…

エンジニア井上が資料にまとめておりますので、こちらをご覧ください。
AWS活用の今までとこれから-東急ハンズの事例-

なお、抽選にはちゃんとドラム音が鳴り、無事おみやげたちはメンバーの手に渡っていきました!

Pocket

Baby Engineerはつかまり立ちをした。

Pocket

ひよっこエンジニア、ケイティのエンジニア成長記、2回目です。今回はローカルストレージを使ったメモ帳をJavaScriptで作成してみました!今回も本文・日本語訳ともケイティ本人が書いています(日本語は少しだけブログ担当が直してますが)

Fall is by far my favorite season; mainly for all the holidays it holds: Halloween, Thanksgiving, and Christmas. How was your Halloween?
Even if you don’t celebrate this holiday, it’s still entertaining to see all the costumes. What do you think of mine? (You could only grab this mask for a limited time at Tokyu Hands during Halloween.)
秋は私の断然お気に入りの季節です。主に秋には色々行事があります:ハロウィーンや勤労感謝の日やクリスマス。皆さんのハロウィーンはいかがでしたか? ハロウィンを祝わないとしても、誰かが仮装するのを見るのは楽しいです!私の仮装はいかがですか?(このマスクはハロウィンの間、東急ハンズでゲットできたものです!w )

IMG_4107

I have been busy lately with learning how to use Javascript with a little Local Storage thrown in. Two other coworkers and I participated in a class called “Javascript for REAL.” Funnily enough, after completing this course, I believe I have a better grasp of Unicage.
最近は、Javascriptでのローカルストレージの使い方を学ぶことに忙しかったです。私ともう二人同僚と一緒に二ヶ月半の間 「ほんきでJavaScript」 の講座に参加させて頂きました。おもしろいことに、この講座の後ではユ二ケージを前よりもよく把握できたと信じています。

For this class we created our own memo pad from what we learned in class. It was super challenging, and I could not do most of it on my own. My team leader likes to grin and say that he felt like he passed the course even though he didn’t officially take it.
このクラスでは、講座で学ぶ内容を使って自分のメモ帳を作成します。このプロジェクトはとてもやりがいがあり、一人ではほとんどできませんでした。(復習を手伝ってもらったので)私のチームリーダーは「ぼくは講座受けてないけど、これだけやればきっと受けたようなものだね!」とにやりとして言っています。

My memo pad is quite simple; the reason for that is because I wanted to understand how to properly use local storage and see how everything is supposed to flow together.
私のメモ帳はまったく単純なものですが、わざとそう作成しました。理由は、どのようにローカルストレージをキチンと使用して、どのように全体が一緒に流れるべきかを理解したかったからです。

Although my goals have altered a little from what I originally set out to do, I achieved most of them which I’m pleased about.
今回発表するものは、そもそもの目標設定からは少し変更されたけれども、ねらいはほとんど達成したので私は喜びました。

I created two input fields-one for the title and one for the text-which gave me some trouble.
私はtitleとtextの2つのinputフィールドを作成しましたが、それらによっていくつかトラブルが起きました。

At first I had all the code crowded together, but I have since learned it’s better to break it apart into smaller chunks.
最初は全てのコードを一緒に組み込んでいましたが、そのとき、小さいまとまりに分けることが良いとまなびました。

The priority button uses the toggleClass API. I want to find a more practical use for it, but for right now that’s all it does.
重要度ボタンは、toggleClass API機能を使用します。今はそれで終わりですが、私はもっと実践的な使用法を見つけたいです。

If we decide to edit it, the information is pulled into these two hidden input text boxes. Here we can edit and save the changes back to the selected memo. Even if we have multiple memos it always saves to the original selected memo. I’m currently looking into getting the delete button to work the same way.
もしメモを編集しようとするなら、情報は2つの非表示にしたinput textにひっぱられます。ここで選択されたメモに対して、編集、差分の保存ができます。たとえ複数のメモが合っても、オリジナルの選択されたメモに対して保存ができます。削除ボタンも同様に動く方法を探しています。

 

First we input some words, and press add memo where it is automatically saved to Local Storage
最初に、input内に何か言葉を記入し、メモ追加ボタンを押します。それはローカルストレージには自動保存されています。

Currently it only saves the top most memo, but when I incorporate the auto save with numbers perhaps that will change.
現在は一番上のメモのみが保存できますが、私が自動保存機能と数字等を組み込みことができれば、おそらく変わると思います。

Local Storage is really useful, so get out there and start using it if you aren’t already!
ローカルストレージとは本当に便利なものなので、まだ 使ったことがない人は早速使ってみてね !

Pocket

ハンズラボ本棚の更新通知をSlackに流したい!

Pocket

はじめまして。ハンズラボ歴3ヶ月、pythonista歴3日の倉嶋です。

ハンズラボでは技術書は経費で落ちますので、みんなドンドン買ってきます。
総務担当がポチポチGoogleスプレッドシートに蔵書登録していたのですが、登録が間に合わず、未登録の蔵書が散見されるようになりました。
解決のため、BooklogにWeb本棚を作りました。
BookLog

モバイルアプリからもバーコードで登録できて便利!各自で登録できる!
ついでに新規登録した蔵書をSlackに流したい!ということでBooklogのRSSフィードを使って作りました。
ハンズラボっぽい縛りは以下のとおりです。
* せっかくだからAWS使おう。新機能のLambdaのScheduledEventだ!
* Lambdaでpython使えるようになったし、pythonで書いてみよう!

・・・と勢いこんで作ってみたはいいものの、python+lambdaの落とし穴にハマるハマる。
* python書くの初めてで、標準ライブラリか外部ライブラリかがわからない。
* 外部ライブラリはzipアップロード時に含める必要あり。pipで落とすときに-tオプション使ってディレクトリ指定する。
* 「1時間前の時刻を取得したい」ところなんですがRSSの時刻表記をYYYYMMDDにしたり時間計算したりがうまくいかない・・・。
* Lambdaのpythonは2.7なので、UTF-8文字列は明示的にu’’。
* UTF-8文字列のURLエンコードでハマる。asciiじゃないよエラーいっぱい出て泣く。
* AWSコンソールでは日本語文字列使えないぽいので、zipで固めてuploadする。(Lambdaのコンソールでコード書いてsaveすると文字化けする。コメントもろとも)
* zipファイルアップロード時に「fileb://」ってつけないとNG。
aws lambda update-function-code --function-name check_booklog_tl --zip-file fileb://booklog2slack.zip
* アップロード時、本体のファイル名はlambda_function.py固定。
* def lambda_handler(event, context)がないと動かないのでローカルでのテスト時にいちいち書き換えないといけない。
* Scheduled Eventの登録で謎のエラー・・・いつの間にか登録できてたのでエラーの原因がわからん・・・。

半日くらいの見込みだったのですが80行のコードに2日位かかって、ようやく完成しました。
github

Booklog_Lambda_Slack_IF
おかげさまで社内ではそれなりに好評です。
反省点は、「公式ドキュメント、大事」「似たようなことやってる人を探すの、大事」です。
いきなりやりたいことをやる前に、公式のサンプルプロジェクトをやっておけば半分の時間で完成できた気がします。

ちなみに、シェルスクリプトで作った参考実装は1時間くらいでできました。Lambdaでbashが動いてくれれば・・・。

Pocket

おみやげAPIをつくろう〜絶賛開発中!re:Invent企画〜

Pocket

エンジニアブログからこんにちは、マーケ担当の青木です。

AWS re:Invent 2015に参加したエンジニア、井上&今井のアイディアから生まれた
「おみやげAPIをつくろう」というプロジェクト。
re:Inventでゲットしたおみやげは無事メンバーの手に渡るのか!?
スーパーAWSエンジニアの加藤もJOINし、プロジェクトは進行中。
中間報告をレポートします!

omiyageicon

アイコンはデザイナー田名網作 Amazon風?

前回のブログでお伝えしたように、今回はre:Inventでゲットしてきたおみやげを
メンバーに配ることが目的。

事前準備として、以下の項目が入った「おみやげリスト」を青木が作成。

・おみやげの内容(例:DockerTシャツ)
・サイズや量(例:Lサイズ、2枚)
・商品写真 (例:DockerTシャツの写真)
dockertshirt

おみやげAPIは、ざっくり以下のようなイメージです。
・web&iPhoneアプリ対応
・Facebookでログイン
・商品一覧が出てきて、3つまで応募できる
・抽選ボタンが出てくる
・当選かどうか確認できる

10/23時点では以下AWSサービスを利用して構築しています。
1) API Gateway
2) Lambda/Pythonの利用
3) Cognito / Facebook認証
4) WAF
5) サーバーレス(NoEC2)

また、以下も考えています。

1) Firehose の利用
entry -> DynamoDB stream -> lambda -> s3 -> redshift
2) Lambda cron の利用
entry 状況をメールでお知らせする

構成図については近日公開予定!お楽しみに!

これが当たっちゃったらどうしよう…

snowball

注:SnowBallの重さは約23kgらしいです

Pocket