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
3.7k
Dockerで始めるAWS Lambda開発
Taka
March 22, 2024
Tweet
Share
Other Decks in Programming
See All in Programming
fs2-io を試してたらバグを見つけて直した話
chencmd
0
230
複雑な仕様に立ち向かうアーキテクチャ
myohei
0
170
今年のアップデートで振り返るCDKセキュリティのシフトレフト/2024-cdk-security-shift-left
tomoki10
0
200
【re:Growth 2024】 Aurora DSQL をちゃんと話します!
maroon1st
0
770
快速入門可觀測性
blueswen
0
350
なまけものオバケたち -PHP 8.4 に入った新機能の紹介-
tanakahisateru
1
120
talk-with-local-llm-with-web-streams-api
kbaba1001
0
180
フロントエンドのディレクトリ構成どうしてる? Feature-Sliced Design 導入体験談
osakatechlab
8
4.1k
Haze - Real time background blurring
chrisbanes
1
510
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
1
370
create_tableをしただけなのに〜囚われのuuid編〜
daisukeshinoku
0
240
From Translations to Multi Dimension Entities
alexanderschranz
2
130
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.9k
Navigating Team Friction
lara
183
15k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Automating Front-end Workflow
addyosmani
1366
200k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Side Projects
sachag
452
42k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5k
The World Runs on Bad Software
bkeepers
PRO
65
11k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
RailsConf 2023
tenderlove
29
940
Rails Girls Zürich Keynote
gr2m
94
13k
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 参考文献