Serverless Framework を使って AWS Lambda をデプロイしてみる

まちいろでは、これまで AWS Lambda を使って
 ・S3 にアップロードされた画像のサムネイルを生成する
 ・S3 にファイル操作が行われたら nginx のキャッシュを削除する
 ・Lambda の定期実行を利用して、EC2 の自動停止・起動を行う
といったことに活用してきました。

AWS Lambda の管理には様々な手法がありますが、今回は Serverless Framework を利用したデプロイの手順を試してみたいと思います。

Serverless Framework とは?

Serverless Framework とは、AWS Lambda/Azure Function/Google Cloud Functions といったコンピューティングサービスに対応した開発ツールです。このツールを利用することで、各サービスにデプロイする関数の管理イを透過的に行うことができ、またローカルでテストを実行することもできます。

Serverless Framework をインストールする

Serverless Framework は node のライブラリとして提供されているので、npm でグローバルインストールします。現在のバージョンは 1.28.0 のようです。serverless という単語は少し長いため、sls というエイリアスも用意されています。


$ npm install serverless -g
$ serverless -v
1.28.0
$ sls -v
1.28.0

デプロイのための AWS キーを発行する

今回は AWS Lambda に関数をデプロイするため、デプロイを行うための IAM ユーザーを AWS コンソール上で作成し、AWS キーを発行します。

ドキュメントを読む限り、AdministratorAccess ポリシーを付与した IAM Role が必要のようです。これはちょっと抵抗感がありますね。必要なポリシーが多いのでしょうか。。

sls config credentials コマンドで、発行した AWS キーを登録します。--profile でプロファイル名もつけておきます。

$ sls config credentials --provider aws --key xxx --secret xxx --profile serverless-admin

プロジェクトを作成する

sls create コマンドでプロジェクトを作成します。今回は Node.js を選択しました。

$ sls create --template aws-nodejs --path sls-hello
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "xxx"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.28.0
 -------'

Serverless: Successfully generated boilerplate for template: "aws-nodejs"

作成されたディレクトリの中に serverless.yml というファイルがあります。ここに関数の設定や、Lambda がアクセスするリソース、イベントなどを設定していくことになります。

ここでは、Node.js のバージョンや先ほど指定したプロファイル名などを設定します。

provider:
  name: aws
  runtime: nodejs8.10
  region: ap-northeast-1
  profile: serverless-admin

関数をデプロイする

sls deploy コマンドで関数をデプロイします。CloudFormation を使って構築されるため、初回は少し時間がかかります。

$ sls deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (409 B)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
................
Serverless: Stack update finished...
Service Information
service: sls-hello
stage: dev
region: ap-northeast-1
stack: sls-hello-dev
api keys:
 None
endpoints:
 None
functions:
 hello: sls-hello-dev-hello

CloudFormation を見ると、作成されたリソースを確認することができます。S3 はデプロイされる関数の zip ファイルの配置に利用しているようです。

Lambda を見ると、無事デプロイができていました。

関数を実行する

sls invoke コマンドで関数を実行することができます。手元から関数の動作を確認することができます。

$ sls invoke -f hello
{
   "statusCode": 200,
   "body": "{\"message\":\"Go Serverless v1.0! Your function executed successfully!\",\"input\":{}}"
}

-d オプションでパラメータを渡すことができます。-p で JSON ファイルを指定して渡すこともできるので、Lambda のコンソール画面でテストデータを作成して再利用するのが良さそうです。

$ sls invoke local -f hello -d {a:1}
{
   "statusCode": 200,
   "body": "{\"message\":\"Go Serverless v1.0! Your function executed successfully!\",\"input\":\"{a:1}\"}"
}

関数及び関連リソースを削除する

sls remove コマンドで、関数と CloudFormation で作成されたリソースを削除できます。

$ sls remove
Serverless: Getting all objects in S3 bucket...
Serverless: Removing objects in S3 bucket...
Serverless: Removing Stack...
Serverless: Checking Stack removal progress...
....
Serverless: Stack removal finished...

まとめ

Serverless Framework を使って関数をデプロイするところまでを試してみました。CloudFormation を使って関係するリソースを一括で扱えるところが良いですね。今後 Lambda を開発する際に積極的に採用していきたいと思います。

この記事が気に入ったらサポートをしてみませんか?