パパエンジニアのアウトプット帳

30歳に突入した1児のパパエンジニアのブログ

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も気になっているのでまた別の機会に触ってみようと思います。