はじめに
この記事は、QiitaのServerless Advent Calendar 2020 18日目の記事です。
なお来週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の各子項目を参照)
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」フォルダはデプロイ時(正確にはパッケージ時)に出来ます)
- --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名の情報をデプロイ時などで使用する(いちいちコマンド実行時に指定しなくてよい)。 ※コマンド実行時に指定することも可能。 |
# 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が作成されているはずです。
動作確認ですが、Serverless Frameworkには「invoke」という、デプロイしたLambdaを実行できるコマンドがあるので、それを実施します。(もちろんcURLやRest Clientなどから実際に該当URLにリクエストを送って確認してもOKです。)
# ローカルで実行も可能だが(invoke local)、今回はデプロイしたLambdaの動作確認なので、実際にAWSのLambdaを実行する > serverless invoke --function hello
レスポンスで200が返れば、OKです。
これで「Serverless Framework はじめの一歩」はクリアです。お疲れさまでした。
まとめ
いかがでしたか? ザックリとではありますが、Serverless Frameworkの概要をつかんでもらえたかなと思います。
Serverless Frameworkはそれだけでも非常に便利なツールですし、(今回は紹介しなかったけど)プラグインを使って、驚くほど便利な機能を色々追加することもできます。
ぜひ有効活用して、効率的なサーバーレスアプリ開発を行っていただければと思いますし、この記事がその一助になればと思います。
以上です。