Slide 1

Slide 1 text

Dockerで始める AWS Lambda開発 @Hibiya.Tech #4 「初心者歓迎!使ってみた技術 LT大会」 Takahide Sato (@Taka_input)

Slide 2

Slide 2 text

自己紹介 名前: 佐藤 鷹英 GitHub: stutkhd-0709 X: @Taka_input 所属: 株式会社CyberOwl 趣味: サウナ, Crossfit

Slide 3

Slide 3 text

目次 ● AWS Lambdaとは ● AWS Lambda Runtime Interface Emulator (RIE) ● AWS Lambda Web Adapter ● まとめ

Slide 4

Slide 4 text

AWS Lambdaとは

Slide 5

Slide 5 text

aws lambda サーバーレスのイベント駆動型のコンピューティングサービス AWSのサービスをトリガーとして起動することなど可能

Slide 6

Slide 6 text

デフォルトのlambdaの実行コード entrypointはlambda独自の実装が必要

Slide 7

Slide 7 text

デプロイ方法 ● Zipパッケージ ● Docker Image

Slide 8

Slide 8 text

lambdaをローカルで開発するライブラリ ● AWS SAM ● serverless Framework など どちらもyamlでリソースを管理・デプロイ可能

Slide 9

Slide 9 text

AWS SAMの場合 template.yamlで管理

Slide 10

Slide 10 text

便利!だけど...

Slide 11

Slide 11 text

yamlファイルの学習コスト ● 独自プロパティが多い ○ 運用コストがかかる ■ フレームワークを使ったことないとわからない ● yaml管理が若干オーバースペック ○ lambdaのみ開発したいなら、デプロイはaws-cliで十分

Slide 12

Slide 12 text

lambdaのみの開発とデプロイの理想 普段使っている技術でローカルの開発ができる & デプロイはaws cliで問題ない

Slide 13

Slide 13 text

では、何が良さそうか...?

Slide 14

Slide 14 text

デプロイ方法を眺めてみる ● Zipパッケージ ● Docker Image

Slide 15

Slide 15 text

デプロイ方法を眺めてみる ● Zipパッケージ ● Docker Image ➡ ローカル環境もDockerで開発して、デプロイもDocker Image使えば要件を満たせそ う!

Slide 16

Slide 16 text

早速、Lambdaの公式イメージを探してみる

Slide 17

Slide 17 text

Dockerfileも簡単にかけそう!

Slide 18

Slide 18 text

そんな簡単ではなかった😇

Slide 19

Slide 19 text

ホットリロードが効かない 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の生成をホットリロードしたい!

Slide 20

Slide 20 text

Docker + ホットリロードが使え る仕組みはあるのか?🧐

Slide 21

Slide 21 text

AWS Lambda Runtime Interface Emulator (RIE)

Slide 22

Slide 22 text

AWS Lambda Runtime Interface Emulator (RIE)とは AWS Lambdaのランタイム環境をエミュレートするツール リポジトリ 引用: https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-api.html

Slide 23

Slide 23 text

Runtime生成をホットリロードしたい = RIEを再起動させ続ければいい! つまり...

Slide 24

Slide 24 text

RIEの使い方 提供されてるaws-lambda-runtime-interface-emulatorの実行ファイルを取得して、 実行することが可能 -> コンテナ内に配置して実行可能!

Slide 25

Slide 25 text

AWS Lambda Runtime Interface Client (RIC) Lambda ServiceとExecute Environmentが通信するためのクライアント カスタムイメージの場合はこれを自前で用意する必要がある

Slide 26

Slide 26 text

AWS Lambda Runtime Interface Client (RIC) RICは言語ごとに配布されている 引用:https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#runtimes-api-client

Slide 27

Slide 27 text

AWS Lambda Runtime Interface Client (RIC) 本番環境ではlambdaをEmulateする必要がないため、RICのみImageに含める

Slide 28

Slide 28 text

Dockerfile 以下の3つに分割 ● dockerfile.base ○ RICを入れたベースイメージ ● dockerfile.lcl ○ ベースから作成した、RIC + RIEイメージ (ローカル開発) ● dockerfile.prd ○ ベースから作成したマルチステージビルドしたRICのみのイメージ (本番)

Slide 29

Slide 29 text

dockerfile.base RICインストール

Slide 30

Slide 30 text

dockerfile.lcl RIEインストール

Slide 31

Slide 31 text

dockerfile.prd

Slide 32

Slide 32 text

entrypoint.lcl.sh このファイルがnodemonに よってホットリロードされ、 RIEのプロセスが再起動さ れる 参考: https://dev.to/nipatiitti/custom-aws-lambda-docker-image-for-local-development-41j8

Slide 33

Slide 33 text

デプロイ buildしたImageをcliでそのままデプロイするだけで動く(ECR push済み)

Slide 34

Slide 34 text

ローカルのデバッグ方法 http://localhost:/2015-03-31/functions/function/invocationsというエン ドポイントに対してリクエストする

Slide 35

Slide 35 text

DockerでLambda開発できた🎊

Slide 36

Slide 36 text

数日後...

Slide 37

Slide 37 text

Xで面白そうな記事を見つけた 引用: https://aws.amazon.com/jp/builders-flash/202402/lambda-container-runtime/?awsf.filter-name=*all

Slide 38

Slide 38 text

引用: https://aws.amazon.com/jp/builders-flash/202402/lambda-container-runtime/?awsf.filter-name=*all

Slide 39

Slide 39 text

試してみる󰝋💨

Slide 40

Slide 40 text

AWS Lambda Web Adapter

Slide 41

Slide 41 text

AWS Lambda Web Adapterとは Lambda上で動かしているアプリケーションとRuntime APIの間に入り、lambda eventとhttpリクエストの変換を行うlambda extention リポジトリ

Slide 42

Slide 42 text

参照: https://speakerdeck.com/_kensh/web-frameworks-on-lambda?slide=61

Slide 43

Slide 43 text

何が嬉しいか Lambdaに依存したコーディングをせずに HTTP通信を扱えるフレームワークならデプロイすることが可能 -> ECSなどの別サービスとの互換性が高い(ポータビリティ)

Slide 44

Slide 44 text

lambdaにするメリット ● 安価 ● スケーラビリティ

Slide 45

Slide 45 text

Lambda Web Adapterで開発

Slide 46

Slide 46 text

社内でECS -> Lambdaに 移行できそうなサービスを探してみた👀

Slide 47

Slide 47 text

Metabaseサーバー(ECS) OSSのBIツール 自前でサーバーをたてて、BIサーバーを立てる ことが可能 RDS, BigQueryのダッシュボードも作成可能

Slide 48

Slide 48 text

なぜLambdaに乗り換えられると思ったか ● データを処理するタイミングはユーザーがダッシュボードを見るタイミング ○ 常時起動は不要 ● 社内でしか使わないため、レスポンス速度が多少悪くても問題ない ○ コールドスタートの制約を気にしなくていい ● Metabase自体がhttp通信できるので、web adapterで対応可能

Slide 49

Slide 49 text

いけそう!

Slide 50

Slide 50 text

web adapterを追加する デプロイするイメージのDockerfileに以下の1文を追加し、extension追加

Slide 51

Slide 51 text

web adapterを追加する 以下の環境変数を適切に設定する必要があります ● AWS_LWA_READINESS_CHECK_PATH ○ ヘルスチェック用のパス ● PORT ○ サーバーのポート

Slide 52

Slide 52 text

できた!

Slide 53

Slide 53 text

けど、DBの同期がずっと終わらない...

Slide 54

Slide 54 text

こちらは解決まで至りませんでした... 必ずしも全てのアプリケーションですぐ動作するわけではなさそ う

Slide 55

Slide 55 text

次に、全く新しいアプリケーションで 開発してみる

Slide 56

Slide 56 text

開発したアプリ SPAの簡易BIツール 技術スタック ● フロントエンド -> Vue.js ● バックエンド -> node.js・express ● DB -> PostgreSQL

Slide 57

Slide 57 text

完成図

Slide 58

Slide 58 text

インフラ IAM認証 lambdaの関数URL がオリジン

Slide 59

Slide 59 text

開発・デプロイについて ● 開発 ○ express動かしてるだけなので普通の開発と何も変わらない ○ RIE/RICと違って、エンドポイントが自由に決められるのでフロント側でローカル専用 の書き換えなどが不要 ○ 独自のホットリロード処理も不要 ● デプロイ ○ Lambdaの関数更新はaws-cliで可能

Slide 60

Slide 60 text

インフラについて ● パブリックアクセス可能なLambda関数URLのアクセス制限 ○ Lambda関数URLはprivate subnetのVPCにいてもpublicなURL ○ Lambda関数URLをIAM認証にして、Lambda@edgeで認証ヘッダー を付与 ■ これにより、CloudFront経由のみlambdaにアクセスが可能 ■ しかしあまり綺麗ではない ● 今後S3のようにIAMで制限してほしい!

Slide 61

Slide 61 text

ランタイムで発生したlambda特有のエラー npmがエラーログを吐き出すディレクトリ(/home/sbx_user1051/.npm/_logs)をサー バー起動時に作成しようとするがエラーになる ➡ lambdaの書き込みはエフェメラルストレージのみ可能(/tmp)

Slide 62

Slide 62 text

ランタイムで発生したlambda特有のエラー Dockerfileに以下を追加して対応 書き込み先をtmpに限定

Slide 63

Slide 63 text

まとめ

Slide 64

Slide 64 text

まとめ ● web adapterの登場でlambdaに依存しないコード開発が可能になった ○ web adapterを使ったデプロイも簡単にできる ○ しかしECS -> Lambdaへの切り替えはスムーズとは限らない ■ 本当にLambdaが適切か吟味する必要あり

Slide 65

Slide 65 text

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 参考文献