月別: 2016年2月

Java8 + AWS Lambda + API Gateway で遊ぶ

 この記事では Java8 で書いたメソッドを AWS Lambda に実行させ、その実行結果を API Gateway を用いて外から取得できるような簡単なアプリケーションを作成していきます。

 めっちゃ雑にいうと、Java で String を返すメソッドを書いて、その文字列を返すAPIを作るというようなことをやります。

 この際、String を返す Java のコードを実行するのが、AWS Lambda の役割で、その実行結果を取得できるエンドポイントを提供するのが API Gateway の役割になります。

 また、ちょっと手を加えるだけで簡単に JSON を返す API を作ることもできるので、使い方次第では遊べるツールになるのではないでしょうか?

固定した文字列を返すAPIを作成する

 まず、あるエンドポイントを叩くと、ただ文字列が帰ってくるだけのAPIを作成しながら、AWS LambdaAPI Gateway の使い方を確認していきます。

Gradleプロジェクト作成〜実行対象のメソッド作成

 gradleで適当にプロジェクトを作成してください。手元で実際に使った build.gradle ファイルは以下のような具合です。

 続いて、AWS Lambda で実行する対象のメソッドを作成します。めっちゃ簡単なので「馬鹿にしてんのか!」って思うかもしれませんが、まあチュートリアルですので…。

あとはプロジェクトルートから ./gradlew builde を叩いて build/libs 以下にできた jarAWS Lambda にアップロードするだけ!めっちゃ簡単じゃないですか?

AWS Lambda への jar のアップロードと実行

以下のように進めてください

1. AWSのマネジメントコンソールから Lambda を探してクリックします
2. create a lambda function ボタンをクリック
3. 適当なテンプレート一覧が出てくるが、スルーして右下の skip をクリック
4. Name を適当に埋め、Runtimejava8 を選択
5. zip をアップロードできるようになるので、さっき作った jar を選択する
6. Handlerのところにはさっき作ったメソッドを指定。上の例だと com.github.gochiusa.lambda.routes.api.v1.text.Words::get という感じで {package}.{class}::{method} という感じでしていすれば良い。残りの項目も適当に埋める。

適当にすすめると、左上に test というボタンが出てくるので押せば、晴れて AWS Lambda上 で、自分が書いた Java8 コードが実行されてくれる。だいぶ説明を端折っているので詳しくは AWS のドキュメントを見ればいいと思います。

API Gateway でエンドポイントを作る

マネジメントコンソールから API Gateway へ行き、create API をクリック

スクリーンショット 2016-02-28 0.40.49

API の名前を適当につけ先に進む

スクリーンショット 2016-02-28 0.40.57

create Method をクリックする

スクリーンショット 2016-02-28 0.44.14

以下のような感じで適当に各フィールドを埋める。ここで指定する lamda resion はさっき作った lamda function が置いてあるリージョンを指定。lambda function は作ったやつの名前を入れる。

スクリーンショット 2016-02-28 0.41.53 1

以上がおわったら Save を押して、Deploy API のほうに進めば、"ご注文はうさぎですか?" とだけ返してくれる最高なAPIが出来上がる。

JSON を返す API を作る

 JSON を返す lambda function も簡単につくれます。AWS Lambda は、POJO を返す Lamda function を実行すると JSON のレスポンスに変換してくれるみたいでめっちゃ楽しそうです。具体的にはこんなAPIがつくれます。

まずは、上記の感じ構造を持った POJO を定義しましょう。

んであとは、関数の戻り型、戻り値をこいつにしてやればOKです。

ソースコードはここにまとめて置いてあるのでまあ適当に見ていただければ…。

おわりに

 AWS Lambda で Java のコード動かしている記事があんまりなかったので書いたが、だいぶ雑なので迷ったらドキュメントか、他の優しい人が書いた記事を読むと良いと思います。AWS Lambda と API Gateway、どちらも素晴らしいサービスですね。どんどん活用していきたい…。

謝辞など…

 実はWantedly さんでやっていた Serverless Framework の勉強会に参加させていただき、この周辺のものに触れることができました。Wantedlyさん、ありがとうございます…。この記事の内容に近いもののハンズオンでしたので、AWS LambdaやAPI Gatewayに初めて触る方は、まずそちらを試して見ると良いと思います。

ゆきんこ・りえしょんのいちごまみれだよ~公開録音に行ってきた

 2月14日に神戸国際会議場で行われた、ゆきんこ・りえしょんのいちごまみれだよ〜公開録音に行ってきました。

 とりあえず、行きは10時羽田発のANA19便。当日、激しい暴風雨で羽田の滑走路が一本しか空いてないという状況になってしまいました。結局出発は45分遅れ。定刻通りに出発していたらおそらくもうすでに着陸体制に入っているころだったはず…。そんなかんじでなかなか時間的に厳しいかんじで大阪・伊丹に到着。JRのバスで三ノ宮まで移動しました。最初、公録の会場を勘違いしていて、「神戸国際会館」なるところに行ってしまいました。ただしくは「神戸国際会議場」でした。テンパってタクシーに乗って会場入り。到着は13時すぎ…。当然座席は後ろのほうになってしまう。つらい。

 公録はゆきんこさんむっちゃ緊張していて非常に良かった。途中からりえしょんがいいかんじにフォローしてもぜんぜん緊張しっぱなしなように個人的に見えました。ゆきんこさんかわいい…。そして、りえしょんは、真っ赤ないちごまみれTシャツむちゃくちゃ似合うなぁ…。まあいろいろ公録の内容はまだ放送されていないので、そちらをお楽しみに!というかんじです。面白かったし、普段は2人がどうなふうに会話しているのかが見えないので、これを見たあとにこれまでの回を聞き直して、雰囲気を想像すると良さそうなので、ちょっと試してみようかと思います。

 終了後は宿泊先の二宮旅館さんへ。とても良い宿でした。神戸に素泊まりされる方はむちゃくちゃおすすめです!チェックイン後に神戸牛を食べ、ハーバーランドへ繰り出しました。ハーバーランド、とってもきれいですが、2/14という日取りのせいか、まあどんなかんじかご想像にお任せしますが、神戸の海辺の良いかんじの雰囲気の中お酒を飲んで、ゆっくりと過ごしました。

そんな… 他愛もない… 日常の… お話でした…。

Swift2で静的なDIを実現する謎のソースコード

とりあえず書いたら動いたけど、なんだかよくわかっていないのでコードだけ貼っておきます。元ネタはここ。元ネタではAppContextで頑張って配線しているけど、めんどうくさいのでどうにかならんのか、と思っていろいろいじってたらこうなった。

いろいろ分かったらまとめて記事を書きます。XcodeのPlaygroundで動いたので、貼っていじってみるとよいのではないですかね。

ReSwiftのサンプルコードの仕組みをRxSwiftで実現する

 ReSwiftのサンプルコード程度であれば、RxSwiftの機能を使って自前で実装ができてしまうのでは、と考えたので実際にやってみました。不必要に依存ライブラリを増やしたくないという気持ちがモチベーションとなっています。まずはReSwiftのサンプルコード的なものを確認するところから始めます。

 ちなみにこの記事は ReSwift を使い始めて数時間の人間が書いているので、間違っている可能性が大いにあります。嘘を嘘と見抜きながら読んでいただけると幸いです(そして、コメント欄で刺してください)。

ReSwiftとは?

 ReduxのSwift実装らしいです。そもそもReduxがよくわからないのですが、そんなものわかってなくても動くコードはかけそうでした。ということで、とりあえずコードを書いて読んでから、小難しい記事を読んで理解してく方針にして、Redux および ReSwift の解説は他の記事に譲ります。

簡単な数字のカウントアップ・アプリケーション

 まずはReSwiftを用いてどのようにアプリケーションを構成していくか、ごくごく簡単な数字のカウントアップ・アプリケーションの例を用いてみていきましょう(ただし実際にはこんな単純すぎるアプリケーションに小難しいアーキテクチャを採用するメリットはないと思っています、あくまで例示としてのお話です)。まず CocoaPods でも Carthage でもなんでもいいので適当に ReSwift を導入してください。

 ReSwiftではアプリケーションの持つ状態をStateTypeプロトコルを持つ構造体 or クラスにまとめるようです。

 つづいて Action の宣言です。今回のアプリケーションに発生しうるアクションとして数字をカウントアップするアクションとカウントダウンするアクションを宣言してみます。

 簡単ですね?さて続いては、アクションを解釈して、新しい状態を発行する役割を持つ Reducer を実装してみましょう。状態を変化させるのではなく 新しい状態を発行する という点に注意しながらコードをみてみると良いと思います。

 そんなに難しいものではなく、action がもし、CountActionIncrese 型だったら、現在の状態のcounterをカウントアップしたものを生成して返すというだけです。Decrease も同様に考えれば同じようなものですね。

 最後に皆さんおなじみの ViewController を実装してみましょう。まずは、ストーリーボードに適当にラベルとボタンを配置してください。

スクリーンショット 2016-02-12 7.12.03

 つづいて、ViewController に label と ボタンのアクションを紐づけて、以下のようなコードを記述します。

 各アクションで文字通り Action を発行しているだけで、ラベルのテキストを書き換えたりカウンターの状態(数字)を書き換えたりしていない点が非常に重要なポイントです。アプリケーションの状態の書き換えは、Reducerで行います。そして、ビューの書き換えは newState で行います。こうすることにより、状態遷移(実際には新しいステートの発行)の記述と、ビューへの反映を分離しています。

 以上のような簡単なアプリケーションだとしても、多分コードみただけじゃ、感覚はつかめないのではないでしょうか?簡単なのでXcode起動して、ちゃちゃっと実験してみてください。5分で終わるので絶対自分の手でコードを書いてみてください。

RxSwiftを使って、上述の形式のコードを実現する

 細かいことは抜きにして、RxSwiftを使って同じ動きをエミュレートしてみましょう。まずは state, action, reducer の定義から。

 ほとんど変化はないですね?次に ViewController は次のような感じ。ちょっと記述は長くなりましたが、だいたい読み替えは可能なのではないでしょうか?

 もちろん、厳密なお話をするとおなじものにはなっていないのですが、ちゃんとプロトコルと基底となるコードをちょっと書いてあげれば、たちまち同じようなものになるのではないでしょうか?(自分の理解が間違っていたらご指摘をお願いします:ReSwiftを触ってまだ1日目です)

おわりに

 楽なので、よくやってしまいがちなのは、ViewControllerに var で状態を宣言して、イベント処理時に変化させていくという感じの実装ではないでしょうか?このサンプルレベルの簡単なアプリケーションであれば、その実装は正しいと思います。シンプルでわかりやすいので、別にそれで全然かまわないと思います。

 しかし状態の数が増えると、結果としてアプリケーションの取りうる状態の数は、各プロパティの取りうる状態の組み合わせ(高校で習った数学的なお話)になります。状態が10個程度を超えてくると、もうアプリケーションコードを読むのが辛くなってきたり、一つの変更が別の箇所に影響してしまい、意図しない動作を引き起こしてしまうなどということがあるのではないでしょうか。

 自分もまだ ReSwiftRedux がどういうものがわかっていませんが、状態の遷移とビューへの反映の混在を分離するところから、まずはじめてみようと思っています。