SlideShare a Scribd company logo
Serverless Framework Pluginで行う
Lambdaテスト
Author: Masaki Suzuki
@makky12
自己紹介
• 名前:鈴木 正樹 (Masaki Suzuki)
• 在住:愛知県半田市
• 職業:フリーランスエンジニア
• 業務:サーバーレスアプリのアーキテクチャ構築/設計/開発/テスト など
• 技術:
• AWS/Serverless Framework/サーバーレス全般
• 各種イベント・SNS・ブログでのクラウド普及活動(個人的に)
• JavaScript/TypeScript/AWS Amplify/Jest/MS系技術
• SNS
http://makky12.hatenablog.com/
https://github.com/smt7174
@makky12 (Masaki Suzuki@フリーランスクラウドエンジニア)
名古屋市
豊橋市
本日お話しすること
• Lambdaのテストについて(少し)
• Serverless Frameworkの概要
• Serverless Frameworkのテスト用プラグイン
• Serverless Offline
• Serverless-DynamoDB-Local
• Serverless-S3-Local
資料&サンプルアプリ
• 本日の発表資料&作成アプリは、以下の場所で公開してます
• SlideShare
• 登壇資料URL(SpeakerDeck or SlideShare)
• connpassの資料ページにもリンクを載せています
Lambdaのテストについて
ところで
Lambdaのテスト、どうしてますか?
Lambdaテストの方法(一例)
• テストフレームワーク(Jest/Mocha)によるテスト(単体テスト)
• 内部ロジックのテスト
• テストコードの作成/必要に応じてMock化が必要
• AWSリソースにアクセスする部分がネック(Mock関数作成が必要)
• Dockerなどコンテナによるテスト環境構築(結合テスト)
• 各種テスト用コンテナイメージの導入
• 便利な反面、Dockerの環境構築がネック(かも)
• これもAWSリソースにアクセスする部分がネック
• AWS上(開発環境/テスト環境)で直接実行(結合テスト)
• 実際のAWS環境で確認可能(AWSリソースへのI/Oなど)
• いちいち修正するたびにデプロイ&動作確認が面倒
• コスト面の問題も
Serverless Frameworkを使用する
Serverless Framework Pluginでテストを行う
【参考】Serverless Frameworkとは
• サーバーレスアプリの構築・開発・運用管理をサポートするOSS
• 公式URL: https://serverless.com/
• Infrastructure as Code(IaC)によるリソース管理&環境構築が可能
• AWS・Azure・GCPなど、多数のクラウドに対応(一番機能が豊富なのはAWS)
• CI/CD・モニタリングなども対応
• CloudFormation構文に比べて、定義がシンプル(特にLambda)
• その他、以下の特徴がある
• 豊富なテンプレート(=プログラム言語対応)
• 公式ドキュメントが結構充実&英語が読みやすい(個人的に)
• プラグインによる機能拡張が可能(プラグインの自作も可能)
• 今回はこの「プラグイン」によるLambdaテストを実施する
使用するPlugin
• Serverless Offline
• ローカル環境にAPI Gateway・Lambdaの環境を構築する
• ローカルホストのエンドポイントURLから、Lambdaをローカル実行可能
• Serverless-DynamoDB-Local
• DynamoDB-Localの環境をローカルに構築する(実行にはJDKが必要)
• ローカルホストのURLから、DynamoDB-Localを操作可能
• serverless.ymlの定義からテーブル&初期データの設定が可能
• Serverless-S3-Local
• ローカルフォルダ/ファイルをS3バケット/キーとして使用できる
• ローカルホストのURLから、上記バケット/キーを操作可能
メリット
• 導入が簡単
• npm installコマンド(とJDKインストール)を実行するだけ
• 定義が必要な項目が少ない(ほとんどがデフォルト値でOK)
• DynamoDBやS3バケットは、Resourcesの設定をそのまま使用可能
• CLIコマンド1つで実行可能(例:serverless offline など)
• AWSリソースにアクセスする部分に関して、特別な作業がほとんど不要
• インスタンス生成時(new xx())にendpoint(+α)を定義するだけ
• 実際にリソースにアクセスする箇所は、一切変更不要
• Mock関数・代替処理の作成が不要
• トリガイベントにも対応
• Pluginで作成したDynamoDBやS3のトリガイベントで、別Lambdaを起動できる
設定(serverless.yml/Lambdaソース)
Demo
デモ(動画)
デモ(ドルアーガの塔 宝箱情報取得Lambda)
• 宝箱情報を取得したい階数(floor)をクエリパラメータで指定してリクエスト
• 細かい処理は行わない(バリデーション、存在しない階数の指定時対応 など)
• Lambda側の処理
• DynamoDBのtower-of-druagaテーブルから、指定階の宝箱情報を取得する
• 取得した宝箱情報を、下記のS3バケット&キーに保存する
• バケット:suzukima-s3-local-test-bucket
• キー:tower-of-druaga.json
• 上記処理がすべて終わったら、取得した宝箱情報をレスポンスで返却する
• 詳細は下記ブログ(Qiita AWS Advent Calender2020の私の記事)を参照
• 【AWS】aws-sdk-mockでLambdaテストを行う
構成
Lambda
CloudWatch
tower-of-druaga
suzukima-s3-local-test-bucket
(tower-of-druaga.json)
API Gateway
ユーザー(リクエスト)
まとめ
• Serverless Frameworkには、便利なテスト用Pluginがある
• Serverless Offline/Serverless-DynamoDB-Local/Serverless-S3-Local
• 導入が簡単というのが特徴
• Pluginを活用して、各種作業を効率的に行おう
• テスト以外にも役立つPluginが非常に多いので、一度探してみるとよい
• URL:https://www.serverless.com/plugins/
• 何が何でも「今回紹介したやり方を使うべき!」と言いたいわけではない
• 各人使いやすい(使い慣れた)ツールも異なるし、状況も色々と異なる
• 大切なのは「各種作業を効率的に行える」事である
• あくまでも「そのための手段の一つ」として参考にして頂ければと思います
• 個人的にはServerless Framework(とAWS)が大好きです!
参考資料
• Serverless Frameworkについて
• 公式ページ
• https://www.serverless.com/
• Serverless Frameworkはじめの一歩(私のAdventCalendar 2020の記事)
• https://makky12.hatenablog.com/entry/2020/12/18/070000?_ga=2.73413648.381045335.1
609757164-493705487.1601719323
• 各種PluginのURL
• Serverless Offline
• https://github.com/dherault/serverless-offline
• Serverless-DynamoDB-Local
• https://github.com/99x/serverless-dynamodb-local
• Serverless-S3-Local
• https://github.com/ar90n/serverless-s3-local
参考資料その2
• Serverless-DynamoDB-Localついて
• Serverlessアプリケーションをローカルで開発する
• https://qiita.com/noralife/items/e36621ddd0e5b8ff4447
• Serverless Framework + TypeScript + DynamoDBのローカル環境
• https://zenn.dev/maruware/articles/cac0052812c2e3293dd5
• Serverless-Offlineを導入してServerless Framework + TypeScriptで作った
Lambda関数をVS Codeでステップ実行する
• https://note.com/dafujii/n/naf05740a253b
• [0.2.36] 'sls dynamodb install' shows nothing #195
• https://github.com/99x/serverless-dynamodb-local/issues/195
• Serverless-DynamoDB-Localがうまく動かない場合の対処方法
以上です
ご清聴ありがとうございました

More Related Content

Serverless Framework Pluginで行うLambdaテスト