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
Taka
March 22, 2024
Programming
16
4.2k
Dockerで始めるAWS Lambda開発
Taka
March 22, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
ワープロって実は計算機で
pepepper
2
1k
実践!App Intents対応
yuukiw00w
1
210
React は次の10年を生き残れるか:3つのトレンドから考える
oukayuka
41
16k
kiroでゲームを作ってみた
iriikeita
0
140
Bedrock AgentCore ObservabilityによるAIエージェントの運用
licux
8
560
LLMは麻雀を知らなすぎるから俺が教育してやる
po3rin
3
2k
あのころの iPod を どうにか再生させたい
orumin
2
1.3k
あなたとJIT, 今すぐアセンブ ル
sisshiki1969
0
360
オホーツクでコミュニティを立ち上げた理由―地方出身プログラマの挑戦 / TechRAMEN 2025 Conference
lemonade_37
1
440
decksh - a little language for decks
ajstarks
4
21k
自作OSでDOOMを動かしてみた
zakki0925224
1
780
JetBrainsのAI機能の紹介 #jjug
yusuke
0
190
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
Code Review Best Practice
trishagee
69
19k
[RailsConf 2023] Rails as a piece of cake
palkan
56
5.7k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
YesSQL, Process and Tooling at Scale
rocio
173
14k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
6k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
The Language of Interfaces
destraynor
158
25k
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 参考文献