今から始めるServerless Frameworkで簡単Lambda開発環境の構築

こんにちは、臼田です。

皆さん、AWS Lambdaは使っていますか?

ちょっとしたスクリプトの実行から、様々なピタゴラ装置までこなせるLambdaはいいですよね。

でも、Lambdaのスクリプトを作成するときのデバッグや、外部プラグイン等も含めてパッケージングしてアップロードするなどのデプロイはちょっと面倒ですよね。

でも、Serverless Frameworkを使えば、ローカル環境でのデバッグも出来ますし、デプロイもあっという間です。

今回は、今からでも始められる、Serverless Frameworkを利用したLambdaの開発環境構築についてまとめました。

はじめに

Serverless Frameworkをインストールする前に、以下の環境を準備してください。

  • node.js (npm) v4以上
  • awsアカウント
  • awscli

node.jsについては、nodebrew等で準備するのもいいかと思います。

[Node.js] nodebrewで任意のバージョンのNode.jsをインストールして、そのバージョンを指定して使う

awscliは下記が参考になります。

【初心者向け】MacユーザがAWS CLIを最速で試す方法

私の環境は以下のようになっています。

$ node -v
v4.3.2
$ aws --version
aws-cli/1.11.44 Python/2.7.10 Darwin/16.4.0 botocore/1.5.7

使ってみる

Serverless Frameworkのインストール

まずは、npmからインストールします。

$ npm install -g serverless

完了したら、動作を確認します。

$ serverless -v

  WARNING: You are running v1.7.0. v1.8.0 will include the following breaking changes:
    - Will replace IamPolicyLambdaExecution resource with inline policies -> https://git.io/vDilm
    - "sls info" will output the short function name rather than the lambda name -> https://git.io/vDiWx

  You can opt-out from these warnings by setting the "SLS_IGNORE_WARNING=*" environment variable.

1.7.0

今回利用したのはversion 1.7なのですが、1.8にて重要な修正が入るため、警告が表示されます。 以降、メッセージを表示する必要はあまりないと思いますので、環境変数を設定して表示を止めます。

$ export SLS_IGNORE_WARNING=*
$ sls -v
1.7.0

これで、警告が表示されなくなりました。bashrcに追記してもいいと思います。

ちなみに、serverlessコマンドは長いので、エイリアスとしてslsが登録されています。 上記のようにサラッと書けるので、以後はこれを使います。

また、slsコマンドをそのまま実行すると、利用できるサブコマンドが確認できるので、合わせてみておくといいかもしれません。

$ sls

Commands
* Serverless documentation: http://docs.serverless.com
* You can run commands with "serverless" or the shortcut "sls"
* Pass "--help" after any <command> for contextual help

config credentials ............ Configures a new provider profile for the Serverless Framework
create ........................ Create new Serverless service
install ....................... Install a Serverless service from GitHub
deploy ........................ Deploy a Serverless service
deploy function ............... Deploy a single function from the service
deploy list ................... List deployed version of your Serverless Service
invoke ........................ Invoke a deployed function
invoke local .................. Invoke function locally
info .......................... Display information about the service
logs .......................... Output the logs of a deployed function
metrics ....................... Show metrics for a specific function
remove ........................ Remove Serverless service and all resources
rollback ...................... Rollback the Serverless service to a specific deployment

AWSアカウントの設定

続いて、AWSのアカウントの設定を行います。

Serverless Frameworkでは、awscliで設定してあるcredentialを利用しています。

設定してある方はそのまま次へ進んでも大丈夫ですが、注意点があります。

Serverless Frameworkの公式ドキュメントには下記のようにあります。

To let the Serverless Framework access your AWS account, we're going to create an IAM User with Admin access, which can configure the services in your AWS account. This IAM User will have its own set of AWS Access Keys.

現状では、Serverless Frameworkを利用するのにAdministratorAccessのポリシーが必要になります。 これは、Serverless Frameworkが急速に開発が進んでいるため、まだ必要な権限を絞れないためです。 実運用での利用の際には詳細を把握して、権限管理をする必要がありますが、 今回は開発環境が目的なため、公式ドキュメント通りに設定します。

マネージメントコンソールにログインしてIAMへアクセスします。 ダッシュボードから「ユーザー」へ移動し、「ユーザを追加」を押します。

iam01_2

ユーザ名に適切なものを設定し、アクセスの種類で「プログラムによるアクセス」にチェックを入れ次へ進めます。

iam02

権限設定で「既存のポリシーを直接アタッチ」を選択して、検索欄から「AdministratorAccess」を検索して選び、次に進みます。

iam03

確認画面が出てくるので、「ユーザーの作成」を押します。

iam04

ユーザーの作成が完了するので、「アクセスキーID」と「シークレットアクセスキー」を控えてください。 「シークレットアクセスキー」は「表示」を押すことにより確認できます。

iam05

  続いて、作成したIAMユーザーをServerless Frameworkで設定します。 とはいっても、実際にはaws configureコマンドのラッパーです。 下記slsコマンド以外に、awscliで設定しても構いません。

sls config credentials --provider aws --key XXXXXXXXXXXXEXAMPLE --secret XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEXAMPLEKEY
Serverless: Setting up AWS...
Serverless: Saving your AWS profile in "~/.aws/credentials"...
Serverless: Success! Your AWS access keys were stored under the "default" profile.

aws configureのdefault設定がすでに入っている場合には、--profileオプションで新しいプロファイルを指定しましょう。 これがないとエラーになります。

catで設定が追加されていることを確認します。

$ cat ~/.aws/credentials
[default]
aws_access_key_id=XXXXXXXXXXXXEXAMPLE
aws_secret_access_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEXAMPLEKEY

これで準備が整いました。

サービスを作成してデプロイ

ここからは、ほぼ一瞬で終わってしまいます。 それがServerless Frameworkの魅力です。

まず、新規のサービスを作成します。 サービスは、Serverless Frameworkでの実行環境になります。

$ sls create -t aws-python -p slstest
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/your/folder/slstest"
 _______ __
| _ .-----.----.--.--.-----.----| .-----.-----.-----.
| |___| -__| _| | | -__| _| | -__|__ --|__ --|
|____ |_____|__| \___/|_____|__| |__|_____|_____|_____|
| | | The Serverless Application Framework
| | serverless.com, v1.7.0
 -------'

Serverless: Successfully generated boilerplate for template: "aws-python"
$ ls slstest/
handler.py serverless.yml

これでslstestフォルダにサービスと、テンプレートのpythonファンクションが作成されました。 中身は以下のようになっています。

handler.py

lambdaファンクションのテンプレートです。 中身にはテスト用のhelloファンクションが定義されています。

serverless.yml

Serverless Frameworkの設定が記載されています。

sls createコマンドのオプションは以下のようになっています。

$ sls create --help
Plugin: Create
create ........................ Create new Serverless service
--template / -t (required) ......... Template for the service. Available templates: "aws-nodejs", "aws-python", "aws-java-maven", "aws-java-gradle", "aws-scala-sbt", "aws-csharp", "openwhisk-nodejs" and "plugin"
--path / -p ........................ The path where the service should be created (e.g. --path my-service)
--name / -n ........................ Name for the service. Overwrites the default name of the created service.

今回はpythonを利用するため、テンプレートにaws-pythonを選びました。

また、新規のスクリプト作成だったので、PATHの指定を行いました。 slstestフォルダが作成されたのはPATHを指定したためです。 既存のものがある場合には、スクリプトが存在するフォルダで-pを利用しないでsls createすればOKです。

デプロイ先のリージョン設定など、細かい部分はserverless.ymlを編集することになりますが、まずは動きを確認するためにslstestフォルダに移動してデプロイをしてみます。

$ cd slstest/
$ sls deploy
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Packaging service...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3 (639 B)...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
..................
Serverless: Stack update finished...
Service Information
service: slstest
stage: dev
region: us-east-1
api keys:
None
endpoints:
None
functions:
slstest-dev-hello

これでデプロイ完了です。

sls deploy一発で終わりです。

本当に、非常に簡単です。

内部的には、CloudFormationのスタックを作成し、それに基づいてIAMやLambda等の設定が行われています。

テストする

デプロイが終わったのでテストしてみます。

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

はい、テストも非常に簡単です。

sls invokeコマンドは下記のようになっています。

$ sls invoke --help
Plugin: Invoke
invoke ........................ Invoke a deployed function
invoke local .................. Invoke function locally
--function / -f (required) ......... The function name
--stage / -s ....................... Stage of the service
--region / -r ...................... Region of the service
--path / -p ........................ Path to JSON or YAML file holding input data
--type / -t ........................ Type of invocation
--log / -l ......................... Trigger logging data output
--data / -d ........................ input data

上記はデータを何も渡さずに実行していますが、データを渡す場合には-dを利用します。

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

inputにデータが渡されていることが確認できます。

更に、sls invoke localコマンドを利用すれば、ローカルデバッグも出来ちゃいます。 リモートとローカルのデバッグがほぼ同じコマンドで出来るので、これまた楽ですね。 ローカルデバッグについては下記を参照してください。

【朗報】Serverless Framework v1.6.0でPythonのローカル実行がサポートされます

serverless.ymlを編集する

リージョンなどの設定はserverless.ymlにあります。

# you can overwrite defaults here
# stage: dev
region: ap-northeast-1  # ここのコメントアウトを外して編集します

設定を保存して、もう一度実行してみます。 ついでに、-vオプションを利用して詳細な動作を確認します。

$ sls deploy -v
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
CloudFormation - CREATE_IN_PROGRESS - AWS::CloudFormation::Stack - slstest-dev
CloudFormation - CREATE_IN_PROGRESS - AWS::S3::Bucket - ServerlessDeploymentBucket
CloudFormation - CREATE_IN_PROGRESS - AWS::S3::Bucket - ServerlessDeploymentBucket
CloudFormation - CREATE_COMPLETE - AWS::S3::Bucket - ServerlessDeploymentBucket
CloudFormation - CREATE_COMPLETE - AWS::CloudFormation::Stack - slstest-dev
Serverless: Stack create finished...
Serverless: Packaging service...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3 (639 B)...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
CloudFormation - CREATE_COMPLETE - AWS::S3::Bucket - ServerlessDeploymentBucket
CloudFormation - CREATE_COMPLETE - AWS::CloudFormation::Stack - slstest-dev
CloudFormation - UPDATE_IN_PROGRESS - AWS::CloudFormation::Stack - slstest-dev
CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup
CloudFormation - CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup
CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - CREATE_COMPLETE - AWS::Logs::LogGroup - HelloLogGroup
CloudFormation - CREATE_COMPLETE - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Policy - IamPolicyLambdaExecution
CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Policy - IamPolicyLambdaExecution
CloudFormation - CREATE_COMPLETE - AWS::IAM::Policy - IamPolicyLambdaExecution
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - CREATE_COMPLETE - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Version - HelloLambdaVersionnjv8umhHX8AljD0VKQUqojKkzU2huW1AkaSample
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Version - HelloLambdaVersionnjv8umhHX8AljD0VKQUqojKkzU2huW1AkaSample
CloudFormation - CREATE_COMPLETE - AWS::Lambda::Version - HelloLambdaVersionnjv8umhHX8AljD0VKQUqojKkzU2huW1AkaSample
CloudFormation - UPDATE_COMPLETE_CLEANUP_IN_PROGRESS - AWS::CloudFormation::Stack - slstest-dev
CloudFormation - UPDATE_COMPLETE - AWS::CloudFormation::Stack - slstest-dev
Serverless: Stack update finished...
Service Information
service: slstest
stage: dev
region: ap-northeast-1
api keys:
None
endpoints:
None
functions:
slstest-dev-hello

Stack Outputs
HelloLambdaFunctionQualifiedArn: arn:aws:lambda:ap-northeast-1:000000000000:function:slstest-dev-hello:1
ServerlessDeploymentBucketName: slstest-dev-serverlessdeploymentbucket-1s9cy3sample

region: ap-northeast-1となり、東京リージョンにデプロイされていることがわかります。

また、-vオプションを利用したことにより、CloudFormationやIAM等がどのように動いているかがよく見えます。

サービスの削除

さて、東京リージョンにもデプロイしたので、最初にバージニアリージョンにデプロイしたものを削除します。

削除にはsls removeコマンドを利用します。

$ sls remove --help
Plugin: Remove
remove ........................ Remove Serverless service and all resources
--stage / -s ....................... Stage of the service
--region / -r ...................... Region of the service
--verbose / -v ..................... Show all stack events during deployment

今回は、設定と異なるリージョンのサービスを削除するので-rオプションを利用します。

$ sls remove -r us-east-1 -v
Serverless: Getting all objects in S3 bucket...
Serverless: Removing objects in S3 bucket...
Serverless: Removing Stack...
Serverless: Checking Stack removal progress...
CloudFormation - DELETE_IN_PROGRESS - AWS::CloudFormation::Stack - slstest-dev
CloudFormation - DELETE_SKIPPED - AWS::Lambda::Version - HelloLambdaVersionAX4wJlYuRhqF6SM5faSInYd2cazQ6N8noFbY7Sample
CloudFormation - DELETE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - DELETE_COMPLETE - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - DELETE_IN_PROGRESS - AWS::IAM::Policy - IamPolicyLambdaExecution
CloudFormation - DELETE_IN_PROGRESS - AWS::S3::Bucket - ServerlessDeploymentBucket
CloudFormation - DELETE_COMPLETE - AWS::IAM::Policy - IamPolicyLambdaExecution
CloudFormation - DELETE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - DELETE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup
CloudFormation - DELETE_COMPLETE - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - DELETE_COMPLETE - AWS::Logs::LogGroup - HelloLogGroup
CloudFormation - DELETE_COMPLETE - AWS::S3::Bucket - ServerlessDeploymentBucket
Serverless: Stack removal finished...

削除が完了しました。

CloudFormationを利用しているので、削除も非常に簡単です。

さいごに

サービスの作成からデプロイ、削除までサクッと出来ました。

これでLambdaを利用するときに、面倒くさいことはあまりやらなくても効率化出来ると思います。

最後に、pythonの外部モジュールを利用する際にも、効率化出来るブログを紹介します。

Serverless Frameworkのプラグインを利用した外部モジュールの管理

Serverless Frameworkを利用して、快適なLambdaライフを送りましょう!