AWS SAM (Serverless Application Model) とは

AWS CloudFormation と AWS Lambda が合体したような感じのものだ。

  1. コードと CloudFormation のテンプレートが拡張された SAM 用のテンプレートを用意し、
  2. 関数のコードを書き、
  3. 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 のホスト、ポートを使って、イベントの取得、応答の送信などを行う。