Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS LambdaをTypeScriptで動かして分かった、Node.jsのTypeScri...

AWS LambdaをTypeScriptで動かして分かった、Node.jsのTypeScriptサポートの利点と課題

2025/05/23 ~ 205/05/24 に開催された「TSKaigi 2025」における私の発表「AWS LambdaをTypeScriptで動かして分かった、Node.jsのTypeScriptサポートの利点と課題」の発表資料になります。
#TSKaigi #TSKaigi2025 #tskaigi_ascend

https://2025.tskaigi.org/

Avatar for Makky12

Makky12

May 23, 2025
Tweet

More Decks by Makky12

Other Decks in Technology

Transcript

  1. 1 KDDI Agile Development Center Corporation 自己紹介 ◼ 氏名:鈴木 正樹

    ◼ 所属:KDDIアジャイル開発センター(KAG) 名古屋オフィス ◼ 役割:クラウドアーキテクト & バックエンドエンジニア AWS(特にサーバーレスやInfrastructure as Code)が大好き。(好きなサービスはLambdaとAWS CDK) 主にJAWS-UG名古屋 & JAWS-UG CDK支部で活動。 LambdaやCDKのコーディングでTypeScriptを使っています ◼ Certification: ◼ AWS Solution Architect Associate(2023) ◼ AWS Community Builder(2023~) ◼ : @makky12(SUZUKI Masaki@クラウドエンジニア) ◼ Blog:https://makky12.hatenablog.com/
  2. 2 KDDI Agile Development Center Corporation 本日のアジェンダ • はじめに:Node.jsのTypeScriptサポートの概要 •

    TypeScriptサポートのメリット・デメリット • AWS LambdaでTypeScriptサポートを使用する • TypeScriptサポートのユースケース • まとめ & 告知
  3. 3 KDDI Agile Development Center Corporation 注意事項 • 発表資料・発言内容は、すべて個人の見解・知見になります ◦

    所属企業・団体・コミュニティなどの公式見解とは一切関係ありません • 本日紹介する各種サービスなどの正式な情報は、それぞれの公式サイトをご確認ください • このセッションは2/21(金)開催の「JAWS-UG CDK支部#19 クラスメソッドコラボ回」の発 表内容がベースとなっています(発表資料・関連ブログも下記URLで公開しています) ◦ 発表資料:https://speakerdeck.com/smt7174/cdkdekasutamurantaimuwozuo-cheng-site- lambdawonode-dot-js23-plus-typescriptdedong-kasitemita ◦ ブログ:https://makky12.hatenablog.com/entry/2025/03/10/120500
  4. 5 KDDI Agile Development Center Corporation Node.jsがTypeScriptをサポート • Node.jsがv23.6.0からTypeScriptの実行を正式にサポート ◦

    「--experimental-strip-types」フラグがデフォルトで有効になった (※1) ◦ ts-node のようなツールを使わなくても、Node.jsから直接TypeScriptを実行可能に • 実行時・デプロイ時のトランスパイルが不要になった ◦ アプリのテスト・デプロイなどが便利になるのでは?(特にサーバーレスなどのクラウド環境) ※1:ただし、実行時に「将来変わるかもしれないよ」というWarningは出ます。(非表示にすることも可能)
  5. 6 KDDI Agile Development Center Corporation TypeScriptサポートのFeature(s) 他にも細かい点はあるが、大きくはこの2点 • TypeScript

    Native Support ◦ TypeScriptのネイティブ実行をサポートし、トランスパイルが不要に ◦ ts-node, webpack, esbuildなどのインストールも不要になった • Type Stripping(型除去) ◦ TypeScriptコードから型情報だけを除去することで、JavaScriptとできる限り似通ったコードを保つ仕組み ◦ 型定義に「type」キーワードを使用する必要がある(「型定義」であることを明示するため)
  6. 8 KDDI Agile Development Center Corporation メリット • トランスパイルが不要に ◦

    Node.jsから直接TypeScriptを実行できるため、トランスパイルが不要に ◦ webpack, esbuildが不要になり、それらに依存するトランスパイルエラーから解放される ◦ ローカル環境での実行時にも、トランスパイルや ts-node などを実行する必要がなくなる • 型除去(Type Stripping)により、型に依存するエラーから解放される ◦ Node.jsでの実行時に型情報が除去されるため、たまに発生する型エラーから解放される • デプロイパッケージのサイズ縮小&可読性向上 ◦ トランスパイル後のJavaScriptコードは、元のTypeScriptに比べてサイズ・可動性の面で問題がありがち ◦ TypeScriptをそのままデプロイすることで、デプロイパッケージのサイズ縮小、可読性向上につながる
  7. 9 KDDI Agile Development Center Corporation デメリット • 未対応の項目もある&既存のTypeScriptコードがそのまま動くとは限らない ◦

    TypeScript独自の機能はサポートされない(例:enum, namespace(名前空間)など) ◦ 「type」キーワードの追加、「ローカルimportではTypeScriptファイルの参照が必須」(※1)など、コード変 更が必須になる制約もあり、既存コードをそのまま動かせるわけではない • 完全な下位互換はない(下位互換自体はある) ◦ Node.js ver20.xはTypeScriptをサポートしない(Node.js ver22.xは将来的にサポート) • 型の恩恵を受けられない(型チェックがビルトインではない) ◦ 型チェックが実行されないので、事前にtscなどで型チェックを実行する必要がある ◦ 「静的型付け言語である」ことが魅力、利点に感じるからこそTypeScriptを使用しているわけで… ※1:JavaScriptファイルではNG
  8. 11 KDDI Agile Development Center Corporation AWS LambdaでTypeScriptサポート機能を使用する • AWS

    LambdaにNode.js v23.6.xのランタイムはないので、AWS LambdaでTypeScriptサ ポート機能を使用する場合、下記いずれかの方法を使用する ◦ コンテナイメージを使用する(Lambdaコンテナ、個人的にはこちらをおすすめ) ◦ カスタムランタイム(今回はこちらを使用)(※1) • 上記の方法を使用し、AWS LambdaでTypeScriptサポートが正常動作することは確認済み ◦ API Gateway経由で使用して「200 OK」レスポンスが返ることを確認 • ただ、いろいろ問題もある(次ページで紹介) ※1:具体的なやり方は「注意事項」で紹介した発表資料やブログを参照(この発表では紹介しません)
  9. 12 KDDI Agile Development Center Corporation 発生した問題 • AWS SDKが読み込みできなかった(※1)

    ◦ AWS SDKをLambdaレイヤーに登録し、そこから読み込みしようとしたが、何をやっても「Can’t find Module」エラーになり、うまく動かなかった ◦ 「モジュールパスの絶対パス指定」「環境変数の明示的設定」などいろいろ試したがダメだった • デプロイパッケージ肥大化により、サイズ制限に引っかかる ◦ 上記理由により、AWS SDKをデプロイパッケージに直接含まなければならない ◦ それによりサイズが肥大化し、サイズ上限(250MB)に引っかかりデプロイできない事態が発生(※2) ※1:これに関しては私の知識不足かもしれないので、もし解決策を知っている方がいたら教えてください ※2:「client-s3」だけならOKでしたが、「client-dynamodb」を追加したらサイズ上限に引っかかりました
  10. 13 KDDI Agile Development Center Corporation AWS(≒クラウド)でTypeScriptサポートを使用する時の注意点 • クラウド側がTypeScriptサポートに対応してくれるとは限らない ◦

    Node.jsサポートとTypeScriptサポートは別であり、当然「TypeScriptサポートには対応しない」と公式からア ナウンスされるケースもありうる ◦ 今回のLambdaレイヤーのように「TypeScriptサポートだとうまく動かない」機能も当然出てくる • 「サーバーレス環境では、引き続きトランスパイルは必要」であることを理解する ◦ Matt Pocock氏も「サーバーレスのようなCold Startが問題になる環境では、引き続きトランスパイルはすべき である」という事を自分のブログで明言している ◦ 参考:https://www.totaltypescript.com/typescript-is-coming-to-node-23 • ただし、これはあくまでv23.xの話なので、(一般公開verである)v24.xに期待(※1) ※1:Node.jsは奇数バージョンは先行試行バージョン、偶数バージョンが一般公開バージョン(後にLTSになる)
  11. 14 KDDI Agile Development Center Corporation 【余談】AWS CDKユーザーとしての個人的な見解を言うと… • AWS

    CDKには「NodejsFunction」というNode.js専用のLambdaコンストラクタがあり、 デプロイ時にトランスパイルを自動実行してくれる ◦ webpackやesbuildのインストール・設定は不要(※1) • なので正直、AWS CDKを使う分にはトランスパイルについて全く負担を感じない ◦ 「TypeScriptサポート」のメリットが… • ただ「デプロイが遅い」と思うことはあるので、TypeScriptサポートでここが改善されると いいなあ…という期待 ※1:内部的にDockerを使用
  12. 16 KDDI Agile Development Center Corporation TypeScriptサポートのユースケース (ここまででお分かりの通り)現時点で実務への導入は正直難しいですが… • ローカル環境での実行

    ◦ ローカル環境であれば、デプロイパッケージの問題は発生しない ◦ いろいろ問題はあるが、とりあえず試しに動作させたい!という際に使えるかも ◦ ts-nodeの代替として使用可能になる…かも? • Node.js v24.xランタイムでの動作(期待を込めて) ◦ 本日話したのは、あくまでNode.js v23.6.xでの話 ◦ Node.js v24.x(一般公開版)はAWSでもランタイムサポートするはずなので(※1)、公式ランタイムであれば 本日紹介した問題は発生しないはず(特にLambdaレイヤー) ◦ Cold Startの問題もあるが、比較的シンプルなソースなら実用できないかな…という期待 ※1:ここ数年は11月後半(re:Invent 開催直前)にリリースされる傾向にあります。
  13. 18 KDDI Agile Development Center Corporation まとめ ※個人的な見解です 「TypeScriptサポート」は、便利だけどまだ実プロダクトに導入するのは難しそう ◦

    未対応項目、および一部互換性の問題などがある ◦ 「型除去」は便利かもしれないが、「静的型付け」が特徴であるTypeScriptのメリットが失われてしまう… • 型チェックを自分で行わなくてはならない 現段階ではAWS Lambdaに適用するのも難しそう ◦ 公式ランタイムが対応しておらず、カスタムランタイム・Lambdaコンテナなどでの対応を行うしかない ◦ Lambdaレイヤー・デプロイパッケージサイズなどの問題があり、稼働させるハードルが高い ◦ そこまでしてTypeScriptサポートを導入する理由があるかというと… Node.js v24に期待 ◦ (一般公開版である)Node.js v24ならLambdaレイヤー・デプロイパッケージサイズなどの問題も解決する可 能性があるので、Node.js v24に期待
  14. 札幌オフィス SAPPORO OFFICE 秋田オフィス AKITA OFFICE 高崎オフィス TAKASAKI OFFICE 金沢オフィス

    KANAZAWA OFFICE 舞鶴オフィス MAIZURU OFFICE 広島オフィス HIROSHIMA OFFICE 福岡オフィス FUKUOKA OFFICE 那覇オフィス NAHA OFFICE 仙台オフィス SENDAI OFFICE 東京本社 TOKYO MAIN OFFICE 三島オフィス MISHIMA OFFICE 名古屋オフィス NAGOYA OFFICE 大阪オフィス OSAKA OFFICE