AWS SAM (Serverless Application Model) とは
- AWS 公式ドキュメント AWS Serverless Application Model (AWS SAM) とは
AWS CloudFormation と AWS Lambda が合体したような感じのものです。
- コードと CloudFormation のテンプレートが拡張された SAM 用のテンプレートを用意し、
- 関数のコードを書き、
- aws sam cli を実行(sam build && sam deploy)
すれば、関数のデプロイができます。例えば、HttpApi を使うように設定した場合は、生成された url にアクセスすると、ひもづいた関数が実行されて、応答が返ります。また、周期的に実行するように設定した場合は、周期的に関数が実行されます。
私の場合、お客様が、セキュリティの観点から、WEB サイトのサーバレス化に興味を持っており、その解として、サイトジェネレータで静的な WEB サイトを構築しました。その WEB サイトの問い合わせフォームを処理するために、AWS Lambda を使いました。Lambda 関数の構築を容易にするために SAM を使用しました。
AWS Lambda を使う場合の注意事項
Lambda は、初回の起動に少し時間がかかります。1 秒もかかる感じではないですが、少し気になる程度には時間がかかります。
そして、何もすることがないと、すぐに寝てしまいます。体感としては、5〜10 分程度です。
少し応答が遅い場合もあるものの、Lambda の実行時間に対しての課金のため、毎日数件程度の問い合わせフォームであれば、運用コストはほぼ 0 に抑えられるでしょう。
SAM を使う以前に Lambda を使うかどうかを、まず、判断したほうが良いでしょう。 Lambda を使う場合は、SAM を使ってサーバレス構築するのは本当におすすめの方法です。 メンテナンス性が非常に容易なためです。
SAM がサポートしているプログラミング言語
sam init を実行し、AWS Quick Start Templates から、popular runtime で N を選ぶと、次のような一覧が表示される。
Which runtime would you like to use?
1 - aot.dotnet7 (provided.al2)
2 - dotnet6
3 - go1.x
4 - go (provided.al2)
5 - graalvm.java11 (provided.al2)
6 - graalvm.java17 (provided.al2)
7 - java17
8 - java11
9 - java8.al2
10 - java8
11 - nodejs18.x
12 - nodejs16.x
13 - nodejs14.x
14 - python3.9
15 - python3.8
16 - python3.7
17 - python3.11
18 - python3.10
19 - ruby3.2
20 - ruby2.7
21 - rust (provided.al2)
これらが、SAM で標準的にサポートされている言語ということでしょう。
それ以外にもカスタムランタイムを使用することができますし、Lambda が Docker コンテナをサポートしているので、おそらく SAM で Docker コンテナを起動ということも可能でしょう。
カスタムランタイムを作って仕組みを理解してみる
go や rust で作ったものが動作するのは非常に興味深いと思っていました。
provided.al2 は amazon linux2 上で動作するバイナリならば動作するということでしょう。
ならば C 言語でも作れるのではないか?と思い、雑ではありますが、作ってみました。
C 言語で作ってみることで、以下のように理解しました。
- Lambda は bootstrap という名前のファイルを実行する
- SAM テンプレートファイルの、Runtime が provided であればカスタムランタイムとなる。Amazon Linux 2 が使われる?
- MetaData / BuildMethod が makefile となっている場合は、sam build を実行した時、CodeUri 下の Makefile を使用してバイナリをビルドする
- Amazon Linux 2 で動くバイナリでなければならない。標準のライブラリ以外を使う場合はスタティックリンクしておく必要あり?
- bootstrap 内では、環境変数からランタイム API のホストとポートの情報を受けとる。API でイベントを読み出し、応答の送信を行う。
カスタムランタイムについても、AWS のドキュメントに詳しく書いてあります。以下のドキュメントが参考になるでしょう。チュートリアルでは、シェルスクリプトを使って bootstrap を記述しています。
まとめ
- SAM を使ってカスタムランタイムを記述可能。C 言語でも記述可能。
- Amazon Linux 2 でビルドできて動作するのであれば、AWS Lambda のカスタムランタイムとして使える。
- カスタムランタイムは、bootstrap というファイルを実行する。
- bootstrap は、環境変数から読み出した、ランタイム API のホスト、ポートを使って、イベントの取得、応答の送信などを行う。