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.3k
Dockerで始めるAWS Lambda開発
Taka
March 22, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
意外と簡単!?フロントエンドでパスキー認証を実現する WebAuthn
teamlab
PRO
1
570
サーバーサイドのビルド時間87倍高速化
plaidtech
PRO
0
710
testingを眺める
matumoto
1
130
Design Foundational Data Engineering Observability
sucitw
3
160
機能追加とリーダー業務の類似性
rinchoku
2
1.1k
ECS初心者の仲間 – TUIツール「e1s」の紹介
keidarcy
0
150
奥深くて厄介な「改行」と仲良くなる20分
oguemon
1
440
MCPで実現するAIエージェント駆動のNext.jsアプリデバッグ手法
nyatinte
7
1.1k
詳解!defer panic recover のしくみ / Understanding defer, panic, and recover
convto
0
230
MLH State of the League: 2026 Season
theycallmeswift
0
220
実用的なGOCACHEPROG実装をするために / golang.tokyo #40
mazrean
1
220
【第4回】関東Kaggler会「Kaggleは執筆に役立つ」
mipypf
0
1k
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
83
9.2k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
840
Making the Leap to Tech Lead
cromwellryan
135
9.5k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.5k
Become a Pro
speakerdeck
PRO
29
5.5k
Why Our Code Smells
bkeepers
PRO
339
57k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
How to train your dragon (web standard)
notwaldorf
96
6.2k
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 参考文献