--- title: "Lambda SnapStart ã‚’ Java ä»¥å¤–ã§æœ‰åŠ¹åŒ–ã™ã‚‹æ–¹æ³•" slug: snapstart-any-langs tags: [lambda] authors: [tbrand] --- Lambda SnapStat ã‚’ Java ä»¥å¤–ã§æœ‰åŠ¹åŒ–ã™ã‚‹æ–¹æ³•ã‚’ã”紹介ã„ãŸã—ã¾ã™ã€‚ - **ã“ã¡ã‚‰ã®è¨˜äº‹ã§ç´¹ä»‹ã—ã¦ã„る方法ã¯ã€AWS å…¬å¼ã§æ¡ˆå†…ã—ã¦ã„る方法ã§ã¯ã‚りã¾ã›ã‚“** - **実施ã™ã‚‹å ´åˆã¯ã€ã‚ãã¾ã§æ¤œè¨¼ã®ãŸã‚ã«è¡Œã„ã€æœ¬ç•ªç’°å¢ƒã§ã¯çµ¶å¯¾ã«åˆ©ç”¨ã—ãªã„ã§ãã ã•ã„** <!-- truncate --> ## 背景 Lambda SnapStart ã¯ã‚³ãƒ¼ãƒ«ãƒ‰ã‚¹ã‚¿ãƒ¼ãƒˆã®ãƒœãƒˆãƒ«ãƒãƒƒã‚¯ã‚’改善ã™ã‚‹æ©Ÿèƒ½ã§ã™ã€‚åˆå›žèµ·å‹•時ã®å®Ÿè¡Œç’°å¢ƒã®ãƒ¡ãƒ¢ãƒªã¨ãƒ‡ã‚£ã‚¹ã‚¯ã®çŠ¶æ…‹ã® Firecracker MicroVM スナップショットを作æˆã—ã€ã‚ャッシュã—ã¾ã™ã€‚次回以é™ã®ã‚³ãƒ¼ãƒ«ãƒ‰ã‚¹ã‚¿ãƒ¼ãƒˆã¯ã€ã‚¹ãƒŠãƒƒãƒ—ショットをãƒãƒ¼ãƒ‰ã™ã‚‹ã“ã¨ã§é«˜é€ŸåŒ–を図りã¾ã™ã€‚ ç¾æ™‚点 (2023/07/13) ã§ã¯ã€Lambda SnapStart 㯠Java 11 マãƒãƒ¼ã‚¸ãƒ‰ãƒ©ãƒ³ã‚¿ã‚¤ãƒ ã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚Node.js ã‚„ Python ãªã©ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。ãã“ã§ã€ã“ã®è¨˜äº‹ã§ã¯ Lambda SnapStart ã‚’ Java 11 以外ã®è¨€èªžã§æ›¸ã‹ã‚ŒãŸ Lambda 関数ã§ã‚‚有効化ã™ã‚‹æ–¹æ³•を紹介ã—ã¾ã™ã€‚**ãŸã ã—ã€ã‚ãã¾ã§ãƒãƒƒã‚¯ãªæ–¹æ³•ã§ã‚りã€AWS å…¬å¼ãŒæ¡ˆå†…ã™ã‚‹æ‰‹é †ã§ã¯ã‚りã¾ã›ã‚“。検証ã«ã¨ã©ã‚ã€æœ¬ç•ªç’°å¢ƒã§ã¯çµ¶å¯¾ã«åˆ©ç”¨ã—ãªã„ã§ãã ã•ã„。**ã¾ãŸã€å…·ä½“çš„ãªã‚³ãƒ¼ãƒ‰ã‚„è¨å®šãƒ•ァイルãªã©ã‚’紹介ã™ã‚‹ã“ã¨ã¯æŽ§ãˆã•ã›ã¦ã„ãŸã ãã¾ã™ã®ã§ã€ã”了承ãã ã•ã„。 ## æœ‰åŠ¹åŒ–æ‰‹é † Java 11 以外ã®ãƒ©ãƒ³ã‚¿ã‚¤ãƒ ã‚’é¸æŠžã™ã‚‹ã¨ã€ãã‚‚ãã‚‚ SnapStart を有効化ã§ããªã„ãŸã‚ã€Java 11 ã®ãƒ©ãƒ³ã‚¿ã‚¤ãƒ ã‚’é¸æŠžã—ãŸçŠ¶æ…‹ã§ã€ã„ã‹ã«ä»–ã®è¨€èªžã® Lambda 関数を動ã‹ã™ã‹ã¨ã„ã†ã®ãŒè°é¡Œã§ã™ã€‚具体的ã«ç”³ã—上ã’ã¾ã™ã¨ã€ä»¥ä¸‹ã® 2 ステップを考慮ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ 1. Java 11 ランタイムã§ã€**ã©ã®ã‚ˆã†ã«ã—ã¦ä»–ã®è¨€èªžã‚’実行å¯èƒ½ã«ã™ã‚‹ã‹** 2. ã©ã®ã‚ˆã†ã«ã—㦠**Lambda 関数ã¨ã—ã¦å®Ÿè¡Œå¯èƒ½ã«ã™ã‚‹ã‹** ### Java 11 ランタイムã§ã€ã©ã®ã‚ˆã†ã«ã—ã¦ä»–ã®è¨€èªžã‚’実行å¯èƒ½ã«ã™ã‚‹ã‹ ã¨ã©ã®ã¤ã¾ã‚Šã€Java 11 ラインタイムを無視ã—ã¦ã€ä»–ã®è¨€èªžãŒå®Ÿè¡Œã§ãれã°å•題ãªã„ã‚ã‘ã§ã™ã€‚ ã“れã«é–¢ã—ã¦ã¯ã€ç¾çжã‚ã‹ã£ã¦ã„ã‚‹ã ã‘ã§ã‚‚ä»¥ä¸‹ã®æ‰‹æ®µãŒã‚りã¾ã™ã€‚ 1. コンパイル言語ã§ã‚ã‚‹ãªã‚‰ã€ãƒã‚¤ãƒŠãƒªã‚’インストールã™ã‚Œã°è‰¯ã„ 2. スクリプト言語ãªã‚‰ã€ãƒ©ãƒ³ã‚¿ã‚¤ãƒ をインストールã™ã‚Œã°è‰¯ã„ (Lambda Layer ã«ç½®ã„ã¦ãƒ‘スを通ã™) 3. スクリプト言語ã§ã‚‚コンパイルå¯èƒ½ã§ã‚れã°ãれを利用ã™ã‚‹ 4. JVM ã§å®Ÿè¡Œå¯èƒ½ãªå½¢å¼ã«å¤‰æ›ã§ãã‚‹ãªã‚‰ã€ãã‚Œã‚‚å¯ (JRuby ãªã©) (1) ã«é–¢ã—ã¦ã¯ã»ã¨ã‚“ã©èª¬æ˜Žä¸è¦ã§ã€ä¾‹ãˆã° Go ã‚„ Rust ãªã©ã¯ã“れã«å½“ãŸã‚Šã¾ã™ã€‚生æˆã•れãŸãƒã‚¤ãƒŠãƒªã‚’ Lambda 関数ã«ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã™ã‚Œã°è‰¯ã„ã§ã™ã€‚(2) ã«é–¢ã—ã¦ã¯ã€ä¾‹ãˆã° `node` ã‚„ `python` ãªã©ã‚’ Lambda Layer ã«ç½®ã‘ã°ã€ãã®è¨€èªžãŒåˆ©ç”¨ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ãŸã ã—ã€250 MB ã®åˆ¶é™ãŒã‚ã‚‹ãŸã‚ã€åŽã¾ã‚‹ã‹æ¤œè¨¼ãŒå¿…è¦ã§ã™ã€‚(3) ã«é–¢ã—ã¦ã¯ã€ä¾‹ãˆã° JavaScript ã®ã‚ªãƒ«ã‚¿ãƒŠãƒ†ã‚£ãƒ–ランタイムã§ã‚ã‚‹ Deno ãŒã“れã«å½“ãŸã‚Šã¾ã™ã€‚Deno ã§ã‚れ㰠`deno compile` コマンドã§å®Ÿè¡Œå¯èƒ½ãƒ•ァイルを作æˆå¯èƒ½ã§ã™ã€‚ã¾ãŸã€Node.js ã«é–¢ã—ã¦ã‚‚ v19.7 ~ ã«è©¦é¨“çš„ã«å°Žå…¥ã•れ㟠postject ã¨ã„ã†æ©Ÿèƒ½ã§å®Ÿè¡Œå¯èƒ½ãƒã‚¤ãƒŠãƒªã‚’生æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã ã—ã€ã“ã¡ã‚‰ã¯æ‰‹å…ƒã§æ¤œè¨¼ã—ãŸçµæžœ glibc ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆã‚ãšã«å®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—ãŸã€‚(4) ã«é–¢ã—ã¦ã¯ã‚ã¾ã‚Šæ¤œè¨¼ã§ãã¦ã„ã¾ã›ã‚“ãŒã€ç†è«–çš„ã«ã¯ JRuby ãªã©ã¯å®Ÿè¡Œå¯èƒ½ã ã¨æ€ã„ã¾ã™ã€‚ã¾ãŸã€2.x ç³»ã—ã‹ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“㌠Jython (implementation of Python in Java) ã‚‚ã“れã«å½“ãŸã‚Šã¾ã™ã€‚ 以上ã®ã‚ˆã†ã«ã€é™å®šçš„ã§ã¯ã‚ã‚‹ã‚‚ã®ã®ã€ãƒãƒƒã‚¯ã™ã‚Œã° Java 11 ãƒ©ãƒ³ã‚¿ã‚¤ãƒ ã‚’é¸æŠžã—ãŸå ´åˆã§ã‚‚ã€ä»–ã®è¨€èªžãŒå®Ÿè¡Œå¯èƒ½ã§ã‚ã‚‹ã“ã¨ã¯ã‚ã‹ã‚Šã¾ã—ãŸã€‚ã—ã‹ã—ã€Lambda 関数ã¨ã—ã¦ã©ã®ã‚ˆã†ãªã‚³ãƒ¼ãƒ‰ã«ãªã‚‹ã§ã—ょã†ã‹ã€‚ ### ã©ã®ã‚ˆã†ã«ã—㦠Lambda 関数ã¨ã—ã¦å®Ÿè¡Œå¯èƒ½ã«ã™ã‚‹ã‹ ã“れã¯ç¾çжã‚ã‹ã£ã¦ã„る範囲ã§ã€1 択ã§ã™ã€‚[Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter) を利用ã—ã¾ã™ã€‚Lambda Web Adapter を利用ã™ã‚Œã°ã€Lambda 関数㮠invoke ã‚’ã€é€šå¸¸ã® HTTP リクエストã¨ã—ã¦å—ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã¤ã¾ã‚Šã€æ…£ã‚Œè¦ªã—ã‚“ã Web フレームワークãŒåˆ©ç”¨ã§ãã¾ã™ã€‚ ### サンプル - Lambda Web Adapter ã®ãƒªãƒã‚¸ãƒˆãƒªã® examples ã«ã€`deno compile` を利用ã—㦠SnapStart を有効化ã—ã¦ã„るサンプルãŒã‚りã¾ã™ã€‚([ã“ã¡ã‚‰](https://github.com/awslabs/aws-lambda-web-adapter/tree/main/examples/deno-zip)) ## ã¾ã¨ã‚ ã“ã®è¨˜äº‹ã§ã¯ Lambda SnapStart ã‚’ Java 11 以外ã®è¨€èªžã§æœ‰åŠ¹åŒ–ã™ã‚‹æ‰‹é †ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã—ãŸã€‚3 度目ã«ãªã‚Šã¾ã™ãŒã€**AWS å…¬å¼ã§æ¡ˆå†…ã—ã¦ã„ã‚‹æ‰‹é †ã§ã¯ã‚りã¾ã›ã‚“。ã“ã‚Œã‚‰ã®æ‰‹é †ã«é–¢ã—ã¦ã€AWS ã‹ã‚‰ã¯ã„ã‹ãªã‚‹ã‚µãƒãƒ¼ãƒˆã‚‚å—ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。ã¾ãŸã€æœ¬ç•ªç’°å¢ƒã§ã®åˆ©ç”¨ã¯çµ¶å¯¾ã«ã—ãªã„ã§ãã ã•ã„。**