AWSはSAM Localという新ツールのベータ版をリリースした。ローカル開発マシンを使ったサーバレスAWS Lambdaアプリケーションの開発とテストを容易にするツールだ。提供するコア機能には、AWS Lambda関数をDocker内でローカルに実行してテストする機能、Lamdba関数をコールするローカルAPIゲートウェイをSAMテンプレート経由で起動するためのシンプルなCLI、S3やKinesisやCloudTailなどのさまざまなAWSイベントソースの処理をテストするためのサンプルペイロードの生成、といったものがある。
AWSは昨年、サーバレスアプリケーションのデプロイを簡単にすることを目的として、Serverless Application Model(SAM)を導入した。SAMは、AWSの既存のインフラストラクチャ・アズ・コード(IaC)製品であるAWS CloudFormationをベースに構築されたオープンソース仕様であり、開発者によるクラウドリソースの展開と構成の宣言的な指定を可能にする。
SAM Localのおもな機能は次のようなものだ。
- sam localとDockerを使用したAWS Lambda関数のローカル開発とテスト。
- Amazon Simple Storage Service (S3)、Amazon DynamoDB、Amazon Kinesis、Amazon Simple Notification Service (SNS)など、既知のイベントソースからの関数呼び出しのシミュレーション。
- SAMテンプレートからのAmazon API Gatewayのローカル起動とホットリロードによる、機能開発のイテレーション期間の短縮。
- リスナやIDEとの統合を含む、SAMテンプレートの迅速な検証。
- Lambda関数の対話型デバッグのサポート。
SAM Localでサーバレスプロジェクトと関数をローカルで実行するには、Dockerをインストールして起動しておく必要がある。またSAM Localは、dockerデーモンとの接続に環境変数DOCKER_HOSTを使用する。SAM LocalはNPMを使ってインストールする(npm install -g aws-sam-local)か、あるいは最新バージョンを直接ソースからインストールする(github.com/awslabs/aws-sam-localから取得して、samではなく、aws-sam-localという名称のバイナリを生成する)ことができる。
関数および関連する統合AWSリソースのデプロイメント設定は、拡張されたCloudFormationテンプレートフォーマット(最終的には標準のCloudFormationフォーマットに変換される)を使って指定する。例として、下記のtemplate.yamlファイルでは、簡単なDynamoDBテーブル、Pythonで記述されたLambda関数(ソースコードは‘Handlerプロパティ’で指定したlambda_function.pyという名称の別ファイルに含まれている)、GETとPOSTメソッドをサポートするAPI Gatewayインスタンスが定義されている。
AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
VotesTable:
Type: "AWS::Serverless::SimpleTable"
VoteSpacesTabs:
Type: "AWS::Serverless::Function"
Properties:
Timeout: 30
Runtime: python3.6
Handler: lambda_function.lambda_handler
Policies: AmazonDynamoDBFullAccess
Environment:
Variables:
TABLE_NAME: !Ref VotesTable
Events:
GetVotes:
Properties:
Method: get
Path: /
Type: Api
Vote:
Properties:
Method: post
Path: /
Type: Api
Randall Hunt氏の書いたAWS Blog記事では、API Gatewayを統合したSAM Deploymentの例をあげて、SAM Localを開発ワークフローで活用する方法について具体的に示されている。説明内容は包括的だが、関数をテストするには、対応するDynamoDBテーブルを(例えば、下記のAWS CLIで実行される‘create-table’コマンドで)事前に作成しておく必要がある。また、テスト目的でDynamoDBをローカルに実行する場合は、関数内のDynamoDBホスト名もマシンのローカルネットワークIPアドレスに変更しておく。ただし、単純に‘localhost’と指定することはできない。関数がDockerコンテナ内で実行されているため、Mac用とWindows用のDockerでは関数が自身のVM内で動作しており、‘localhost’が異なるコンテキストであるためだ。
--table-name spaces-tabs-votes \
--attribute-definitions \
AttributeName=id,AttributeType=S \
--key-schema AttributeName=id,KeyType=HASH \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
--endpoint-url http://localhost:8000
SAM Localでは、CLIコマンド ‘sam local generate-event <サービス>’を実行することで、テスト目的のAWSサービスイベントの生成も可能である。サポート対象のIDEを使えばインタラクティブなデバッグも可能だ。JavaとNode.jsでは、-d フラグとポートを‘sam local’ CLIコマンドで指定して、デバッガを直ちに有効にすることもできる。AWS Blogによれば、Pythonではepdbなどのライブラリの利用も可能だ。
サーバレスアプリをローカルで開発およびテストした後は、SAM CLIを使ってアプリケーションをパッケージし、ライブ環境にデプロイすることができる。‘sam package’コマンドを使用してコードアーティファクトをzipし、S3にアップロードして、AWS Cloud Fomationを使ってLamdbaにデプロイするためのSAMファイルを生成する。後は‘sam deploy’コマンドが、パッケージされたSAMテンプレートをCloudFormationにデプロイしてくれる。‘sam package’と‘sam deploy’はいずれも、AWS CLIの相当するコマンドであるaws cloudformation packageとaws cloudformation deployと等価である。
SAM Localに関するより詳細な情報は、AWS Blogの記事 “New - AWS SAM Local (Beta) - Build and Test Serverless Applications Locally”、またはプロジェクトのGitHubリポジトリを参照してほしい。
この記事を評価
- 編集者評
- 編集長アクション