Frameworkを本番導入した話はじめに約半年ぶりの投稿になります。エンジニアの鈴木(@yudppp)です。1がつい先日リリースされました。Frameworkを本番環境で導入しました。Gatewayの利用は初めてになります。作りたかったもの外部サービスの一つのエンドポイントを叩く際にTokenや外部サービスAPIのエンドポイントを隠蔽するためのAPIを作る必要がありました。こちらのAPIは日に数十回程度しか叩かれない想定の利用頻度が極めて低いAPIでした。(利用頻度が低いからといって重要度が低いわけではない)普段通り作るのであれば、クライアントで直接叩いてしまうと外部サービスのTokenが漏れてしまわないよう、Tokenをつけて外部サービスのAPIに投げるAPIを作成し、それをEC2などで冗長化した構成で運用する方法をとっていました。今回はアクセスが極めて少ない想定だったので考えていませんが、アクセスが増えた時に対応するためオートスケーリングの設定をする場合もあります。この方法が悪いわけではないと思うのですが、使われない時間が多いため無駄にお金を払ってしまっている感じと、サーバーに何か起きてしまった時に対応をする必要がありました。Frameworkを利用することにしました。Frameworkとはサーバーレスアプリケーションを簡単に作成できるフレームワークになります。将来的にはAWS以外にも対応しそうですが、現状はAWSのみに対応しています。Formationを利用して作成しています。APIの利用以外にもcron処理やS3,KinessisなどをhookにFunctionを走らせることも可能です。こちらに設定できるイベントの詳細が書いてありました。Lambda自体は同時実行数がデフォルトで100なので、1秒以内に返すAPIであれば100[rps]は捌くことができます。Gatewayを管理する機能はありませんでした。Gatewayの管理ができるものにしようと、導入しませんでした。Gatewayを管理するフレームワークです。Frameworkと異なり、s3やkinesissなどの他のイベントには対応していません。Lambdaに使える言語はNodeJSのみをサポートしているようでした。Frameworkを選択することにしました。導入についてnpmで簡単にインストールすることができます。serverless-node-appまた今回はNodeJSを採用しましたが、テンプレートを利用することによりPythonやJava、ScalaなどLambdaを使える言語であれば利用することが可能です。テンプレートについてはこちらをご参照ください。このような構成になっています。serverless.ymlは全体の設定ファイルとなっていて、関数とそれに結びつけるイベントの設定を行うことができます。handler.jsはLambdaに置かれる関数そのものが定義されているファイルになります。response);};最後にevent.jsonはLambdaの関数の確認をlocal環境で行うための引数の設定を行います。環境変数についてNodeJSではAPIトークンなどを利用する場合環境変数にして指定する場合が多いかと思います。serverless-plugin-stage-variablesとstageVariablesに環境変数を設定することによってhandler.js側でevent.stageVariables.tokenで取得できるようになりました。この際pluginにserverless-plugin-stage-variablesを利用する必要があります。Gatewayの前段にCloudFrontを設定するようにしました。Pathにproductionを指定することによってxxxxxxxxx.cloudfront.net/helloといったURLに変更することができました。料金について料金がどれだけ安くなったか、簡単に計算してみたいと思います。1日に30回、2KBのデータがPOSTされた時に200msでレスポンスを返す場合を考えて計算してみます。アプリケーションのサイズは6MBとします。となり1日あたり約$1.7となりました。これでも十分安いような気もします。Frameworkを使った場合の料金を次に出してみます。となり1日あたり約$0.0005となり、数千分の1と計算が間違っていそうなくらい安くなりました。今回は30回という極端に少ない数で計算を行ったので差が大きく差が開きましたが、この条件であれば、1日あたり約十万回以上叩かれるAPIであればEC2を用いた構成の方が安上がりになりました。※Route53/SSL証明書の料金については今回どちらでも利用しているため省略しています。費用が安くなりサーバーの管理も楽になるので簡単なもの作るタイミングがあれば、また利用したいと思います。データベース等をちゃんと利用した本格的なアプリケーションに導入するにはサーバーレスを意識して実装しなくてはならないので大変そうに感じました。Lambdaが正式にGo言語のサポートしてほしいです。