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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Taka
March 22, 2024
Programming
4.6k
16
Share
Dockerで始めるAWS Lambda開発
Taka
March 22, 2024
Other Decks in Programming
See All in Programming
Migrations : C'est une question d'hygiène !
vinceamstoutz
0
880
エラー処理の温故知新 / history of error handling technic
ryotanakaya
7
1.9k
リセットCSSを1行消したらアクセシビリティが向上した話
pvcresin
4
530
Sans tests, vos agents ne sont pas fiables
nabondance
0
150
Modding RubyKaigi for Myself
yui_knk
0
380
1人1案件のプロダクトエンジニア時代に、"プロセス監督"としてチャレンジしたこと
non0113
0
160
iOS26時代の新規アプリ開発
yuukiw00w
0
180
Stage 3 Decorators でできること / できないこと / TSKaigi 2026
susisu
1
400
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
4
480
Skillは並べた。動かなかった。契約で繋いだ。— 65個のSkillから、自走する開発サイクルへ
junholee
0
690
新規プロダクトを高速で生み出すハーネスエンジニアリング
seanchas116
3
240
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて
matsuo_atsushi
0
160
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
6.9k
Embracing the Ebb and Flow
colly
88
5k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
A better future with KSS
kneath
240
18k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
230
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
140
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
180
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
180
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
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 参考文献