BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース AWSがサーバレスアプリケーションのローカル開発とテストのための'SAM Local'をリリース

AWSがサーバレスアプリケーションのローカル開発とテストのための'SAM Local'をリリース

原文(投稿日:2017/08/18)へのリンク

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をインストールして起動しておく必要がある。また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’が異なるコンテキストであるためだ。

aws dynamodb create-table \
    --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 packageaws cloudformation deployと等価である。

SAM Localに関するより詳細な情報は、AWS Blogの記事 “New - AWS SAM Local (Beta) - Build and Test Serverless Applications Locally”、またはプロジェクトのGitHubリポジトリを参照してほしい。

 
 

この記事を評価

採用ステージ
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

BT