Frameworkを使ってサーバレスなサイト監視アプリを作ってみた。V4をインストールしておく必要がある。-g以下のコマンドでプロジェクトを生成する。Roleとか)が作成される。プロジェクトの構成createコマンドで生成されたプロジェクトは↓のファイル構成になっている。Frameworkに関するファイルは↓.envこの設定ファイルのstageを変更すると変更したstageにデプロイされるように誤解するかもしれないけど、ローカルのテストのみで使われるファイル。setコマンドを使うこと。(.gitignoreに記載されており、バージョン管理の対象外)admin.envプロジェクト作成時に入力したアクセスキーとシークレットアクセスキーが保存されている。(.gitignoreに記載されており、バージョン管理の対象外)s-project.jsonプロジェクトの設定と著作者の情報を設定s-resources-cf.jsonCloudFormationのテンプレートファイル_metastage、region毎のCloudFomationのテンプレートや変数ファイルが保存されているディレクトリ。(デフォの.gitignoreには記載されていないけど、ドキュメントでは記載されていると書かれているので、追記してバージョン管理の対象外にする)ComponentとFunctionこのプロジェクトのままでは何のコードも書けないので、続いてComponentを作成する。↓のコマンドでcomponentを追加する。"sites/show"するとプロジェクトに下記構成が追加された状態になる。ComponentとFunctionの粒度は、RESTでいうリソース=Component、アクション=Functionの粒度で作成する。今回はWebサイトの監視を行うツールを作成するのでリソース=Siteとし各アクション(show,create,index,delete)をfunctionとして追加すると↓のような構成になる。デフォルトで生成されるファイルはmemorySizeが1024MBになってるけど、そんなに使うこと無ければ最小の128MBとかでもOK。Gatewayにはリクエストやレスポンスを処理する際にデータの形式を変換できるマッピングテンプレートが用意されている。s-function.jsonのrequestTemplatesとresponseTemplatesにそれぞれContent-Typeをキーにして使用するテンプレートを指定する。Velocityが使わている。Frameworkの場合、テンプレートはs-function.json内に記述するかComponentもしくはProject直下のs-templates.jsonに記述する必要がありいずれもJSON形式である。Function内でテンプレート適用したHTMLをビルドする構成にした。context.done();};handler.jsに↑なコードで、テンプレートのHTMLファイルを読み込んで、ejsでパラメータをバインドすることができる。APIとか利用するなら必要)、Webアプリケーションで画面の遷移を伴う場合、遷移先のURLが必要になる。Lambdaからレスポンスとして返すHTML内でそのリンクを記述する必要があるのだけど、Lambda単体ではどういうURLでアクセスされてきたのかは分からない。Requestのマッピングテンプレートを利用する。http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/models-mappings.html#models-mappings-mappings$input.params().header$context.resourcePath$context.stageを組み合わせることでURLが取得できる(相対パスであればstageだけ分かれば問題ない)。Frameworkでは、各Functionのs-function.jsonのrequestTemplatesに上記マッピングパラメータを任意のキーにマッピングすれば、handler.js内のeventオブジェクトに対象に値がセットされた状態で受け取れる。Lambdaを組み合わせたフレームワークだけど、Lambdaのファンクションから他のAWSサービスを利用したいケースもある(DBとか)。今回はデータをDynamoDBにストアしようと思うので、DynamoDBが利用できるようs-resources-cf.jsonに、DynamoDBを利用できるようPolicyの追加と作成するDynamoDBのテーブル情報を定義する。ここまで},...}記述したら上記リソースをAWSの環境に↓のコマンドで反映する。"ap-northeast-1"完了したらAWS上のDynamoDBに↑で定義したテーブルが作成されている。s-resources-cf.jsonに定義したテンプレートを各ステージ毎に展開した結果が、_meta/resourcesと_meta/variablesにそれぞれ保存される。deployコマンドを実行すると、コンソール上でインタラクティブなデプロイができる。Gatewayにデプロイされる。デプロイが完了するとendpointのURLにアクセスすればデプロイしたアプリケーションが確認できる。deployコマンドで直接デプロイも可能。Functionの実行ログは、Functionのディレクトリに移動して↓のコマンドで確認できる。serverlessはコマンドとしては長いのでslsというエイリアスが定義されている。コード今回作ったコードは↓https://github.com/azuchi/serverless-web-monitor今のところできるのはサイトのDynamoDBへの登録・確認と、登録されているサイトへの監視リクエストの発行。今後レスポンスコードによってSNSによる通知の実装やサイトの削除など実装していく。Frameworkでは、以下のようなPluginが提供されている。FrameworkのPluginの作成を支援するためのスタータープロジェクト。Gatewayの呼び出しを全てlocalhostに対して行う。Frameworkのドキュメントでは以下のようなベストプラクティスが紹介されている。Admin権限を持つAWSのアクセスキーを使わないスタートガイド等ではAdmin権限を持つアクセスキーを使っているが、実際には最大でもPowerUserAccess権限までが推奨される。Lambdaのコードベースはできるだけ小さくするコードサイズが小さいほどLambda実行時のコンテナは速く起動し実行される。FunctionsはComponent内のlibフォルダを利用できるため、function内で同じようなコードロジックがある場合はlibフォルダ内に集約するのがオススメ。CloudFormationリソースを整理するCloudFormationのリソースはs-resources-cf.jsonで定義できる。Serverless外でプロビジョニングするのも可能だけど、コードとセットで構成も管理しておくのがオススメ。外部サービスの初期化はLambdaのコード外で行うDynamoDBのようなサービスを使う場合、その初期化はLambdaコード外で行う。initializerやJavaのstaticコンストラクタのような。Function内に書くと、Function実行時に毎回実行されることになる。Framewortkのようにフレームワークで構成を管理できるのは便利。Gatewayのエンドポイントの登録など自動でやってくれるの便利。responseTemplatesにキーが”text/html”で値がVelocityテンプレートなデータを設定するのは可能だけど、VelociityのViewデータを文字列でJSONファイル内に記載するのはシンドイ。外部ファイルを指定できると良いなー。(AWSのコンソールからは任意の形式でテンプレート記述できるので)node.jsなコード書き慣れてないので同期的なコード書いていろいろハマった。コンサルティングパートナー」です。HAWS(HAW+AWS)は、HAWがご提供するクラウドシステム構築のトータルサービスです。その関連会社の商標です。