Serverless Framework を使えばサーバレス開発がもっと楽しくなりそう
公開日:
:
AWS, クラウド, ツール, 開発 APIgateway, Bot, framework, Lambda, Serverless, フレームワーク
前回、AWS Lambda を使って LINE の Bot を作ってみましたが、実は正直、Lambda の実装~デプロイはちょっと面倒なところがありました。
Lambda に搭載されていないモジュールが必要なときは AWS の GUI エディタ上では実装できず、デプロイ時にソースファイルを zip 化してアップロードしないといけませんでした。また、Lambdaに限らず AWS リソースの手配や管理も量が増えてくると大変です(リソースの消し忘れとか)。
しかしそんな問題を解決してくれるものが既にありました…。
その名も Serverless Framework!
AWS Lambda を用いたサーバレス開発をサポートしてくれるフレームワークです。
今年の9月頃に正式に v 1.0 としてリリースされていたようです。そして現在(2016/11/10 時点)では既に v 1.1.0 となっています。
今回はこの Serverless Framework の Hello, world 実践と、前回作成した LINE Bot をコマンド一発で Lambda にデプロイできるようにしたいと思います。
1. Serverless Framework の Hello, world
1 – 1. インストール
1 2 3 4 |
$ nvm install v4.3 $ node -v $ npm install -g serverless $ serverless --version |
1 – 2. AWSアカウント設定
管理者権限の IAMユーザを作成してセットします。
(現時点では管理者権限である必要があるようです)
1 2 |
$ export AWS_ACCESS_KEY_ID=(Access Key) $ export AWS_SECRET_ACCESS_KEY=(Secret Key) |
もしくは AWS CLI を使用してユーザ情報をセットします。
(こちらは永続的な設定)
1 2 3 4 5 |
$ aws configure AWS Access Key ID [None]:(Access Key) AWS Secret Access Key [None]:(Secret Key) Default region name [None]: ap-northeast-1 Default output format [None]:json |
1 – 3. Serverlessサービスを作成
1 2 3 |
$ mkdir FirstTest $ cd FirstTest $ serverless create --template aws-nodejs |
※–template は以下のような言語別のテンプレートを指定します。
・aws-python
・aws-java-gradle
・aws-java-maven
1 2 3 4 5 6 7 8 9 10 11 |
Serverless: Generating boilerplate… _______ __ | _ .-----.----.--.--.-----.----| .-----.-----.-----. | |___| -__| _| | | -__| _| | -__|__ --|__ --| |____ |_____|__| \___/|_____|__| |__|_____|_____|_____| | | | The Serverless Application Framework | | serverless.com, v1.1.0 -------' Serverless: Successfully generated boilerplate for template: "aws-nodejs" Serverless: NOTE: Please update the "service" property in serverless.yml with your service name |
そして、上記の文言が表示されると以下の3つのファイルが生成されています。
・event.json : テスト用パラメータ
・handler.js : ソースファイル
・serverless.yml : 設定ファイル
※コマンドの “serverless” は “sls” でも実行可能です。
1 – 4. サービスデプロイ
serverless.yml ファイルの設定項目を以下のように編集します。
1 2 3 4 5 6 7 |
service: serverless-test # NOTE: update this with your service name provider: name: aws runtime: nodejs4.3 stage: prod region: ap-northeast-1 |
deploy コマンドを実行すると、以下のようにずらずらと起動ステータスが表示されます。内容をみるに、この Serverless Framework は CloudFormation を作成していることがわかります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
$ serverless deploy -v Serverless: Creating Stack... Serverless: Checking Stack create progress... CloudFormation - CREATE_IN_PROGRESS - AWS::CloudFormation::Stack - serverless-test-prod CloudFormation - CREATE_IN_PROGRESS - AWS::S3::Bucket - ServerlessDeploymentBucket CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution CloudFormation - CREATE_IN_PROGRESS - AWS::S3::Bucket - ServerlessDeploymentBucket CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution 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_COMPLETE - AWS::S3::Bucket - ServerlessDeploymentBucket CloudFormation - CREATE_COMPLETE - AWS::CloudFormation::Stack - serverless-test-prod Serverless: Stack create finished... Serverless: Packaging service... Serverless: Uploading CloudFormation file to S3... Serverless: Uploading service .zip file to S3... Serverless: Updating Stack... Serverless: Checking Stack update progress... CloudFormation - CREATE_COMPLETE - AWS::CloudFormation::Stack - serverless-test-prod CloudFormation - UPDATE_IN_PROGRESS - AWS::CloudFormation::Stack - serverless-test-prod CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction CloudFormation - CREATE_COMPLETE - AWS::Lambda::Function - HelloLambdaFunction CloudFormation - UPDATE_COMPLETE_CLEANUP_IN_PROGRESS - AWS::CloudFormation::Stack - serverless-test-prod CloudFormation - UPDATE_COMPLETE - AWS::CloudFormation::Stack - serverless-test-prod Serverless: Stack update finished... Service Information service: serverless-test stage: prod region: ap-northeast-1 api keys: None endpoints: None functions: serverless-test-prod-hello: arn:aws:lambda:ap-northeast-1:******:function:serverless-test-prod-hello |
正常にデプロイが終了すれば、invoke コマンドでサービスを実行させてみることができます。
1 2 3 4 5 |
$ serverless invoke --function hello -p event.json { "statusCode": 200, "body": "{\"message\":\"Go Serverless v1.0! Your function executed successfully!\",\"input\":{\"key3\":\"value3\",\"key2\":\"value2\",\"key1\":\"value1\"}}" } |
実際に AWS のマネジメントコンソールをみてみると、serverless.yml に指定した通りに Lambda Function と CloudFormation の Stack が作成されていることが確認できます。
2. LINE Bot をコマンド一発で Lambda にデプロイ
せっかくなので、前回の LINE 雑談 Bot を Serverless Framework で作ってみます。
といっても、serverless create したディレクトリ内にメインのソースファイル(index.js)と node_modules/request モジュールを配置し、あとは serverless.yml ファイルを編集するだけで準備は完了です。
実際に編集した serverless.yml が以下となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# NOTE: update this with your service name service: linebotfactory provider: name: aws runtime: nodejs4.3 stage: prod region: ap-northeast-1 # you can add statements to the Lambda function's IAM Role here iamRoleStatements: - Effect: "Allow" Resource: "arn:aws:dynamodb:ap-northeast-1:*:*" Action: - "dynamodb:GetItem" - "dynamodb:PutItem" functions: linebot: handler: index.handler events: - http: path: linebot method: post # you can add CloudFormation resource templates here resources: Resources: linebotfactory: Type: AWS::DynamoDB::Table Properties: TableName: linebotfactory_table AttributeDefinitions: - AttributeName: mid AttributeType: S KeySchema: - AttributeName: mid KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1 |
まずは作成する Lambda Function 用の IAM ロールの設定を記述します。
今回は東京リージョンの DynamoDB をリソースとし、テーブルからの値の取得と更新を許可するようにします。
1 2 3 4 5 6 |
iamRoleStatements: - Effect: "Allow" Resource: "arn:aws:dynamodb:ap-northeast-1:*:*" Action: - "dynamodb:GetItem" - "dynamodb:PutItem" |
次に API Gateway の設定を記述します。
handler には ファイル名.ハンドラ名 を、events 以下の http : method には post を指定します。
1 2 3 4 5 6 7 |
functions: linebot: handler: index.handler events: - http: path: linebot method: post |
そして DynamoDB のテーブルを定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
resources: Resources: linebotfactory: Type: AWS::DynamoDB::Table Properties: TableName: linebotfactory_table AttributeDefinitions: - AttributeName: mid AttributeType: S KeySchema: - AttributeName: mid KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1 |
まぁ正直、ここまでの設定方法は以下のページにほぼ書いてある内容ですね…。
https://serverless.com/framework/docs/
ではいよいよ、コマンド一発で Lambda にデプロイしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ serverless deploy -v : (省略) : Serverless: Stack update finished... Service Information service: linebotfactory stage: prod region: ap-northeast-1 api keys: None endpoints: POST - https://******.ap-northeast-1.amazonaws.com/prod/linebot functions: linebotfactory-prod-linebot: arn:aws:lambda:ap-northeast-1:******:function:linebotfactory-prod-linebot Stack Outputs LinebotLambdaFunctionArn: arn:aws:lambda:ap-northeast-1:******:function:linebotfactory-prod-linebot ServiceEndpoint: https://******.ap-northeast-1.amazonaws.com/prod ServerlessDeploymentBucketName: linebotfactory-prod-serverlessdeploymentbucket-****** |
無事に Lambda にデプロイされました!
最後に Service Information の endpoints: に URL が表示されます。これを LINE Messaging API の Webhook URL に登録すれば Bot 完成!
いや~これはかなり便利です。もしリソースが不要になれば、以下のコマンドで CloudFormation の Stack ごと(S3も)削除してくれます。
1 |
$ serverless remove |
開発してくれた人に感謝ですねホント(-人-)アリガタヤ
AWSへのデプロイがラクになるのはもちろんのこと、ソースコードだけでなく yml 設定ファイルもバージョン管理できますし、今後のサーバレス開発では欠かせないツールになりそうな予感がしますね!
Ex. Github に 雑談Bot あります
今回と前回で作成した LINE 雑談 Bot のソースを Github に置きました。もし必要な方はご自由にお使いください。
https://github.com/SKazuki/LineBotServerlessDocomoAPI
※ソースが汚い等の苦情は受け付けますが、何か問題が起きても責任は取れません m(_ _)m
こちらのらくがきもどうぞ。
関連記事
-
Qiita風ナレッジ共有ツール Knowledge
「情報共有」ってなかなか難しいですよね。 プロジェクトに直接関係する内容なんかであれば、各プロ
-
Oracle Cloud で仮想サーバを立ててみた
クラウドのインフラサービス(IaaS)というと、普段はやはり Amazon Web Services
-
LINE Messaging API と AWS Lambda で LINE BOT を作ってみた
手段「これってもしかして」 目的「私たち」 「「入れ替わってる〜〜〜〜?」」 — みすま
-
AWS認定ソリューションアーキテクトになりました(アソシエイト)
久しぶりに資格試験を受けてきました。たぶん6年振りくらい。無事に合格しました。(内心ホッとし