サーバーレスなAPIについて検討メモ


AWS API Gateway について理解が弱いので調べる
--------------------------------------------

Amazon API GatewayとLambdaを利用したサーバレスなWebアプリを作ってみた
<https://www.cresco.co.jp/blog/entry/445/>

料金 - Amazon API Gateway | AWS
<https://aws.amazon.com/jp/api-gateway/pricing/>

AWS料金早見表 - Qiita
<http://qiita.com/teradonburi/items/a382a17e1e0245b7d831>

Amazon API Gateway & Lambda & S3 で放置可能なサービスを作ってみた -
Qiita <http://qiita.com/macoshita/items/10bc707a019431817952>

Amazon API Gateway を使って AWS 以外のサービスの API をラップする ｜
Developers.IO
<http://dev.classmethod.jp/cloud/aws/api-gateway-wrap-api/>

&gt; Amazon API Gatewayってなんぞや？ &gt; Amazon API
Gatewayとはどんなサービスか改めて知っておきましょう。 &gt; Amazon API
Gatewayは簡単にAPIの作成・管理ができるフルマネージドなproxyサービスです。
&gt; &gt; このサービスは、AWS
LambdaやEC2、またはパブリックにアドレス指定可能なAWS外でホストされているサービス上で実行されているAPI実装に対して、すべてのアプリケーションと接続することが容易になるサービスです。

golang を使ったAPI実装が現実味があるか、もしくは、代替案を確認する
------------------------------------------------------------------

AWS LambdaでJavaとNode.jsとGoの簡易ベンチマークをしてみた。 - 谷本 心 in
せろ部屋 <http://d.hatena.ne.jp/cero-t/20160101/1451665326>

» Apex で Go はどう実行されているのか TECHSCORE BLOG
<http://www.techscore.com/blog/2016/12/08/how-does-golang-run-on-apex/>

eawsyのaws-lambda-goを使ってみる — そこはかとなく書くよん。
<http://tdoc.info/blog/2016/11/02/eawsy_lambda.html>

AWS Lambdaで効率的にgoバイナリを実行する — そこはかとなく書くよん。
<http://tdoc.info/blog/2016/01/07/lambda.html>

Apexを使ってGoでlambdaを動かす - Qiita
<http://qiita.com/dora56/items/b3acb3f4e45e68dce6a8>

&gt;
ただ「たまに行う処理」を「少ないリソース」で行うという観点では、Goで実装するのが良さそうです。GoはそのうちLambdaでも正式サポートされそうですしね。
&gt;
きちんとしたベンチマークは、また別の機会にじっくり行ってみたいと思います。
&gt; ということで、Goを使う大義名分ができたベンチマークでした！

WEB API周りの検討
-----------------------------------------------------------

-   前提のキメの部分  
    -   サーバーレスにする
    -   AWS Lambdaを使う
    -   WEB APIをつくる

-   APIの理論  
    -   REST API
    -   ROA

-   実装の言語  
    -   golangを使ってみたい
    -   golangは早くなりそうな気がする(もし正式対応されれば)  
        でもベンチマーク比較をみてもそこまで変わらなそう

    -   lambdaに対応させるとするとApexを使うことになりそう
    -   NodeJSも便利に使えそう
    -   NodeJSはクラウドと親和性が高い気がする、少なくとも今は。

-   Serverless(FaaS)の理論  
    -   Serverless(FaaS)の適用領域  
        -   ライトユースなAPI（前述のコーポレートサイトのお問い合わせフォームなど）
        -   Event DrivenなGlue(糊)としての役割
        -   SPA、ネイティブアプリ等のバックエンドAPI
        -   Micro servicesの基盤として

    -   Step Functions  
        -   関数を状態をもたせつつ連動させる機能ってことかな
        -   テストの面でも便利なので考えておいた方良さそう

    -   Serverlessの面白みと本質  
        -   WEBサーバのアーキテクチャが隠蔽化されている
        -   デプロイ時にWEBサーバのプロセスを意識する必要がない
        -   開発チームの運用負荷が減るので、アプリケーションの開発に注力出来る

-   APIを実装することを前提にインフラ（aws lambda）のフレームワークの選定  
    -   SAM  
        今回の場合には複雑そうだけど理屈は納得

    -   CloudFormation  
        クラウドを扱う時点で使えるようになっておいてもいいのかもしれないが、今は面倒

    -   Serverless Framework  
        一番便利そう。golangは対応しない。

    -   Apex  
        SPAのバックエンドに適している。golangならこれかな。

    -   クラウドとAPI実装の統合型フレームワーク  
        -   goSparta  
            goのapiを構築するフレームワークでクラウドの設定も担う形

        -   Claudia.js  
            NodeJSのapiを構築するフレームワークでクラウドの設定も担う形
            解説記事を見る感じだと割とシンプルに使えそう

-   WEB APIフレームワーク  
    -   NodeJS  
        -   LoopBack
        -   クラウドとAPI実装の統合型フレームワーク  
            -   Claudia.js

    -   golang  
        -   ECHO  
            現段階では日本語情報が多そうだし、人気の伸びがある

        -   Revel  
            ECHOよりも前から人気があったっぽい、評価している人がいたので気になる

        -   クラウドとAPI実装の統合型フレームワーク  
            -   goSparta  
                日本語情報がないので使う自信がないけどもしかすると良さそう、クラウド開発の流れ次第

-   APIのリクエストとレスポンス  
    -   WEB APIへの送信
    -   WEB APIからのレスポンス
    -   WEB APIからのエラーレスポンス

-   APIの設計  
    -   スタンダードな理論に沿ったAPIの設計  
        -   Rest APIのRFC.プラスアルファなのかな。。

    -   ルーティング  
        -   URLの設計や洗い出し

WEB APIの理論
-------------

### 概念体系

Railsを支える基本概念の整理（RESTfulやリソースなど） - Qiita
<http://qiita.com/kidach1/items/43e53811c12351915278>

&gt; リソースとは &gt;
データモデルとwebインターフェイスが組み合わさったもの。

翻訳: WebAPI 設計のベストプラクティス - Qiita
<http://qiita.com/mserizawa/items/b833e407d89abd21ee72>

### REST API

REST APIの共通仕様 – cybozu developer network
<https://cybozudev.zendesk.com/hc/ja/articles/201941754-REST-API%E3%81%AE%E5%85%B1%E9%80%9A%E4%BB%95%E6%A7%98>

RESTful APIとは何なのか - Qiita
<http://qiita.com/NagaokaKenichi/items/0647c30ef596cedf4bf2>

### ROA

リソース指向アーキテクチャ(ROA)とは何なのか - Qiita
<http://qiita.com/NagaokaKenichi/items/0f3a55e422d5cc9f1b9c>

### サーバーレス

Serverless Advent Calendar 2016 - Qiita
<http://qiita.com/advent-calendar/2016/serverless>

Serverless(2) Advent Calendar 2016 - Qiita
<http://qiita.com/advent-calendar/2016/serverless2>

サーバーレスで作ったWeb APIのシナリオテストや定常監視もサーバーレスで。
- Qiita <http://qiita.com/RyoheiMorimoto/items/6233b2dd1be488321df9>

&gt;
前節のような単体のAPI機能テストをつなげて、シナリオテストを実現できないかを考えます。
&gt; せっかくなので、先日のre:Invent 2016で発表されたStep
Functionsを使ってみます。

### サーバーレスの本質（Paasでいいんじゃないのか）

各社のサービスから見えるServerlessの本質とは何か - Miscellaneous notes
<http://marcy.hatenablog.com/entry/2016/04/01/152751>

### サーバーレスの構成ツール

【AWS】CloudFormationまとめ - Qiita
<http://qiita.com/iron-breaker/items/a12d1228de12663e7d32>

SAM(Serverless Application Model) + Node + Flowtype でAWS
Lambdaの開発サイクルを作る - Qiita
<http://qiita.com/kinzal/items/7a09659399d9be40d674>

&gt; 待望の環境変数対応や、Step FunctionによるAWS
Lambdaのバッチ化、Serverless Application
ModelというAWS公式のデプロイツール、ServerlessやApex、LamveryなどのLambda関連のフレームワークの充実など、一年前に比べAWS
Lambdaが便利になっています。

&gt; SAMはAWSが新しく出したAWS Lambdaのデプロイツールです。 &gt;
<https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md>
&gt;
機能としてはCloudFormationのラッパーで、ローカル→S3にコードをアップロードし、CloudFormationでLambda
Functionや他リソースの作成を行うことができます。

### WEB APIのフレームワーク

Web API フレームワーク LoopBack で遊んでみる - Qiita
<http://qiita.com/kyrieleison/items/defee6a9450b18ae9554>

概観からGoのWebFrameworkを選ぶ（2016/02） - Qiita
<http://qiita.com/jumbOrNot/items/45f86db15a5a6c8a0622>

&gt; 比較対象 &gt; Revel &gt; beego &gt; Gin &gt; martini &gt; goji &gt;
echo

goのweb frameworkについて調べる - Qiita
<http://qiita.com/sao_rio/items/e21cccff304791129e33#_reference-6fe5faae43be4fe0fe8b>

&gt; frame work github star 触った感じ &gt; echo 4686
少ない行で簡単に書ける。 &gt; gin 6829 少ない行で簡単に書ける。 &gt;
martini 8257
ドキュメントが充実している,少ない行で簡単に書ける。周辺機能(ミドルウェア)が充実している。
&gt; beego 7337 少ない行で簡単に書ける。 &gt; goji 3097
issueが少ない。作りがシンプル。

ServerlessConf 2016 Tokyo 2016「Unlimited Frameworks」セッション解説
\#serverlessconf | サーバーワークス エンジニアブログ
<https://blog.serverworks.co.jp/tech/2016/10/03/serverlessconf-session/>

&gt; それぞれの使い分け &gt; &gt; Serverless Framework &gt;
多くのAPIを持つバックエンドシステム等を作るための最有力フレームワーク。
&gt; Apex &gt;
SPAのバックエンドの細かいAPI等を簡単に作りたいフロントエンドエンジニア向け。
&gt; Chalice &gt;
とにかく簡単に作りたい人向け。コーポレートサイト等をS3から配信したいけど、問い合わせフォームはほしい等のライトユースなら一番簡単に使える。
&gt; Zappa &gt;
新しいフレームワークの学習コストを払わずに、従来のものを使ってLambdaの持つコストメリット等は享受したい。または既にDjango等で作成済みのシステムをできるだけそのまま移植したい等。
&gt; Lamvery &gt; Event
Drivenなサービス間のGlue(糊)としてのLambda利用を簡単に正しく行えれば良い。APIはあまり重視しない。
&gt; &gt;
現状、LambdaをはじめとしたServerless(FaaS)の適用領域は以下の分類ができると思っています。
&gt; &gt;
ライトユースなAPI（前述のコーポレートサイトのお問い合わせフォームなど）
&gt; Event DrivenなGlue(糊)としての役割 &gt;
SPA、ネイティブアプリ等のバックエンドAPI &gt; Micro servicesの基盤として
&gt; &gt; 課題 &gt; &gt;
Functionにタグ付けする等して、論理的なグルーピングとそれを単位としたデプロイや管理を実現する
&gt; エイリアスやAPI
Gatewayのステージ機能を活用し、CIツールの統合などを意識した実践的な開発フローを確立する
&gt; 依存ライブラリの選択的な同梱とその依存関係の可視化 &gt;
Function間の呼び出し関係や外部リソースとの依存の管理と可視化

### Serverless Framework

AWS Lambdaを活用したServerless Frameworkを触ってみる - Qiita
<http://qiita.com/susieyy/items/1c2af0ef7b88b742c37a>

Serverless Framework使ってみたメモ | ブログ :: Web notes.log
<http://blog.wnotes.net/blog/article/serverlesss-framework-beginning>

### WEB APIでのエラー

WebAPIでエラーをどう表現すべき？15のサービスを調査してみた - Qiita
<http://qiita.com/suin/items/f7ac4de914e9f3f35884>

&gt; エラーメッセージ: 開発者が読んで分かるメッセージを入れる。 &gt;
エラーコード:
クライアントのプログラムがエラーハンドリングの手がかりになる情報を与える。加えて、ドキュメントではエラーコードの一覧を公開する。
&gt; 複数エラー:
サービスによってケースバイケースだが、複数のエラーが表現できるようになっている。
&gt; 詳細URL:
公開APIでドキュメントが整っているなら、開発者のググる手間がなくなる。
&gt; 一貫性: どのエンドポイントでも同じ構造のJSONになっている。 &gt;
シンプル:
複雑な構造がなくネストが浅いJSONのほうがクライアントが複雑な型を定義しなくて済む。

RFC 7807 - Problem Details for HTTP APIs
<https://tools.ietf.org/html/rfc7807>

> RFC  
> &lt;script type="application/problem+json"&gt;  
> {  
> "type": "<https://example.com/probs/out-of-credit>", "title": "You do
> not have enough credit.", "detail": "Your current balance is 30, but
> that costs 50.", "instance": "/account/12345/msgs/abc", "balance": 30,
> "accounts": \["/account/12345", "/account/67890"\]
>
> }
>
> > &lt;/script&gt;
>
RESTful APIのHTTPステータスコード設計 - Qiita
<http://qiita.com/NagaokaKenichi/items/eb85b5fbb719d60c6627>

### Qiita のリスト

REST-APIに関する57件の投稿 - Qiita <http://qiita.com/tags/REST-API>

RESTfulに関する40件の投稿 - Qiita <http://qiita.com/tags/RESTful>

WebAPIに関する182件の投稿 - Qiita <http://qiita.com/tags/WebAPI>

apiに関する660件の投稿 - Qiita <http://qiita.com/tags/api>

特定の言語やプラットフォームでのWEB APIフレームワーク
-----------------------------------------------------

Go言語で REST API + マイクロサービス - Qiita
<http://qiita.com/pottava/items/46e087f3c06117b31ccc>

GoでJSON APIを書く - sgykfjsm.github.com
<http://sgykfjsm.github.io/blog/2016/03/13/golang-json-api-tutorial/>

Echo – Go 言語 REST API 開発向け Web Framework の紹介
<https://eurie.co.jp/blog/engineering/2015/12/go-lang-web-framework-echo>

### NodeJS + Claudia.js

Lambda公式のブログでも紹介されている

Node.jsでLambdaを開発するならClaudia.jsがオススメ - Qiita
<http://qiita.com/gaishimo/items/5ae6b35ebd4ae9434994>

&gt;&gt;
LambdaでJavaScriptを実行させて気が付いたのですが，言語固有の問題というのは実にたくさんあるのです。

&gt; Lambdaのデプロイツール(フレームワーク)といえばServerless
FrameworkやApexなど多数存在しますが、他のツールとくらべてClaudia.jsは何が違うのでしょうか？
&gt;
最も大きな特徴は、Node.jsに特化しているという点です。Apexのように複数のプログラミング言語に対応しているツールと異なり、Claudia.jsはNode.jsしかサポートしていません。その分、プログラミング言語に踏み込んだ機能が提供されているため、開発者は必要最小限のコードで開発を行うことができます。

&gt;
Claudia.js自体はフレームワークではなく、シンプルなコマンドラインによるデプロイメントツールですが、API
Builderという拡張ライブラリを使うことにより、API
GatewayとLambdaを組み合わせたWeb
APIを簡易に作成することが可能になります。

Node.jsでLambdaを開発するならClaudia.jsがオススメ - Qiita
<http://qiita.com/gaishimo/items/5ae6b35ebd4ae9434994>

Claudia.js を使った簡単マイクロサービス開発 ｜ Developers.IO
<http://dev.classmethod.jp/etc/microservices-with-claudiajs/>

Claudia.jsでServerless入門 - Qiita
<http://qiita.com/kitatuba/items/c46919a893419519104a>

How to turn Node.js projects into AWS Lambda microservices easily with
ClaudiaJS | AWS Compute Blog
<https://aws.amazon.com/jp/blogs/compute/how-to-turn-node-js-projects-into-aws-lambda-microservices-easily-with-claudiajs/>

### NodeJS + LoopBack

Web API フレームワーク LoopBack で遊んでみる - Qiita
<http://qiita.com/kyrieleison/items/defee6a9450b18ae9554>

### golang + lambda

AWS Lambdaで効率的にgoバイナリを実行する — そこはかとなく書くよん。
<http://tdoc.info/blog/2016/01/07/lambda.html>

### golang + lambda + Apex

Lambda with Apex: 環境変数で環境別にLambda環境を整える - Qiita
<http://qiita.com/gaishimo/items/af2a05bcaf4cb96e534b>

### golang + echo

Golang + echoでAPIサーバを書いてみる - peroon's diary
<http://peroon.hatenablog.com/entry/2016/08/02/213018>

Go+echoにURLパラメータでユーザIDを入れてMongoDBから引く - peroon's diary
<http://peroon.hatenablog.com/entry/2016/08/04/181956>

### golang + gosparta

目的には合致してるかも 日本語情報がほぼない
Apexをつかったほうが標準的かもな

A Go framework for AWS Lambda – Medium
<https://medium.com/@mweagle/a-go-framework-for-aws-lambda-ab14f0c42cb#.tu92x498x>

mweagle/Sparta: Run go functions in AWS Lambda
<https://github.com/mweagle/Sparta>

AWS
Lambdaで動くGo言語用フレームワーク。面白いのは汎用的なgoバイナリをLambdaで動かすのではなくfunctionとして書き、AWS周りの設定も全部ソースコードに埋め込めるところか。面白い
- tmatsuu のコメント / はてなブックマーク
<http://b.hatena.ne.jp/entry/276911416/comment/tmatsuu>

### PHP + yii2 番外編かな

yii2で高性能なWebAPIを実現する - Qiita
<http://qiita.com/kitatuba/items/4d8564fde125febcb8ac>

単なるGoのメモ
--------------

Awesome Go <https://awesome-go.com/>