Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Dockerで始めるAWS Lambda開発
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Taka
March 22, 2024
Programming
16
4.5k
Dockerで始めるAWS Lambda開発
Taka
March 22, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
疑似コードによるプロンプト記述、どのくらい正確に実行される?
kokuyouwind
0
390
AI時代のキャリアプラン「技術の引力」からの脱出と「問い」へのいざない / tech-gravity
minodriven
21
7.3k
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
200
CSC307 Lecture 01
javiergs
PRO
0
690
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
200
Oxlint JS plugins
kazupon
1
970
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
2k
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.4k
360° Signals in Angular: Signal Forms with SignalStore & Resources @ngLondon 01/2026
manfredsteyer
PRO
0
130
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
200
CSC307 Lecture 05
javiergs
PRO
0
500
CSC307 Lecture 02
javiergs
PRO
1
780
Featured
See All Featured
AI: The stuff that nobody shows you
jnunemaker
PRO
2
260
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
The untapped power of vector embeddings
frankvandijk
1
1.6k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.7k
Why Our Code Smells
bkeepers
PRO
340
58k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.3k
Optimizing for Happiness
mojombo
379
71k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
300
How to Ace a Technical Interview
jacobian
281
24k
Building Adaptive Systems
keathley
44
2.9k
Building an army of robots
kneath
306
46k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
320
Transcript
Dockerで始める AWS Lambda開発 @Hibiya.Tech #4 「初心者歓迎!使ってみた技術 LT大会」 Takahide Sato (@Taka_input)
自己紹介 名前: 佐藤 鷹英 GitHub: stutkhd-0709 X: @Taka_input 所属: 株式会社CyberOwl
趣味: サウナ, Crossfit
目次 • AWS Lambdaとは • AWS Lambda Runtime Interface Emulator
(RIE) • AWS Lambda Web Adapter • まとめ
AWS Lambdaとは
aws lambda サーバーレスのイベント駆動型のコンピューティングサービス AWSのサービスをトリガーとして起動することなど可能
デフォルトのlambdaの実行コード entrypointはlambda独自の実装が必要
デプロイ方法 • Zipパッケージ • Docker Image
lambdaをローカルで開発するライブラリ • AWS SAM • serverless Framework など どちらもyamlでリソースを管理・デプロイ可能
AWS SAMの場合 template.yamlで管理
便利!だけど...
yamlファイルの学習コスト • 独自プロパティが多い ◦ 運用コストがかかる ▪ フレームワークを使ったことないとわからない • yaml管理が若干オーバースペック ◦
lambdaのみ開発したいなら、デプロイはaws-cliで十分
lambdaのみの開発とデプロイの理想 普段使っている技術でローカルの開発ができる & デプロイはaws cliで問題ない
では、何が良さそうか...?
デプロイ方法を眺めてみる • Zipパッケージ • Docker Image
デプロイ方法を眺めてみる • Zipパッケージ • Docker Image ➡ ローカル環境もDockerで開発して、デプロイもDocker Image使えば要件を満たせそ う!
早速、Lambdaの公式イメージを探してみる
Dockerfileも簡単にかけそう!
そんな簡単ではなかった😇
ホットリロードが効かない lambdaのdocker imageは以下の手順で、関数実行用のruntimeを1度だけ生成する nodeのruntimeの場合 1. /lambda-entrypoint.sh (DockerのEntrypoint) 2. /var/runtime/bootstrap (runtime
entrypoint) 3. node /var/runtime/index.mjs (関数用runtime生成) 関数実行runtimeの生成をホットリロードしたい!
Docker + ホットリロードが使え る仕組みはあるのか?🧐
AWS Lambda Runtime Interface Emulator (RIE)
AWS Lambda Runtime Interface Emulator (RIE)とは AWS Lambdaのランタイム環境をエミュレートするツール リポジトリ 引用:
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-api.html
Runtime生成をホットリロードしたい = RIEを再起動させ続ければいい! つまり...
RIEの使い方 提供されてるaws-lambda-runtime-interface-emulatorの実行ファイルを取得して、 実行することが可能 -> コンテナ内に配置して実行可能!
AWS Lambda Runtime Interface Client (RIC) Lambda ServiceとExecute Environmentが通信するためのクライアント カスタムイメージの場合はこれを自前で用意する必要がある
AWS Lambda Runtime Interface Client (RIC) RICは言語ごとに配布されている 引用:https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#runtimes-api-client
AWS Lambda Runtime Interface Client (RIC) 本番環境ではlambdaをEmulateする必要がないため、RICのみImageに含める
Dockerfile 以下の3つに分割 • dockerfile.base ◦ RICを入れたベースイメージ • dockerfile.lcl ◦ ベースから作成した、RIC
+ RIEイメージ (ローカル開発) • dockerfile.prd ◦ ベースから作成したマルチステージビルドしたRICのみのイメージ (本番)
dockerfile.base RICインストール
dockerfile.lcl RIEインストール
dockerfile.prd
entrypoint.lcl.sh このファイルがnodemonに よってホットリロードされ、 RIEのプロセスが再起動さ れる 参考: https://dev.to/nipatiitti/custom-aws-lambda-docker-image-for-local-development-41j8
デプロイ buildしたImageをcliでそのままデプロイするだけで動く(ECR push済み)
ローカルのデバッグ方法 http://localhost:<PORT>/2015-03-31/functions/function/invocationsというエン ドポイントに対してリクエストする
DockerでLambda開発できた🎊
数日後...
Xで面白そうな記事を見つけた 引用: https://aws.amazon.com/jp/builders-flash/202402/lambda-container-runtime/?awsf.filter-name=*all
引用: https://aws.amazon.com/jp/builders-flash/202402/lambda-container-runtime/?awsf.filter-name=*all
試してみる💨
AWS Lambda Web Adapter
AWS Lambda Web Adapterとは Lambda上で動かしているアプリケーションとRuntime APIの間に入り、lambda eventとhttpリクエストの変換を行うlambda extention リポジトリ
参照: https://speakerdeck.com/_kensh/web-frameworks-on-lambda?slide=61
何が嬉しいか Lambdaに依存したコーディングをせずに HTTP通信を扱えるフレームワークならデプロイすることが可能 -> ECSなどの別サービスとの互換性が高い(ポータビリティ)
lambdaにするメリット • 安価 • スケーラビリティ
Lambda Web Adapterで開発
社内でECS -> Lambdaに 移行できそうなサービスを探してみた👀
Metabaseサーバー(ECS) OSSのBIツール 自前でサーバーをたてて、BIサーバーを立てる ことが可能 RDS, BigQueryのダッシュボードも作成可能
なぜLambdaに乗り換えられると思ったか • データを処理するタイミングはユーザーがダッシュボードを見るタイミング ◦ 常時起動は不要 • 社内でしか使わないため、レスポンス速度が多少悪くても問題ない ◦ コールドスタートの制約を気にしなくていい •
Metabase自体がhttp通信できるので、web adapterで対応可能
いけそう!
web adapterを追加する デプロイするイメージのDockerfileに以下の1文を追加し、extension追加
web adapterを追加する 以下の環境変数を適切に設定する必要があります • AWS_LWA_READINESS_CHECK_PATH ◦ ヘルスチェック用のパス • PORT ◦
サーバーのポート
できた!
けど、DBの同期がずっと終わらない...
こちらは解決まで至りませんでした... 必ずしも全てのアプリケーションですぐ動作するわけではなさそ う
次に、全く新しいアプリケーションで 開発してみる
開発したアプリ SPAの簡易BIツール 技術スタック • フロントエンド -> Vue.js • バックエンド ->
node.js・express • DB -> PostgreSQL
完成図
インフラ IAM認証 lambdaの関数URL がオリジン
開発・デプロイについて • 開発 ◦ express動かしてるだけなので普通の開発と何も変わらない ◦ RIE/RICと違って、エンドポイントが自由に決められるのでフロント側でローカル専用 の書き換えなどが不要 ◦ 独自のホットリロード処理も不要
• デプロイ ◦ Lambdaの関数更新はaws-cliで可能
インフラについて • パブリックアクセス可能なLambda関数URLのアクセス制限 ◦ Lambda関数URLはprivate subnetのVPCにいてもpublicなURL ◦ Lambda関数URLをIAM認証にして、Lambda@edgeで認証ヘッダー を付与 ▪
これにより、CloudFront経由のみlambdaにアクセスが可能 ▪ しかしあまり綺麗ではない • 今後S3のようにIAMで制限してほしい!
ランタイムで発生したlambda特有のエラー npmがエラーログを吐き出すディレクトリ(/home/sbx_user1051/.npm/_logs)をサー バー起動時に作成しようとするがエラーになる ➡ lambdaの書き込みはエフェメラルストレージのみ可能(/tmp)
ランタイムで発生したlambda特有のエラー Dockerfileに以下を追加して対応 書き込み先をtmpに限定
まとめ
まとめ • web adapterの登場でlambdaに依存しないコード開発が可能になった ◦ web adapterを使ったデプロイも簡単にできる ◦ しかしECS ->
Lambdaへの切り替えはスムーズとは限らない ▪ 本当にLambdaが適切か吟味する必要あり
Lambda Web Adapter でウェブアプリを (ほぼ) そのままサーバーレス化する AWS Lambda の上でいろんなWEB フレームワークを動かそう!
/ Web Frameworks on Lambda コンテナランタイムとしての AWS Lambda AWS Lambda Runtime Interface Clients / Emulator とはなにか Custom AWS Lambda Docker image for local development 参考文献