Slide 1

Slide 1 text

AWS Lambdaは俺が作った 2023/7/19 クラスメソッド CX事業本部 岩⽥智哉 1

Slide 2

Slide 2 text

このセッションで話さないこと • みなさんのビジネスに役⽴つ話 • みなさんの開発/運⽤されているシステムを より良いものにするために役⽴つ話 • 仮想化やVMMガチ勢向けのコアな話 2

Slide 3

Slide 3 text

⾃⼰紹介 3 • CX事業本部 サーバーサイドチーム • ⼤阪オフィス所属 • 2023 Japan AWS Top Engineer • 好きなAWSサービスはAWS Lambda • Firecrackerコントリビューター 岩⽥ 智哉

Slide 4

Slide 4 text

AWS Lambdaは 俺が作った!! 4

Slide 5

Slide 5 text

もちろんそんなことはなくて… でも全くの嘘というわけではありません これからその辺の話をしていきます 5 本当にLambdaを作ったワケではなく…

Slide 6

Slide 6 text

6 AWS Lambdaの舞台裏

Slide 7

Slide 7 text

AWS Lambdaの舞台裏(簡易版) 7 ハードウェア ホストOS MicroVM Firecracker ゲストOS Lambda Function ʜ

Slide 8

Slide 8 text

Firecrackerの概要 8 • AWSが開発した OSSのVMM(Virtual Machine Monitor) • Rust製 • Linux KVM(kernel-based virtual machine)を利⽤ • MicroVMを⾼速(125ms)に起動可能 • 仮想化によるメモリのオーバーヘッドは5M以下

Slide 9

Slide 9 text

AWS Lambdaは Firecrackerに⽀えられている Firecrackerを作っている⼈ それすなわち Lambdaを作っている⼈ 9 つまり…

Slide 10

Slide 10 text

Firecrackerにコントリビュートすれば 「AWS Lambdaは俺が作った」 と⾃慢して良いのではないか︖ 10 FirecrackerはOSS

Slide 11

Slide 11 text

11 Firecracker開発の経緯

Slide 12

Slide 12 text

昔のLambda 12 ホストOS ゲストOS (AWSアカウントA) ゲストOS (AWSアカウントB) Lambda Function (AWSアカウントA) Lambda Function (AWSアカウントB) コンテナ コンテナ コンテナ コンテナ コンテナ

Slide 13

Slide 13 text

こうでは無い 13 ホストOS ゲストOS (AWSアカウントA,AWDアカウントB,…) Lambda Function (AWSアカウントA) Lambda Function (AWSアカウントB) コンテナ コンテナ コンテナ コンテナ コンテナ

Slide 14

Slide 14 text

あるいはこうでも無い 14 ホストOS Lambda Function (AWSアカウントA) Lambda Function (AWSアカウントB) コンテナ コンテナ コンテナ コンテナ コンテナ

Slide 15

Slide 15 text

セキュリティのトレードオフ 15 • AWSにとってセキュリティは最優先事項 • コンテナによる環境分離だけでは不⼗分 • CVE-2019-14271 docker cp コマンドの脆弱性によりホストOSのroot権限が利⽤可能 • CVE-2019-5736 runcの脆弱性によりホストOSのroot権限が利⽤可能 • ゲストOSレベルで環境を分離することでより強 ⼒な環境分離を実現

Slide 16

Slide 16 text

Firecracker開発以前の課題 セキュリティを重視すると ワークロードの集約率が低くなる 16

Slide 17

Slide 17 text

セキュリティレベルを担保しつつ 効率よく⼤量のワークロードを集約できる 「うまい、安い、早い」VMMが欲しい… ⾃分たちで作ろう︕︕ 無ければ作ろう 17

Slide 18

Slide 18 text

Firecrackerのコンセプト 18 USBデバイス、サウンドデバイス、ビデオデバイス … これらは全て不要 • セキュリティが最優先 • FaaSやCaaSの基盤としての役割に特化

Slide 19

Slide 19 text

Firecrackerを活⽤した多層防御の実現 19 ホストOS Firecracker ゲストOS Lambda Function KVM Jailer Sandbox Inner Sandbox MicroVM VMMによる環境分離 コンテナ型仮想化による環境分離

Slide 20

Slide 20 text

Firecrackerによるワークロード集約 20 ホストOS アカウントB アカウントC アカウントA アカウントD アカウントE アカウントA アカウントB アカウントC アカウントC アカウントD アカウントA

Slide 21

Slide 21 text

FargateもFirecracker上に構築されている 21 ワークロードの集約率が上がり、 ⼤幅値下げが実現

Slide 22

Slide 22 text

FirecrackerでMicroVMを起動する様⼦ 22

Slide 23

Slide 23 text

23 Firecracker プロジェクト 概要

Slide 24

Slide 24 text

関連するプロジェクト 24 CrosVM 2017/4 ~ Firecracker 2017/10 ~ Rust-vmm 2018/12 ~ Cloud Hypervisor 2019/5~

Slide 25

Slide 25 text

Slackワークスペースは誰でも参加可能 25 https://firecracker-microvm.slack.com/

Slide 26

Slide 26 text

ロードマップはGitHubで確認可能 26 https://github.com/firecracker-microvm/firecracker/projects/13

Slide 27

Slide 27 text

27 コントリビューション実績紹介

Slide 28

Slide 28 text

初めてのコントリビューション 28 エラー⽤のenumが thiserror::Errorを使うように修正

Slide 29

Slide 29 text

Good first issue発⾒︕︕ 29 re:inventが間近に迫った2022年11⽉ Lambdaのスナップショットサポートが気になり Firecrackerのリポジトリを覗きに⾏く 「Good first issue 」のついたissueを発⾒

Slide 30

Slide 30 text

thiserrorを使ってリファクタリング 30 これを こうしただけ

Slide 31

Slide 31 text

4つのPRがマージ 31

Slide 32

Slide 32 text

ちょっと裏話 32 東京リージョンでa1.metalインスタンスの起動 に⼿間取っている間に他の⼈に先を越される ※InsufficientInstanceCapacity

Slide 33

Slide 33 text

ドキュメントの記述ミス修正 33 ドキュメントの 記述ミスを修正

Slide 34

Slide 34 text

ドキュメントの記述ミス修正 34 Dockerイメージのタグが間違っていたのを修正

Slide 35

Slide 35 text

Blackの除外ルール調整 35 Pythonのコードフォーマッター Blackの除外ルール調整

Slide 36

Slide 36 text

Blackの除外ルール調整 36 • FirecrackerのintegrationテストはPythonで実装されている • PythonのコードはBlackでフーマット • integration_tests/build配下のコードがフォーマットされない

Slide 37

Slide 37 text

Blackの除外ルール調整 37 • Blackは特定のディレクトリ配下のコードをフォーマットしない • デフォルトだと`build`ディレクトリは対象外 • pyproject.tomlに独⾃ルールを定義して対応完了

Slide 38

Slide 38 text

38 integrationテストの 重複コード削除

Slide 39

Slide 39 text

integrationテストの重複コード削除 39 • テスト実⾏環境のカーネルバージョンを取得する関数が重複 • 重複定義を削除し、全てのテストケースが単⼀の `get_kernel_version`を利⽤するように修正

Slide 40

Slide 40 text

重複していたコード 40

Slide 41

Slide 41 text

おまけ 41 コンテナイメージのスリム化 ※マージされず

Slide 42

Slide 42 text

コンテナイメージのスリム化 42 • 開発⽤コンテナイメージの/tmpにゴミが残っていた • Ubuntu18→Ubuntu22へのアップグレードに合わせてCLOSE • もう少し早くPR上げていればマージされていたかも︖

Slide 43

Slide 43 text

つまり… 43 Firecrackerコントリビューターとかいいつつ 実は何も⼤したことをしていない Rustや仮想化の知識が無くても Firecrackerにコントリビュートできる︕︕

Slide 44

Slide 44 text

44 Firecracker に コントリビューションしてみよう︕

Slide 45

Slide 45 text

まずは開発環境の構築 45 • 何はともあれまずは開発環境の構築 • Firecrackerの動作にはKVMが必須 • 開発環境から/dev/kvmが⾒える必要がある

Slide 46

Slide 46 text

適当な物理マシンを⽤意する 46 • 適当な物理マシンが⽤意してLinuxをインストールする • 物理マシンが余っていればFirecracker開発環境として転⽣ • ドゥアルブートさせるもよし • ⼀応ラズパイ4でもいけるはず… https://dev.classmethod.jp/articles/firecracker-with-raspi4b/

Slide 47

Slide 47 text

パブリッククラウドを使う 47 • AWSならi3.metal等が利⽤可能 • ベアメタルインスタンスなので⾼い… • a1.metalはサポート対象外(とはいえ多分動く) • Google CloudのCompute Engineを使う • Nested Virtualizationが使える︕︕ • Intel Haswell以降のプロセッサが必要なので注意

Slide 48

Slide 48 text

ローカルマシンで仮想化ソフトウェアを使う 48 • Nested Virtualizationに対応したソフトウェアを導⼊ • VMware Fusion • 有償 • Virtual Box • 6.1.0からIntel CPUのNested Virtualizationに対応

Slide 49

Slide 49 text

開発環境のLinux OSが準備できたら 49 • ソースコードをクローン • git clone https://github.com/firecracker-microvm/firecracker.git • Docker環境の準備 • 開発⽤のコンテナをpull • docker pull public.ecr.aws/firecracker/fcuvm • ./tools/devtool shell 等

Slide 50

Slide 50 text

Devctrについて 50 • Firecracker開発⽤のコンテナイメージ • メージはECR Publicで公開 • Rust等の必要な環境構築済み

Slide 51

Slide 51 text

オススメツール 51 • VS CodeのExtension Remote Developmentがオススメ • Remote – SSHで開発環境に接続 • Dev Containersで開発⽤のコンテナといい感じに連携

Slide 52

Slide 52 text

devcontainer.jsonの設定例 52 KVMが必須なので特権モードで VS Code⽤にrust-analyzerを導⼊

Slide 53

Slide 53 text

うまく設定できたら… 53 ⼊⼒補完が効いて”Run Test”がポチれるようになればOK

Slide 54

Slide 54 text

54 Issueを探そう

Slide 55

Slide 55 text

何もともあれGood first issueだが… 55 Good first issue付きのissueはだいたいPR作成済み/マージ済み

Slide 56

Slide 56 text

たまに簡単なissueも起票される 56 • issueをwatchしておくと気付けるかも • 即座に「やりたいです︕」と意思表⽰すればチャンスがあるかも

Slide 57

Slide 57 text

このissueがとっかかりにできそう 57 • TODOコメントが付いている箇所から探してみよう • CrosVMやCloud Hypervisorのコードをポーティングできないか︖ https://github.com/firecracker-microvm/firecracker/issues/3273

Slide 58

Slide 58 text

58 開発時のTIPS

Slide 59

Slide 59 text

./tools/devtoolで便利コマンドを実⾏ 59 ./tools/devtool --help Firecracker devtool Usage: devtool [] [] Global arguments -y, --unattended Run unattended. Assume the user would always answer "yes" to any confirmation prompt. Available commands: build [--debug|--release] [-l|--libc musl|gnu] [-- []] Build the Firecracker binaries. Firecracker is built using the Rust build system (cargo). All arguments after -- will be passed through to cargo. --debug Build the debug binaries. This is the default. --release Build the release binaries. -l, --libc musl|gnu Choose the libc flavor against which Firecracker will be linked. Default is musl. --ssh-keys Provide the paths to the public and private SSH keys on the host (in this particular order) required for the git authentication. It is mandatory that both keys are specified. …略

Slide 60

Slide 60 text

ユニットテストもpytest経由で実⾏ 60 • pytest ./tests/integration_tests/build/test_unittests.py • ./tools/devtool test -- integration_tests/build/test_unittests.py ユニットテストの実⾏はcargo testではない pytest経由で呼び出すことでcargo testの諸々のオプションが 適切に設定される

Slide 61

Slide 61 text

コミット時の注意事項 61 git commitするときは -s オプションを We require that every contribution to Firecracker is signed with a Developer Certificate of Origin. DCO checks are enabled via https://github.com/apps/dco, and your PR will fail CI without it. https://github.com/firecracker-microvm/firecracker/blob/main/CONTRIBUTING.md

Slide 62

Slide 62 text

コミットメッセージのチェック 62 • コミットしたらgitlintでチェック • pytest integration_tests/style/test_gitlint.py • tools/devtool test integration_tests/style/test_gitlint.py

Slide 63

Slide 63 text

カバレッジの調整 63 • ユニットテストのカバレッジは事前定義された値 と差分が0.05%以内である必要がある • CIの結果を⾒て調整 tests/integration_tests/build/test_coverage.py

Slide 64

Slide 64 text

64 まとめ

Slide 65

Slide 65 text

このセッションで⾔いたかったこと 65 • RustやVMMの知識が無くてもLambda愛があれ ばFirecrackerにコントリビュートできる • ⼀歩踏み出してコントリビュートしてみよう • 「AWS Lambdaは俺が作った」と⾔ってみよう

Slide 66

Slide 66 text

ありがとう ございました 66