AWS
serverless
ServerlessFramework
AWSSAM

AWS SAMとServerless Frameworkを比較してみた

この記事はServerless Advent Calendar 2017 23日目の記事です。

最近Serverless Frameworkを使っていたのですが、先輩に「今の時代はAWS SAMだぞ」と言われ、気になったので比べてみました。

Serveless Frameworkの特徴

デプロイしやすい・速い

まずこれが一番の特徴ですね。
下記の例みたいにたったコマンド2つですぐ動かせるサーバーレスアプリケーションが出来上がります。

$ serverless create --template hello-world
$ serverless deploy

もし↑と同じことSAMでやろうとした場合:

  • リリースステージ用のバケットの作成
  • Lambda関数のコーディング
  • 設定ファイルを書く
  • Lambda関数のzip化
  • Cloudformationによるパッケージング

これらの作業を全て自分でやらなければなりません。
Serverless Frameworkを使うとこういったデプロイ前の準備作業をよしなにやってくれますね。

まぁスクリプトやらCIでそこは解決できるとは思いますが、そもそもそこに時間や手間をかけずに自分のアプリケーションだけに集中したい人であれば、Serverless Frameworkの方が圧倒的に使い勝手が良いのではないでしょうか。

連携可能なサービスが豊富

Serverless FrameworkはAWSだけでなく、Azure FunctionsやGoogle Cloud Functionsなど他社のクラウドサービスでも利用できます。
もちろんそれぞれのサービスの仕様や特性をある程度把握した上で利用するべきですが、Serverless Frameworkから利用する部分に関してはほぼ変わりません。
特にデプロイはどのサービスも同じコマンドでできます。

$ serverless deploy

様々なプラグインが利用できる

Serverless Frameworkは使い勝手がとても良いのですが、もちろんまだ足りない部分や痒い所に手が届かないときもあったりします。そういう時はプラグインで補ったりすることができます。
例えば、デプロイしたファンクション毎にDead letter queueをserverless-plugin-lambda-dead-letterで設定できたり、Serverless Frameworkの定義ファイル内でStep Functionsの設定を可能にするserverless-step-functionsなどがあります。
Serverless Frameworkのコミュニティ自体が大きいので、様々なプラグインが多数みつかるのも良い点だと思います。

AWS Serverless Application Modelの特徴

AWS関連サービスとの親和性が高い

Cloud Formationを拡張したサービスなので当たり前かもしれませんが、AWSリソースとの連携がしやすい印象でした。
もしすでにCloud Formationを使ってきた方であればあまり不自由なくSAM利用できるでしょう。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  PutFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs6.10

このように通常のCloudFormationのテンプレートに Transform: AWS::Serverless-2016-10-31 と1行追加すれば、SAMのテンプレートフォーマットを利用することができます。

ローカル環境でのテストが可能

事前にDockerのインストールが必要になりますが、AWS SAM Localをインストールすればローカル環境でのファンクションのテストが可能になります。

$ npm install -g aws-sam-local

以下のように実行したいファンクション名と渡したいリクエストのボディをjsonで指定するとテストが可能になります。

$ sam local invoke "FunctionName" -e event.json

また、Lambdaを起動するイベントのペイロードもエミュレートできます、以下が対象サービスです:

  • S3
  • Kinesis
  • DynamoDB
  • Cloudwatch Scheduled Event
  • Cloudtrail
  • API Gateway

生成したイベントのペイロードをローカルで起動するファンクションに以下のようにパイプラインで渡すことができます。

$ sam local generate-event s3 --bucket bucket-name --key xxxxx | sam local invoke "FunctionName" 

※ Serveless Frameworkもserverless-dynamodb-localserverless-offlineというプラグインをインストールすればローカルでのテストも可能ですが、独自の設定が必要な上Node.js限定という欠点があります。

まとめ

すこしサクッとさわってみて比べた印象ですが、今後他のクラウドサービスに切り替えたいかもしれない時やとにかくスピード重視でアプリケーションを動かしたいのであればServerless Frameworkがいいと思います。
もしアプリケーションをAWSのサービス中心で構成し、それなりに長く運用していくのであればAWS SAMが適しているかもしれません。
ただ、「アプリケーションを素早く本番運用できる状態にし、またサーバーやそれに関連するサービスの運用にかける時間をアプリケーションのコーディングに割り当てることを可能とし、ユーザーにより価値のあるサービスを提供する」といったサーバレスの思想に一番近いのはServerless Frameworkではないでしょうか。