AWS SAM のカスタムランタイム

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 のホスト、ポートを使って、イベントの取得、応答の送信などを行う。

1969年生まれ。大学卒業後から15年以上にわたり、通信、カードリーダ、セキュリティ業界においてソフトウェア開発に従事。その後、2012年5月に当社を設立。電力、交通、車載向けの組み込み系システム、旅行業界向けの WEB システム開発、音声合成システム、消防向けのシステム開発等に参画。
低コストかつシンプルで安定稼働するシステムの実現を目指し、アーキテクチャ設計に取り組んでいます。
会社情報と代表者守屋のプロフィール詳細