「AWS SAM Local」とは?
「AWS SAM Local」とは、「AWS SAM(※後述します)」で作成したアプリケーションをローカルPC上で実行し、開発とテストを迅速に行えるサービスです。
「AWS SAM Local」の概要や「AWS SAM」等の関連知識について解説していきます。
「AWS SAM Local」のメリットとは?
「AWS SAM Local」のメリットとして、AWSクラウド上へデプロイする前に、ローカルPC上でテストを実行できることが挙げられます。
具体的には、「AWS Lambda関数」のテスト実施、「Amazon S3」、「Amazon DynamoDB」、「Amazon Kinesis」、「Amazon SNS」等のAPIコールのエミュレーションテストの実施、ローカルPCで「Amazon API Gateway」を起動してのホットリロード(※コードを変更した際に手動でリロードせずに、自動的にリロードされる機能)による開発とテスト実施、「AWS Lambda関数」のインタラクティブなデバッグ実施、等があります。
「AWS SAM」とは?
「AWS SAM」とは、「AWS Serverless Application Model」の略で、AWSが公式に提供している「サーバーレスアプリケーション」を構築するためのフレームワーク です。
サーバーレスアプリケーションを構築するために必要な「AWS Lambda」、「Amazon API Gateway」、「Amazon DynamoDB」等のAWS上のリソースを一括して管理(作成、更新、削除)することが可能です。
ちなみに「AWS SAM」は、2015年5月に開催された「Serverless Conf」にて「Tim Wagner」から発表され、「Flourish」というサービス名で知られていました。そして、翌年の「re:Invent 2016」の直前に正式にリリースされています。
「AWS SAM」の特徴とは?
「AWS SAM」の特徴としては、「Infrastructure as Code」を実現するプロビジョニングサービスの「AWS CloudFormation」のサーバーレス版という点です。
具体的には、「AWS SAM」の各リソースは 「AWS CloudFormation」のリソース定義と類似のフォーマットで定義されています。
このフォーマットで作成された「テンプレート」を 「AWS CloudFormation」に入力することで「スタック」としてAWSクラウド上に展開することが可能です。
「AWS SAM」のテンプレートに記載方法について
「AWS SAM」のテンプレートに記載方法については、「YAML」形式もしくは「JSON」形式で記述します。
具体的には、以下のようなテンプレートを記述します。
AWSTemplateFormatVersion: '2021-04-01'
Transform: AWS::Serverless-2021-04-01
Resources:
FunctionName:
Type: AWS::Serverless::Function
Properties:
Handler: index.handler
Runtime: nodejs5.0
「Transform: AWS::Serverless-2021-04-01」の記載により、「AWS CloudFormation」は「AWS SAM フォーマット」のテンプレートと判断しています。
「AWS SAM Local」の利用方法について
「AWS SAM Local」の利用方法について解説します。
概要としては、「AWS Lambda関数」と「AWS SAM テンプレート」を含むディレクトリにて、以下のコマンドを実行します。
sam local start-api
この結果として、すべての関数をホストする「ローカルHTTP サーバー」が起動し、ブラウザやCLIでアクセスすると、「Dockerコンテナ」をローカルで起動してこれらの関数をコールします。
それでは、具体的な手順を解説していきます。
Dockerをインストールする
最初に、「AWS SAM Local」で使用する「Docker」をローカルPCにインストールします。
具体的には、Windowsの場合は「Docker Toolbox」、macOSの場合は「Docker for Mac」、Linuxの場合は「yum install docker」で確認します。
「AWS SAM Local」をインストールする
次に、「AWS SAM Local」をローカルPC上にインストールします。
具体的には、NPM(※「Node Package Manager」の略で、パッケージ管理ツール)を利用して、以下のコマンドでインストールを実行します。
$ npm install -g aws-sam-local
local$ sam --version
2021/04/01 00:00:00 0.1.0
sam version 0.2.0
「AWS Lambda関数」をローカルで実行する
ここまでで必要な環境が構築できたので、「AWS Lambda関数」をローカルPC上で実行してみましょう。
Docker上で動作するので、エミュレーションによる実行テストではなく、AWS上の「AWS Lambda」の実行環境としてテストを実施できます。
こちらのテストでは、3つのファイルを準備します(※後述します)。
「AWS SAM Local」のテストファイル1:AWS Lambda関数
「AWS SAM Local」のテストファイル1として、「AWS Lambda関数」のコードを記述したファイル(index.js)を作成します。
具体的には、以下の内容になります。
'use strict';
console.log('Loading Lambda function');
exports.handler = (event, context, callback) => {
callback(null, {
statusCode: 200,
headers: { "x-custom-header" : "GGMedia Custom Header Value" },
body: "Hello " + event.body
});
}
「AWS SAM Local」のテストファイル2:SAMテンプレート
「AWS SAM Local」のテストファイル2として、SAMのテンプレートファイル(template.yaml)を作成します。
具体的には、以下の内容のファイルになります。
AWSTemplateFormatVersion: '2021-04-01'
Transform: AWS::Serverless-2021-04-01
Description: Simple CRUD Webservices. State is stored in DynamoDB resource.
Resources:
HelloWorld:
Type: AWS::Serverless::Function
Properties:
Handler: index.handler
Runtime: nodejs5.0
Events:
GetResource:
Type: Api
Properties:
Path: /resource/{resourceId}
Method: put
「AWS SAM Local」のテストファイル3:JSONイベント
「AWS SAM Local」のテストファイル3として、JSONイベントのファイル(event.json)を作成します。
具体的には、以下の内容になります。
{"body": "GG Media"}
「AWS SAM Local」のテスト実行
必要なテストファイルが作成できたので、「AWS SAM Local」のテストを実行してみます。
具体的には、以下のコマンドを実行します。
$ sam local invoke HelloWorld -e event.json
実行の結果として、Dockerイメージがダウンロードされて、「AWS Lambda関数」が実行されます。
「AWS SAM Local」から「AWS SAM CLI」への移行
2020年7月、「AWS SAM CLI」の一般への提供が開始され、「AWS SAM Local」から「AWS SAM CLI」への移行が始まりました。
この「AWS SAM CLI」では、「sam init」、「sam build」、「sam deploy」等の新規のコマンドが追加されることで、サーバーレスアプリケーションをより簡単に構築できるようになりました。
移行期間なので従来のリソースも活用しながら、こちらの後継のサービスを利用して、サーバーレスアプリケーションの開発効率化を目指してみてはいかがでしょうか?
出典:AWS サーバーレスアプリケーションモデル (SAM) CLI が一般提供を開始し、本番環境で利用可能に|AWS公式サイト
参照:https://aws.amazon.com/jp/about-aws/whats-new/2020/07/announcing-aws-serverless-application-model-cli-generally-available-production-use/