🍊

Live Lambdaが魅力的!AWSサーバレスを爆速で実現するSSTとは?

2024/05/12に公開

株式会社Fusicのおかべです。

弊社は四半期に1度くらい開発合宿があります。開発合宿のルールは「業務をしない」ことになっているので、今回の開発合宿では業務では使わないけども興味があったSSTというものを触ってみました。

SSTとは?

https://sst.dev/

Serverless Sack Toolkitを略してSSTみたいです。

AWS上にサーバレスなAPI環境であったり、Next.jsやSvelte、Astroなどのアプリケーションを簡単な操作でデプロイすることができます。

内部的にはAWS CDKを使っているため、関係性としてはこんな感じ。

AWS < CloudFormation < AWS CDK < SST

サーバレスに特化してCDKをラップすることで、CDKより少ない記述でより簡単に環境を作ろうという発想です。

また、私がSSTの最大の魅力だと思っているのがローカル環境のLambda関数を実行できる機能があることです。これについては仕組みも含めて面白いのであとで詳しく書きます。

SST、CDKやめるってよ

CDKをラップしているのでCDKより簡単に書けるし、SSTに準備がないものはCDKを書けば対応できる…
という触れ込みだったのですが、なんと次のバージョンからCDKからTerraformへの切り替えを予定しているそうですw

https://sst.dev/blog/moving-away-from-cdk.html

このプロジェクトはIonと呼ばれていて、上の記事を読んでもらうとわかりますが、結構はっきりとCDKを批判していますw

CDKがイケてない理由を11個も紹介してくれているのですがまとめると「CDKはただのCFnのjson作成ツールで速度が遅い!」って感じでしょうか。

次のメジャーバージョンであるv3がいつリリースされるかはわかりませんが、v3からは Terraform + Pulumi を使おうとしているみたいです。

マルチクラウド対応の出来によっては結構アツいことになるのでは。

Live Lambda Development

SSTの一番の面白ポイントがここです。

Lambda関数に対してローカルで加えた変更をAWS上にデプロイせずに実行できます。

よく意味がわからないと思うので公式の説明を置いておきます。

https://docs.sst.dev/live-lambda-development

上記資料をもとにちょっと触ってみた感じ多分こういうことと理解しています。

  1. localでプロジェクトを作成
  2. npm run dev コマンド( sst dev コマンド )で実際にAWS上にリソースを作成
    ※ APIGateway、Lambda、IAM作成用のCloudFromation、S3、AWS IoTなどが作成される
    ※ 払い出されるAPIエンドポイントはここで作成されたAPI Gatewayのもの
    ※ この際作成されるLambdaは自分で作成した関数が記述されているわけではなくSSTが作成したものになっている ← これがミソ
  3. エンドポイントを叩くとLambda関数が呼び出されて、そのリクエストがAWS IoTを通じてローカルPCに送信される
  4. ローカルは受けたリクエストをもとにローカルの関数を実行する
  5. 実行結果がAWSに返されて、APIGatewayのレスポンスとして返ってくる

図示してみるとこんな感じ?

試しに実行してみて軽くログ等をみてみたんですが、2と3についてはCloudWatchLogsのAPIGatewayとLambdaのそれぞれのログが残っていました。

LambdaがAWS IoTに対してPublishしていることもLambdaのログを見るとなんとなくわかります。

で、公式の説明を見るとそれをWebSocket経由?でlocalの関数に渡して、localの関数を実行しているらしい。

最終的にAPI Gatewayのレスポンスとして返ってきているので、ということはLambdaからはlocal関数の実行結果が返ってるはずではあるんですがパッとみた感じログが見つけられませんでした,,,🥲

誰か確認できたら教えて欲しいです。

まぁこんな理屈でlocalの関数をデプロイすることなく実行する仕組みを整えているらしいです。
面白いですね〜〜

Live Lambdaについて公式の言ってることを引用すると、

  • サードパーティのアプリケーションを介しているわけでもないのでセキュリティ的にも安心
  • コストとして追加でかかっているのはAWS IoTだけで、AWS IoTのコストは500kイベントまで$1くらいという激安
  • コードの反映が爆速

必要なリソースのみAWS上に作成しておいてLambdaだけはlocalにオフロードするという、なんとも大胆でよく考えられたアーキテクチャですね。

実際に試してみると

SSTの嬉しいところで、チュートリアルがとても充実しています。

https://sst.dev/examples/index.html

2024/5/12時点では以下のようなExampleを用意してくれています。

一つ一つのチュートリアルもとても丁寧に作られているので、とりあえずSSTを理解するにはもってこいですし、こいつらを組み合わせればだいたいのワークロードはカバーできそうです。

解説を書くほどでもないので詳細な説明は省きますが、例えば REST API であれば以下のようにすれば開発環境と本番環境を構築できます。

$ npx create-sst@latest --template=base/example rest-api
$ cd rest-api
$ npm install

# stacks/ExampleStack.ts で作成するAWSリソースとAPI定義を作成
# packages/core/src/notes.ts にjsonを定義 ※DBに接続していないため
# packages/functions/src配下にAPIそれぞれのLambdaバックエンドを定義

$ npm run dev # これで開発環境を作成されLiveLambdaが使用できる

$ npx sst deploy --stage prod # 本番リソースの作成

# お掃除
$ npx sst remove # 開発環境のリソースを削除
$ npx sst remove --stage prod # 本番環境のリソースを削除

最後のdeployコマンドを叩くことでAWS環境に実際のレスポンスを返すLambda関数が作成され、localとは切り離された存在になります。

コマンドを見てわかる通り恐ろしく簡単です。
10分とかあれば試しに作ることができるのでぜひやってみてください。

また、React.js のチュートリアルも同様に簡単にReactの環境を作ることができますが、こちらでは本番デプロイコマンドを叩くとCloudFrontから配信するように作ってくれます。神かよ。

活用方法

今まで散々SSTのことを持ち上げましたが、もちろんすべてのワークロードに対してSSTが向いているとは思っていませんw

SSTが向いている場面

サーバレス環境のPoCなどを爆速で立ち上げたいときにはとても向いていると思います。

今まで数時間くらいかかっていた環境構築が数分の単位で終わらせることができるのでロジックの開発の方に集中できますし、Live Lambdaを使うことでLambdaの開発もとても捗りそうです。

「とりあえず作ってみてうまくいきそうか確認する」にはもってこいのサービスな気がします。

SSTが向いてなさそうな場面

本番ワークロードをすべてSSTに任せるには結構な勇気がいりそうです 😅

SSTの流儀に則ってアプリケーションを作ろうとすると、フロントエンド・バックエンド・インフラをすべて同じGitレポジトリで管理することになりそうなので、プロジェクトが大規模になってきたときに複雑さが増します。

サーバレス以外のスタックを作成するにはSSTには荷が重いですし、CDKをかけるとはいえそれなら初めからCDKでやればいいのではとなりそうです。

また、最初の方に述べたようにv3から内部をCDKからTerraformに変えようとしているのでそれによって使い勝手が変わる可能性も大いにあります。


SSTいかがでしたでしょうか?
個人開発レベルとか少人数のプロジェクトとかだったら思い切って活用してみるのもいいかもしれませんね。

今後の更なる展開にも期待です。

Discussion