Sugu インタプリタを AWS Lambda で動作させるための実装。
既存コードには一切変更を加えず、Lambda 専用の実装を lambda/ ディレクトリに追加する。
provided.al2023 (x86_64){
"code": "mut x = 1 + 2; outln(x);"
}
{
"output": "3\n",
"result": "3",
"error": null
}
{
"output": "",
"result": null,
"error": "line 1, column 5: undefined variable: foo"
}
aws-lambda-go SDK を go.mod に追加lambda/ ディレクトリを作成lambda/builtins.go を作成out, outln を出力キャプチャ版に置き換えin は Lambda 環境では使用不可としてエラーを返すlambda/main.go を作成lambda/handler_test.go を作成lambda/
├── main.go # Lambda エントリーポイント
├── builtins.go # Lambda 用組み込み関数
├── handler.go # ハンドラーロジック
└── handler_test.go # テスト
Lambda 用の out / outln は strings.Builder に出力を書き込む。
実行後にビルダーの内容をレスポンスの output フィールドに設定する。
type OutputCapture struct {
builder strings.Builder
}
func (o *OutputCapture) Write(s string) {
o.builder.WriteString(s)
}
func (o *OutputCapture) String() string {
return o.builder.String()
}
Environment に Lambda 用の組み込み関数を登録することで、 既存の evaluator をそのまま使いながら出力をキャプチャする。
env := object.NewEnvironment()
// Lambda 用の out/outln を登録
env.Set("out", lambdaOut)
env.Set("outln", lambdaOutln)
// in は使用不可
env.Set("in", lambdaInDisabled)
# Linux x86_64 向けビルド
GOOS=linux GOARCH=amd64 go build -o bootstrap lambda/main.go
# ZIP パッケージ作成
zip sugu-lambda.zip bootstrap
sugu-lambda.zip をアップロードbootstrap(カスタムランタイムのデフォルト)in() 関数は使用不可(Lambda は標準入力を持たない)/tmp ディレクトリのみ使用可能(将来の Phase 3 対応時)