概要
アプリケーションフレームワークのServerlessを試してみたところ、ローカルでLambdaの実行やデプロイが可能だったので、今稼働しているAWS Mobile HubでAMIMOTOマネージドホスティングの管理をサーバレスにした話で書いたAMIMOTOの管理ツールで使っているLambdaファンクションをServerlessで再構築しました。
Serverless Frameworkのインストールと設定
サーバレスアプリケーションフレームワーク JAWS を使ってみる
AWS Lambdaを活用したServerless Frameworkを触ってみる
上記の記事を参考にServerlessの初期インストールとセットアップを行います。
ServerlessでLambdaファンクションを作る
AMIMOTO Mobileアプリケーションは以下の6つのファンクションで構成されています
function名 | 役割 |
---|---|
get-metric-cpu | CloudWatchのCPUメトリックを取得 |
describe-instance-by-id | EC2インスタンスのinstance_idからメタ情報を取得 |
describe-instances | EC2インスタンスのメタ情報のリストを取得 |
start-instance | EC2インスタンスを起動 |
stop-instance | EC2インスタンスを停止 |
modify-instance | EC2インスタンスのインスタンスタイプ変更 |
以下のコマンドにてひとつづつ必要な関数を作っていきます
$ serverless function create <ファンクション名>
実際に動作するLambdaファンクションはlibディレクトリ以下に配置されます。
最初はindex.jsがあるのみなので、それぞれ必要なファンクション毎に分けて上げる必要があります。
こんな感じでリネームしてコードを書きます。
var AWS = require('aws-sdk');
AWS.config.update({region: 'ap-northeast-1'});
module.exports.respond = function(event, cb) {
console.log(event.instance_id);
var ec2 = new AWS.EC2();
var params = {
InstanceIds: [
event.instance_id
]
};
ec2.startInstances(params, function(err, data) {
if (err){ console.log(err, err.stack);
} else {
ec2.waitFor('instanceRunning', params, function(err, data) {
if (err) {
console.log(err, err.stack);
} else {
return cb(null, JSON.stringify(data));
}
});
}
});
};
start-instance/handler.jsにてrequreする関数を上記の関数にするように修正します。
また、入力値としてevent変数に渡す値はevent.jsonに記述します
{"undefined":{"instance_id":"<インスタンスID>"}}
ローカルでLambdaファンクションを実行
$ sls function run
このコマンドでファンクションを選んで実行できます
コマンド発行後、実行したい関数をコマンドラインで選択して実行しますBlue Green デプロイメント
Serverlessフレームワークを使うとBlue Green デプロイメントもコマンドラインのみで実行可能です。
こんな感じで本番用のタグを作ります。
$ sls stage create -s prod -r us-east-1
そして作ったLambdaファンクションをデプロイする場合は以下のコマンドで可能です
$ sls function deploy
まとめ
ローカルでLambdaファンクションの実行とデプロイが出来るのは非常に良いです。
マネジメントコンソール上だとLambdaファンクションがどのプロジェクトで使われていて、必要不必要もよくわからなくなります。しかし、Serverlessフレームワークを使うことで必要なLambdaファンクションがプロジェクトごとに管理できるので非常にやりやすいです。
後はテストのやり方がServerlessフレームワーク内で保管してもらえればすごい良さそう
それではよいServerlessライフを!