ボクココ

個人開発に関するテックブログ

Amazon API Gateway で気になった機能をまとめてみる

今回の話題は つい先日出た Amazon API Gateway について。

あくまで自分が注目したところを読んでのできる範囲であるため、それ以外にもできることがあるだろう。詳細は、API Gatewayのドキュメントを読んでいただきたい。現在は英語のみのようだ。

AWS Lambda の呼び出しとレスポンスの受け取り

AWS Lambdaを使えば、プログラミングしたコードをサーバーを立てずに動かすことができる。しかも料金は実行回数と実行時間に応じた課金のため、従来のずっと課金しっぱなしだった EC2などのサーバーを立てるやり方よりよっぽどコストを抑えられる。それでもって、できることは多い。普通のサーバーにNode.jsが入った感じで、外部ライブラリを取り込んだソースコードをAmazon Lambdaに配置することもできる。

設定はシンプルだった。呼び出し先に Lambdaを指定するだけで、基本的にAmazon API Gatewayが作ったURLにアクセスすればAWS Lambdaを呼び出すことが可能。レスポンスは、context.done(null, {"Hello":name}); のように、第二引数にJSONを埋め込んで返す形となる。

f:id:cevid_cpp:20150913205926p:plain

ここで、HTMLやXML、形を変えたJSONを返したい場合は Amazon API Gatewayの提供する、マッピングテンプレートという概念を利用し、独自のテンプレートエンジンの中に動的な要素を埋め込んでいく形となる。これを使えばWebアプリケーションだって作れてしまう。

ただ API Gateway をWebサーバーとして使うのであれば、全てやりとりはJSONにして、HTMLの描画とかは AngularJSとかを使って JavaScript側でやる方法にするべきだと思う。

正直なところ、大規模なWebアプリをこの構成で作るのはまだお勧めできない。まだそこまで発達していない分野だからだ。 純粋なPHP、Ruby の Sinatraや、Node.js の Express で作るようなシンプルなアプリであれば、大いに活用すべきで、コストを抑えられるし、信頼性の高いアプリを構築することができるため、利用すべきである。

ここまで読んできっと読者の皆様は "AWSフルな構成のフレームワークとかないの?" と思うことだろう。まさに今、AWSのみで構成するWebアプリケーションフレームワークが動き出している。その一つの例は、 JAWS である。 S3で静的ファイルを保存し、Lambdaでコード実行、データはDynamoDBというようなのをまとめて構築できるようだ。個人的にこのフレームワークには興味はあるがまだ触ってはいない。

注意していただきたいのは、わざわざ API Gateway を使わず、AWS Lambda だけでいいこともあるという点。 AWS Lambda を実行してレスポンスを受け取りたい、というだけの自前アプリを作りたい場合は JavaScript SDK の中に AWS Lamda を 同期で呼び出せるメソッドが提供されているので、Amazon Cognitoを通して AWS Lambda を利用すればよい。この点について自前アプリでも API Gatewayを使うといいことがある点などあれば、教えていただきたい。

ということで、AWS Lambdaを呼び出したいから API Gateway を利用する、というのは判断としては時期尚早と言える。外部に公開されたAPIを使わないといけなくなるためである。あくまで外部に公開するAPIを作りたいときに、API Gateway を検討する。ということが本来の使い所な気がしている。

CORS の設定

Amazon API Gateway には CORS を設定して、外部APIを呼び出すことができる。 CORS(Cross-Origin Resource Sharing) について簡単に説明する。普通、JavaScript から Ajax(Asynchronous JavaScript + XML)と呼ばれるJavaScriptによるサーバーとの通信をするには、同じドメイン内でのみそれが可能である。 しかし、サーバー側で CORS の設定をすると、なんと外部ドメインでもAjax通信ができるようになるのだ。

つまり普通に Ajax で外部のWebサーバーを呼ぼうとするとエラーになるのだが、このAPI Gateway を経由すれば、エラーが出ずに外部サーバーとAjax通信ができるようになるのである。

API Gateway がない頃は、同じドメイン内のサーバーのコードで、外部サイトにアクセスするコードを書き、Ajax自体は同じサーバーに対して行う、というやり方が一般的だったが、API Gateway の登場でそんな手間も必要なくなった。

ただ JavaScript でコンテンツパクリ放題という感じになってしまうので、良識の範囲で使うべきであろう。

SDK の自動生成

iOS, Android, JavaScript 向けに 作成したAPIにアクセスするためのSDKを自動生成してくれる機能がある。この機能を使えば手軽に作ったAPIをアプリに埋め込むことが可能だ。これもやはり外部向けに提供する、という目的で使うのが一般的な気がする。

自前アプリであれば、これも先ほどと同じように Amazon Cognito と AWS SDK を利用して AWS Lambdaを直接呼び出すことが可能だ。

APIの利用制限

同時アクセス数の上限などを決めることができる。これも外部にSDKを提供したときに、一輝にアクセスしてくる不正なアプリの対策に重宝される機能だろう。

終わりに

記事を通して説明してきたが、API Gateway を利用する主要な理由としては、「外部に APIを公開したいから」というときが考えらえるユースケースだ。

あとはいきなり AWS Lambda をHTTPアクセスから実行して結果が欲しい場合などのときも威力を発揮するだろう。