echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

Serverless Framework はじめの一歩

はじめに

この記事は、QiitaのServerless Advent Calendar 2020 18日目の記事です。

qiita.com

なお来週12/25(金)にも、AWS Advent Calendar 2020最終日の記事として「aws-sdk-mockを使ったAWSのテスト」の記事を投稿しますので。そちらもよろしくお願いします。
qiita.com

今回の記事について

今年もAdvent Calendarが始まりました。
昨年と同様、Serverlessにもたくさんの記事が投稿されています。

そして、Serverless Frameworkに関する記事もたくさん投稿されています。

「Serverless」のアドベントカレンダーに参加するにあたり、最初はServerless FramewrokのTips系にしようと考えていました。(個人的にもServerless Framewrok大好きなので)

しかし、今回それ系の記事(=Serverless Frameworkをある程度知っている前提)を書く人が結構多いので、いっそのこと、Serverless Frameworkをあまり知らない人向けに記事を書くことにしました。

今回のメインターゲット

  • Serverless Frameworkを全く知らない
  • Serverless Frameworkは知っているが、やり方がよくわからない

Serverless Frameworkとは?

サーバーレスアプリを構成管理&デプロイするためのオープンソースツールです。
AWS CloudFormationやAzure Resource Managerなど、IaC(Infrastructure as Code)の機能を使い、コードベースでのサーバーレスアプリの構成管理を行ったり、各クラウドへのデプロイを行えたりします。

その他、AWS・Azure・GCPを始め、数多くのクラウドをサポートしています。(一番機能が豊富なのはAWS)

また、他にも下記のようなことができるのが特徴です。(あくまで一例)

  • 豊富なテンプレート(=プログラム言語対応)
  • Serverless FrameworkのダッシュボードからCI/CDを実現できる
  • 公式ドキュメントが結構充実している&英語も読みやすい(個人的には)
  • プラグイン(=拡張機能)をインストールして、機能を拡張できる

※Serverless Framework公式ページ: www.serverless.com

導入のメリットは?

※これ以降、すべてAWS前提で書きます。(先述の通り、一番機能が豊富なので)

もちろん先程挙げた点もメリットなのですが、1つだけ挙げるとするならば、個人的には

Lambda定義が非常にシンプル

な点だと思います。

実際、AWSのサーバーレスアプリで一番多く作成するリソースがLambdaだと思うので、Lambdaの定義が非常にシンプルなのは、非常に大きなメリットです。

具体例

例えばCloudFormation構文で、よくあるRest API的なLambdaを作成する場合、

  • API Gateway本体(Type: AWS::ApiGateway::RestApi)を作って...
  • API Gatewayのリソースパス(Type: AWS::ApiGateway::Resource)を作って...
  • API Gatewayのメソッド(AWS::ApiGateway::Method)を作って...
  • Lambdaに割り当てるIAM Role(AWS::IAM::Role)作って(Cloudwatchへの書き込み権限など)...
  • Lambda本体(AWS::Lambda::Function)を作って...
  • CloudWatchのLogGroup(AWS::Logs::LogGroup)作って...

みたいな感じで、すごく膨大な量の定義を作ることになり、めちゃくちゃ大変だと思います。(めちゃくちゃ長くなるので、ソースは省略)

これがServerless Frameworkだと、下記7行の定義だけで、上記のことがすべてできてしまいます。

# Serverless FrameworkのLambda定義例
Makky12Lambda:
  handler: makky12.handler
  name: Makky12Lambda
  events:
    - http:
        path: /hoge
        method: get

また、Lambdaはたいてい何かしらのトリガーで起動しますが、トリガ周りの定義も簡単です。 以下に一例を挙げます。(他にもたくさんあります。下記URLの各子項目を参照)

www.serverless.com

Makky12Lambda:
  handler: makky12.handler
  name: Makky12Lambda
  events:
    - http:  # API Gatewayトリガ
        path: /hoge
        method: get
    - s3:  #S3バケットトリガ(ファイル保存時に発生)
        bucket: makky12-bucket #バケット名
        event: s3:ObjectCreated:*
    - stream:  #DynamoDBトリガ(データ追加・変更・削除)
        type: dynamodb
        arn: (DynamoDBテーブルのARN)
    - schedule: cron(0 12 * * ? *)  #CloudWatchイベントトリガ(スケジューラ)

こんな感じで、Lambdaが非常に簡単に定義できてしまうのが、Serverless Frameworkの魅力の一つです。

インストール&プロジェクト作成

と、ここまででなんとなく概要は話しましたので、さっそくインストール&プロジェクト作成を行いましょう。

インストール

インストールは、下記コマンドで実施します。

# グローバルじゃなくてもいいけど、たぶんグローバルの方が便利だと思う。
> npm i serverless -g
プロジェクト作成

プロジェクト作成は、下記コマンドで行えます。

# 代表的なオプションは、下表を参照。
> serverless create --template aws-nodejs --name hoge  
  
# なお'serverless'コマンドには'sls'というエイリアスがあるので、  
# これでも実行可能。  
# ただしPowerShellだとエラーになる。(Select-Stringのエイリアスと
# 勘違いされる)
# 昔は'slss'というエイリアスがあったが、ver1.9あたりで削除された...
> sls create --template aws-nodejs --name hoge
オプション 意味 デフォルト値
--template 作成プロジェクト(言語など)のテンプレート 省略不可
--name プロジェクト名 Serverless Frameworkが命名
--path プロジェクト作成先フォルダ カレントフォルダ

※「--template」に指定するテンプレートの種類は、こちらを参照。 https://www.serverless.com/framework/docs/providers/aws/cli-reference/create/

プロジェクトを作成すると、プロジェクトを作成したフォルダに「handler.js」及び「serverless.yml」の2ファイルができると思います。(--templateで指定したテンプレートにより異なります。ここでは「aws-nodejs」を指定した前提で進めます)

※下画像では他のファイル・フォルダが出来ていますが、「handler.js」及び「serverless.yml」の2ファイルさえあればOKです。(「.serverless」フォルダはデプロイ時(正確にはパッケージ時)に出来ます) image.png

  • --templateで「aws-nodejs-typescript」を指定した場合、「serverless.yml」が「serverless.ts」になっていますが、定義する項目は同じです。
  • プロジェクトを作成するフォルダに既にpackage.jsonや(aws-nodejs-typescriptの場合)tsconfig.jsonがあるとエラーになるので、その場合は一度リネームしたり、別フォルダに退避してください。

serverless.ymlで確認する項目

といっても、ただ動かすだけならほとんど手を加える必要はないですが、「provider」セクションの下記項目だけ、確認&変更(コメント解除)しておきましょう。

項目 意味 デフォルト値 備考
region デプロイ先のリージョン。 us-east-1(バージニア北部) 多分、これ読んでる人は大抵がap-northeast-1(東京)かと
profile デプロイに使用するAWSプロファイル名 なし 設定すると、credential情報内の指定したprofile名の情報をデプロイ時などで使用する(いちいちコマンド実行時に指定しなくてよい)。
※コマンド実行時に指定することも可能。
  • credential情報は、下記コマンドやAWS CLIで作成できます。
    • AWS CLIについては各自調べてください
  • keyやsecretの値は、事前にIAMで作成しておいてください。
    • これも、わからなければ各自調べてください。
# keyはアクセスキー、secretはシークレットアクセスキー。  
# providerはクラウドごとに一意の値。(awsは「aws」固定)
# profileはプロファイル名(オプション)。省略時は「default」になる。
> serverless config credentials --provider aws --key key --secret secret --profile custom-profile

デプロイ&動作確認

では、ここまで終わったら、さっそくデプロイします。

「え?Lambdaは?」と思うかもしれませんが、serverless.ymlにはデフォルトでhandler.jsというjsファイル(=Lambdaのソースファイル)、およびこれをAPI Gateway経由で(=Rest APIとして)起動する定義がされていますので、Lambda周りは一切触らないでOKです。

デプロイは、下記コマンドで実施できます。

# -vオプションを付けると、デプロイ状況を確認できるようになる。
# (なくてもデプロイ自体はできる)
> serverless deploy -v

デプロイに問題なければ、下記のようなメッセージ作成され、実際にAWSを見ると、stackやAPI-Gateway、Lambdaが作成されているはずです。
image.png

動作確認ですが、Serverless Frameworkには「invoke」という、デプロイしたLambdaを実行できるコマンドがあるので、それを実施します。(もちろんcURLやRest Clientなどから実際に該当URLにリクエストを送って確認してもOKです。)

# ローカルで実行も可能だが(invoke local)、今回はデプロイしたLambdaの動作確認なので、実際にAWSのLambdaを実行する
> serverless invoke --function hello

レスポンスで200が返れば、OKです。 image.png

これで「Serverless Framework はじめの一歩」はクリアです。お疲れさまでした。

まとめ

いかがでしたか? ザックリとではありますが、Serverless Frameworkの概要をつかんでもらえたかなと思います。

Serverless Frameworkはそれだけでも非常に便利なツールですし、(今回は紹介しなかったけど)プラグインを使って、驚くほど便利な機能を色々追加することもできます。

ぜひ有効活用して、効率的なサーバーレスアプリ開発を行っていただければと思いますし、この記事がその一助になればと思います。

以上です。