⚡️

LambdaWebAdapterを試してみた

2025/01/22に公開

このスライドを見ていたら気になってしょうがないのでやってみた。
(ラムダリス。。。。。だと。。。)
https://speakerdeck.com/tmokmss/aws-lambda-web-adapterwohuo-yong-suruxin-siisabaresunoshi-zhuang-patan?slide=2

とりあえずAPIを作る

ginで山川APIを作った

main.go
package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	r.GET("/yama", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "kawa",
		})
	})

	r.Run() // デフォルトでポート8080でリッスンします
}

alt text

Dockerfileを書いてコンテナにする

実行すると山川APIを立ち上げて待ち受けるコンテナ
以下の呪文をいれるのがポイント

COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter

LambdaWebAdapterのデフォルトポートは8080
(環境変数AWS_LWA_PORTで変更可能)

Dockerfile
# ベースイメージとして公式のGoイメージを使用
FROM golang:1.23

# コレがミソ
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter

# 作業ディレクトリを設定
WORKDIR /app

# Goモジュールを使用するためのファイルをコピー
COPY go.mod ./
COPY go.sum ./
RUN go mod download

# ソースコードをコピー
COPY . .

# アプリケーションをビルド
RUN go build -o /yamakawaapi

# コンテナが実行するコマンドを指定
CMD [ "/yamakawaapi" ]

alt text

ECRに上げてLambdaを作る

。。。詳細手順は省略

  1. ECRにリポジトリを作る
  2. ビルドしたDockerイメージをECRのリポジトリにPUSH
  3. そのイメージを実行するLambdaを作成
  4. 関数URLを有効にする

alt text

実行

Lambdaの関数URLに対してのアクセスが
コンテナのポート8080番へのアクセスとして処理される。

↓ローカルでの実行結果

 ~  http http://localhost:8080/yama                                                                                                                                                                                             397ms  日  1/ 5 00:08:55 2025
HTTP/1.1 200 OK
Content-Length: 18
Content-Type: application/json; charset=utf-8
Date: Sat, 04 Jan 2025 15:24:04 GMT

{
    "message": "kawa"
}

↓LWAを介した実行結果

 ~  http https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/yama                                                                                                                                         378ms  日  1/ 5 00:24:04 2025
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 18
Content-Type: application/json; charset=utf-8
Date: Sat, 04 Jan 2025 16:03:40 GMT
X-Amzn-Trace-Id: Root=1-67795bdc-1b967a840ed88d325a76261f;Parent=2a814a196ad1dd9b;Sampled=0;Lineage=1:886ab67c:0
x-amzn-Remapped-content-length: 18
x-amzn-Remapped-date: Sat, 04 Jan 2025 16:03:40 GMT
x-amzn-RequestId: aa29208c-2800-4c07-94ed-ed04ebd9fe94

{
    "message": "kawa"
}

まとめ(というかまとまりのない所感)

しょうもない物(言い方が悪い。利用頻度が低い、利用量が跳ねる可能性が無い、とりあえず公開したい。みたいなヤツ)を作るときの選択肢としては、かなりアリ。
ではないかと、、、正直APIGateway&Lambdaはめんどくさい⋯

  • これlambdaだから、実行されない限り課金されない(だよな?)
  • 仮に実行されまくっても負荷耐性はある(多分)、そう、ラムダだから。
  • ただし実行されまくったら料金はひどいことになる、そう、ラムダだから。

Discussion