Serverless Framework for Rubyをやってみる
AWS LambdaにRubyがきたので、Lambdaをより使う意欲が出てきた。(今まではpythonがほとんどでたまにnodejsで書いていた)
そこで、前からLambdaやるならServerless/Apexのどちらかかなーと思っていたのでまずはServerless Frameworkを試してみる。
serverlessのインストール
まずは、serverlessのインストールから。
Railsで染み付いたのかglobalにインストールするのがなんか嫌なので、プロジェクト直下にインストールします。
あと特にこだわり無いですがyarnが入っているのでnpmではなくyarnでやります。
$ mkdir sample-serverless $ cd sample-serverless $ yarn init $ yarn add serverless
package.jsonにscriptsを定義
このままだとservelessコマンドが実行できないのでpackage.jsonにscriptsを追加します。
$ vi package.json --- { "name": "sample-serverless", "version": "1.0.0", "main": "index.js", "license": "MIT", "scripts": { "serverless": "serverless" }, "dependencies": { "serverless": "^1.36.3" } }
Rubyのテンプレートからサンプルプロジェクトを作成
準備が整ったので、Rubyのテンプレートからサンプルプロジェクトを作成します。
$ yarn run serverless create --template aws-ruby yarn run v1.7.0 $ serverless create --template aws-ruby Serverless: Generating boilerplate... _______ __ | _ .-----.----.--.--.-----.----| .-----.-----.-----. | |___| -__| _| | | -__| _| | -__|__ --|__ --| |____ |_____|__| \___/|_____|__| |__|_____|_____|_____| | | | The Serverless Application Framework | | serverless.com, v1.36.3 -------' Serverless: Successfully generated boilerplate for template: "aws-ruby" Serverless: NOTE: Please update the "service" property in serverless.yml with your service name ✨ Done in 1.87s.
デプロイ前の準備
あとは、serverless deployコマンドを打つだけ!と言いたいところですが、このままではawsへデプロイできません。
deployコマンドを実行できるようにするには、awsのcredentialsを設定する必要があります。
※公式のドキュメント参照
Serverless Framework - AWS Lambda Guide - Credentials
私の環境はすでにaws cliをインストールしているので、下記のコマンドを利用してプロファイルを新規に作成しそれを利用します。
$ aws configure --profile serverless_development あとは聞かれる通りにaccess keyやsercret keyの情報を入力していきます。
プロファイルが作成できたら、serverless.ymlに追加します。
$ vi serverless.yml --- ※コメント省いてます service: sample-serverless provider: name: aws runtime: ruby2.5 profile: serverless_development # aws configure --profile xxxで作成したやつ region: ap-northeast-1 stage: dev functions: hello: handler: handler.hello
これで準備は完了です。
デプロイ!
それでは、serverless deployを実行です。
$ yarn run serverless deploy -v yarn run v1.7.0 $ serverless deploy -v Serverless: Packaging service... Serverless: Excluding development dependencies... Serverless: Creating Stack... Serverless: Checking Stack create progress... CloudFormation - CREATE_IN_PROGRESS - AWS::CloudFormation::Stack - sample-serverless-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 - sample-serverless-dev Serverless: Stack create finished... Serverless: Uploading CloudFormation file to S3... Serverless: Uploading artifacts... Serverless: Uploading service .zip file to S3 (15.08 MB)... Serverless: Validating template... Serverless: Updating Stack... Serverless: Checking Stack update progress... CloudFormation - UPDATE_IN_PROGRESS - AWS::CloudFormation::Stack - sample-serverless-dev CloudFormation - CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution CloudFormation - CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup CloudFormation - CREATE_COMPLETE - AWS::Logs::LogGroup - HelloLogGroup CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution CloudFormation - CREATE_COMPLETE - AWS::IAM::Role - IamRoleLambdaExecution 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 - HelloLambdaVersionNxhCrecCdNcXpcb9fj6uPopa8NgeMn3M05zFw92CIUQ CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Version - HelloLambdaVersionNxhCrecCdNcXpcb9fj6uPopa8NgeMn3M05zFw92CIUQ CloudFormation - CREATE_COMPLETE - AWS::Lambda::Version - HelloLambdaVersionNxhCrecCdNcXpcb9fj6uPopa8NgeMn3M05zFw92CIUQ CloudFormation - UPDATE_COMPLETE_CLEANUP_IN_PROGRESS - AWS::CloudFormation::Stack - sample-serverless-dev CloudFormation - UPDATE_COMPLETE - AWS::CloudFormation::Stack - sample-serverless-dev Serverless: Stack update finished... Service Information service: sample-serverless stage: dev region: ap-northeast-1 stack: sample-serverless-dev api keys: None endpoints: None functions: hello: sample-serverless-dev-hello layers: None Stack Outputs HelloLambdaFunctionQualifiedArn: arn:aws:lambda:ap-northeast-1:123456789012:function:sample-serverless-dev-hello:1 ServerlessDeploymentBucketName: sample-serverless-dev-serverlessdeploymentbucket-xxxxxxxxxxxx ✨ Done in 84.97s.
デプロイが完了しました。
serverless deployを実行すると、Lambdaのファンクションを作成するだけではなくS3のバケットやIAMロール、CloudwatchのロググループなどもCloudformationを利用して作成するようです。
デプロイしたLambdaファンクションを実行
デプロイしたLambdaファンクションの実行は、serverless invokeで行います。
$ yarn run serverless invoke --function hello yarn run v1.7.0 $ serverless invoke --function hello { "statusCode": 200, "body": "\"Go Serverless v1.0! Your function executed successfully!\"" } ✨ Done in 2.34s.
テンプレートのhelloメソッドそのままですが、ちゃんと実行されているようです。 ※Cloudwatchのログを確認するとログが出力されているはずです。
httpからアクセスできるようにする
現状はlambda関数をそのまま呼び出しているだけなので、httpアクセスで呼べるようにしてみます。
下記のようにeventsのhttpを設定することでhttpアクセスが可能になります。
$ vi serverless.yml --- functions: hello: handler: handler.hello events: - http: path: hello method: get
これでデプロイするこ今度は新たにAPI Gatewayが作成され、API Gatewayを利用してhttpでアクセスできます。
$ curl deploy後に表示されているServiceEndpoint/hello "Go Serverless v1.0! Your function executed successfully!"
ブラウザからアクセスしても同様の文字列が表示されるのでバッチリです。
とりあえずのチュートリアルレベルのことをやってみただけですが、Serverlessを利用してAWSヘデプロイできました。
ちょうど色々なツールをwebhookで連携したかったので、Serverlessを色々触ってみようと思います。
また、Apexも気になっているのでまた別の機会に触ってみようと思います。