今更だけど、Serverless Frameworkを使う


Serverless Frameworkとは

Serverless Frameworkとは、erverless Applicationを構成管理デプロイするためのツールで、ローカルでのデバッグや、デプロイなんかもアッという間にできてしまうツールです。オープンソースというのは素晴らしいですね。
ということで、今更な気もしますが、実際に使ってみたいと思います。

環境

Windows10
WSL2
Ubuntu 20.04 LTS
Node.js 12.18.3

インストール

Node.jsを使うので、環境がない場合は、事前にこちら
やっておくと便利です。

次に、Serverless Frameworkをインストールします。

$ npm install -g serverless
   ┌───────────────────────────────────────────────────┐
   │                                                   │
   │   Serverless Framework successfully installed!    │
   │                                                   │
   │   To start your first project run 'serverless'.   │
   │                                                   │
   └───────────────────────────────────────────────────┘

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@~2.1.2 (node_modules/serverless/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

+ [email protected]
added 747 packages from 502 contributors in 27.15s

警告が若干出ますが、Macしか対応していない模様なのと、「OPTIONAL DEVENDENCY」なので無視します。

$ serverless --version
Framework Core: 1.79.0
Plugin: 3.7.1
SDK: 2.3.1
Components: 2.34.6

無事インストールができました。

プロジェクトの作成

無事インストールできたので、次にプロジェクトを作成していきます。

$ serverless create -t aws-python3 -n myapp -p myapp
Serverless: Generating boilerplate...
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.79.0
 -------'

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

無事作成できました。

-tでテンプレートを指定します。ここの指定で利用言語も決まります。詳細はこちら

myapp配下に、serverless.yml、handler.pyが作成されていれば、成功です。

AWS にデプロイする

アカウントの設定

事前にServerless framework用のアカウントを作成しておきます。
IAMユーザにAdministratorAccessの管理ポリシーを与えれば、大丈夫ですが、細かい設定はまたの機会に勉強したいともいます。

serverless config credentials --provider aws --key {アクセスキーID} --secret {シークレットアクセスキー}

アクセスキーID、シークレットアクセスキーには作成したIAMアカウントのものを設定してください。

設定がされているかどうかは以下のコマンドで確認が可能です。

$ cat ~/.aws/credentials
[default]
aws_access_key_id=XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

デプロイ

そのままデプロイしてもいいのですが、デフォルトだと、API Gatewayも利用されないので
少しだけ変更してみます。

serverless.yml
functions:
  hello:                              ・・・ 関数名を指定
    handler: handler.hello            ・・・ Handler関数を指定
    events:
      - http:                          
          path: sample/hello          ・・・ APIのリソースを指定
          method: get                 ・・・ HTTPのメソッド

次にデプロイを実行します。

$ serverless deploy -v
Serverless: Stack update finished...
Service Information
service: myapp
stage: dev
region: us-east-1
stack: myapp-dev
resources: 12
api keys:
  None
endpoints:
  GET - https://qcispp8ggg.execute-api.us-east-1.amazonaws.com/dev/sample/hello
functions:
  hello: myapp-dev-hello
layers:
  None

Stack Outputs
HelloLambdaFunctionQualifiedArn: arn:aws:lambda:us-east-1:767994070137:function:myapp-dev-hello:1
ServiceEndpoint: https://qcispp8ggg.execute-api.us-east-1.amazonaws.com/dev
ServerlessDeploymentBucketName: myapp-dev-serverlessdeploymentbucket-1xu5hoa9udend

途中、CloudFormationやらのログが出ますが、無事デプロイされると上記のようなログが出力されます。

疎通確認

上記ログを見るとendpointsに作成されたAPIのパスが表示されていますので、
呼び出してみます。(ブラウザでも、CurlでもOK)

最後に

ここまで、10分もあれば終わりました。AWSのアカウント周りとか若干厄介ですが、かなりラクチンですね。