Sugu Language

AWS Lambda 対応 実装計画

概要

Sugu インタプリタを AWS Lambda で動作させるための実装。 既存コードには一切変更を加えず、Lambda 専用の実装を lambda/ ディレクトリに追加する。

要件

API 仕様

リクエスト

{
  "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"
}

実装タスク

Step 1: プロジェクト設定

Step 2: Lambda 用組み込み関数

Step 3: Lambda ハンドラー

Step 4: ビルドスクリプト

Step 5: テスト


ディレクトリ構成

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

デプロイ

  1. AWS Lambda 関数を作成(ランタイム: provided.al2023, アーキテクチャ: x86_64)
  2. sugu-lambda.zip をアップロード
  3. ハンドラー名: bootstrap(カスタムランタイムのデフォルト)

制限事項