SlideShare a Scribd company logo
1 of 14
TypeScriptで書くLambdaを
CDKでいい感じに管理する
クライヤー篠塚 一帆
自己紹介
 経歴
 生命系専攻
 組み込み&信号処理エンジニア (3年)
 事業企画 (1年)
 社内向けWebアプリエンジニア (1.5年)
 AWS, フロントエンド, バックエンド
 CDK歴
 半年ほど
 cloudformation半年 → ツラすぎて移行
クライヤー篠塚 一帆
2017 2018 2020 2021 2022
2019
回路、基板設計から行った
自作ニキシー管 温湿度気圧計
@badmintoncryer
@nixieminton
04
03
02
01
目次
Introduction
基本のやり方
NodeJsFunction
とかいう神
Tips
Introduction
 やりたいこと
 API Gateway & lambdaでバックエンド構築
 LambdaもTypeScriptで実装
 TypeScript
 JavaScript + 静的型付け
 TypeScriptランタイムは
(あんまり)存在しない。
 一度JavaScriptへ変換(トランスパイル)し、
生成されたJavaScriptを実行する。
API Gateway AWS Lambda
let hoge = ‘test’
hoge = 123 // OK
JavaScript
let hoge: string = ‘test’
hoge = 123 // Error@静的解析
TypeScript
??
Introduction
 LambdaでTypeScriptを動かそう!
 Node.jsをランタイムとして指定
 TypeScriptコードをJavaScriptにトランスパイル & デプロイ
 デフォルトで入っていないモジュールを用いる場合、
モジュールの紐付けが必要
 aws-sdk, child_process, fs, etc.. は何もしなくても使える
 選択肢
 layerを使う
 node_modulesを含めたzipを生成してupload
 モジュールのバンドリング
 目指したこと
 cdk deploy コマンド一発で、以下全てをいい感じに実行
 TypeScriptコードのトランスパイル
 モジュールの紐付け
 lambdaへのデプロイ
04
03
02
01
目次
Introduction
基本のやり方
NodeJsFunction
とかいう神
Tips
基本のやり方
トランスパイル
モジュールの紐付け
デプロイ
// トランスパイル & バンドリング
$ tsc
// node_modules作成
$ npm install × N回 (各lambdaフォルダ毎)
$ cdk deploy
 aws-cdk-lib.aws_lambda.Function
 aws_lambda.FunctionでTypeScript Lambdaをデプロイするには??
const function = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_16_X,
code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler’)),
handler: 'index.handler‘
})
トランスパイル & バンドリング済みのJSファイルを指定
(正確にはディレクトリ丸ごとuploadされる)
運用でカバー or デプロイ用スクリプトが必要😩😩
04
03
02
01
目次
Introduction
基本のやり方
NodeJsFunction
とかいう神
Tips
NodeJsFunctionとかいう神
トランスパイル
モジュールの紐付け
デプロイ
 aws-cdk-lib.aws_lambda_nodejs.NodeJsFunction
 NodeJsFunctionを使って TypeScript Lambdaをデプロイするには??
const hogeLambda = new nodeLambda.NodejsFunction(scope, ‘hoge’, {
runtime: lambda.Runtime.NODEJS_16_X,
entry: path.join(__dirname, './index.ts‘)
})
// めんどくさいことぜんぶ、cdk deploy におまかせ!
$ cdk deploy
TypeScriptファイルをパス指定するだけ
脳死でcdk deployコマンドを叩くだけ😍
"use strict";
var __getOwnPropNames = Object.getOwnPropertyNames;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])
((mod = { exports: {} }).exports, mod),
mod.exports;
};
…(数万行)…
exports.handler = async (
event, _context) => {
(なにかSqliteを操作)
return {…}
}
何を行っている?
 コード例 (index.ts)
import * as sqlite3 from ‘sqlite3’
exports.handler = async (
event: APIGatewayProxyEventV2WithJWTAuthorizer,
_context: Context
): Promise<APIGatewayProxyResult> => {
(なにかSqliteを操作)
return {…}
}
 成果物 (cdk.out/asset.〇〇.js)
1. node_modules内の
sqlite3モジュールを
JSファイルにバンドル
2. handlerを
JSにトランスパイル
JSファイルをlambdaにアップロード
$ cdk deploy でTypeScript Lambdaのデプロイが全て完結
1. 外部モジュールをimport
2. handlerをTypeScriptで記述
$ cdk synth
$ cdk deploy
04
03
02
01
目次
Introduction
基本のやり方
nodeLambda.
NodeJsFunction
とかいう神
Tips
Tips
 lambda互換環境でモジュールをインストールしてほしい
 Why ?
 mac環境でインストールしたモジュールがlambdaで動かない…
 native extensionを含むモジュール
 How ?
 bundling: forceDockerBundling オプション
 lambda互換コンテナ環境上で一連の処理を実行してくれる
 注意点
 macOS上で著しく動作が遅いです。
 公式でも言及有り
 「macOSユーザーは、localでesbuild使うのがオススメだぜ」
 私はgithub actions上で動かすことにしました
モジュール
インストール
トランスパイル &
バンドリング
lambda互換コンテナ
PC
$ cdk synth cdk.out生成
コンテナ
立ち上げ
コンテナ
クローズ
lambda環境向けのモジュールを
バンドリングしたJSファイルが生成
Tips
 lambdaにアップロードするファイルを操作したい
 Why ?
 ex.1 容量制限(250MB)対策のため、不要なファイルを削除したい
 prismaは各種エンジンが重く、250MB制限と戦う必要あり
 ex.2 必要なファイルを投げ込みたい
 クライアント証明書とか持たせたい!
 How ?
 コマンドフックを活用
 beforeBundling, afterBundling, beforeInstall
const hogeLambda = new nodeLambda.NodejsFunction(scope, ‘hoge', {
entry: path.join(__dirname, './index.ts‘),
bundling: {
commandHooks: {
beforeInstall: (inputDir: string, outputDir: string) => [
// スキーマファイルのコピー
`cp -r ${inputDir}/prisma ${outputDir}`,
],
afterBundling: (inputDir: string, outputDir: string) => [
// 不要なディレクトリを削除
`rm -rf ${outputDir}/unusedDirPath`,
`cp ${inputDir}/libquery… ${outputDir}`,
],
}
}
})
cdk.out/asset〇〇の中身
まとめ
 CDKを使って、lambdaをTypeScriptで実装したい
 NodeJsFunctionが神
 トランスパイル、モジュールの紐付け、デプロイを全て行ってくれる
 lambda互換環境でのバンドリングも可能。
 コマンドフック活用で、お好みのファイル操作が可能
 独自モジュールの導入、lambda容量制限のため不要なファイルを削除
 めんどくさいことを全てCDKにおまかせできる!
 あとは $ cdk deploy するだけ♪
Have a happy TypeScript Lambda life !!

More Related Content

What's hot

マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことAmazon Web Services Japan
 
CloudFrontのリアルタイムログをKibanaで可視化しよう
CloudFrontのリアルタイムログをKibanaで可視化しようCloudFrontのリアルタイムログをKibanaで可視化しよう
CloudFrontのリアルタイムログをKibanaで可視化しようEiji KOMINAMI
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Amazon Web Services Japan
 
DDDモデリング勉強会 #6
DDDモデリング勉強会 #6DDDモデリング勉強会 #6
DDDモデリング勉強会 #6株式会社Jurabi
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?naoki koyama
 
機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチ
機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチ機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチ
機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチAmazon Web Services Japan
 
CodeBuildを身近にするためのはじめの一歩
CodeBuildを身近にするためのはじめの一歩CodeBuildを身近にするためのはじめの一歩
CodeBuildを身近にするためのはじめの一歩淳 千葉
 
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDayマイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay都元ダイスケ Miyamoto
 
JenkinsとCodeBuildとCloud Buildと私
JenkinsとCodeBuildとCloud Buildと私JenkinsとCodeBuildとCloud Buildと私
JenkinsとCodeBuildとCloud Buildと私Shoji Shirotori
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知るShuhei Fujita
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますinfinite_loop
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
AWS Organizations連携サービスの罠(Security JAWS 第26回 発表資料)
AWS Organizations連携サービスの罠(Security JAWS 第26回 発表資料)AWS Organizations連携サービスの罠(Security JAWS 第26回 発表資料)
AWS Organizations連携サービスの罠(Security JAWS 第26回 発表資料)NTT DATA Technology & Innovation
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説増田 亨
 
RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門Yuki Morishita
 

What's hot (20)

Vault の鍵管理機構
Vault の鍵管理機構Vault の鍵管理機構
Vault の鍵管理機構
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
CloudFrontのリアルタイムログをKibanaで可視化しよう
CloudFrontのリアルタイムログをKibanaで可視化しようCloudFrontのリアルタイムログをKibanaで可視化しよう
CloudFrontのリアルタイムログをKibanaで可視化しよう
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
 
DDDモデリング勉強会 #6
DDDモデリング勉強会 #6DDDモデリング勉強会 #6
DDDモデリング勉強会 #6
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
 
機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチ
機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチ機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチ
機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチ
 
DevOps with Database on AWS
DevOps with Database on AWSDevOps with Database on AWS
DevOps with Database on AWS
 
CodeBuildを身近にするためのはじめの一歩
CodeBuildを身近にするためのはじめの一歩CodeBuildを身近にするためのはじめの一歩
CodeBuildを身近にするためのはじめの一歩
 
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDayマイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
 
Serverless時代のJavaについて
Serverless時代のJavaについてServerless時代のJavaについて
Serverless時代のJavaについて
 
JenkinsとCodeBuildとCloud Buildと私
JenkinsとCodeBuildとCloud Buildと私JenkinsとCodeBuildとCloud Buildと私
JenkinsとCodeBuildとCloud Buildと私
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
20211109 JAWS-UG SRE keynotes
20211109 JAWS-UG SRE keynotes20211109 JAWS-UG SRE keynotes
20211109 JAWS-UG SRE keynotes
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
AWS Organizations連携サービスの罠(Security JAWS 第26回 発表資料)
AWS Organizations連携サービスの罠(Security JAWS 第26回 発表資料)AWS Organizations連携サービスの罠(Security JAWS 第26回 発表資料)
AWS Organizations連携サービスの罠(Security JAWS 第26回 発表資料)
 
Tackling Complexity
Tackling ComplexityTackling Complexity
Tackling Complexity
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門RDB開発者のためのApache Cassandra データモデリング入門
RDB開発者のためのApache Cassandra データモデリング入門
 

Similar to TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx

20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf
20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf
20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdfSumihiro Kagawa
 
Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignRyuji TAKEHARA
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>
Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>
Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>Eucen Stew
 
How to Make Own Framework built on OWIN
How to Make Own Framework built on OWINHow to Make Own Framework built on OWIN
How to Make Own Framework built on OWINYoshifumi Kawai
 
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)Daisuke Ikeda
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpMasahito Zembutsu
 
Azureをフル活用したサーバーレスの潮流について
Azureをフル活用したサーバーレスの潮流についてAzureをフル活用したサーバーレスの潮流について
Azureをフル活用したサーバーレスの潮流について真吾 吉田
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発Yuta Matsumura
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Yoshifumi Kawai
 
Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Taisuke Oe
 
The Next Generation for C# Developers
The Next Generation for C# DevelopersThe Next Generation for C# Developers
The Next Generation for C# DevelopersTakayoshi Tanaka
 
AKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみたAKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみたHideaki Aoyagi
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例Shigeru UCHIYAMA
 
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)崇之 清水
 
LambdaとMobileの美味しいかもしれない関係
LambdaとMobileの美味しいかもしれない関係LambdaとMobileの美味しいかもしれない関係
LambdaとMobileの美味しいかもしれない関係Hiraku Komuro
 
AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境Katsutoshi Nagaoka
 
WebAPIのバリデーションを、型の力でいい感じにする
WebAPIのバリデーションを、型の力でいい感じにするWebAPIのバリデーションを、型の力でいい感じにする
WebAPIのバリデーションを、型の力でいい感じにするTakuya Kikuchi
 

Similar to TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx (20)

20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf
20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf
20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf
 
Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless Design
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>
Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>
Ma_gician (世界中のフロントエンダーの残業時間を減らす、新しいフロントエンドフレームワーク)<詳細版>
 
How to Make Own Framework built on OWIN
How to Make Own Framework built on OWINHow to Make Own Framework built on OWIN
How to Make Own Framework built on OWIN
 
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
 
Embulk 20150411
Embulk 20150411Embulk 20150411
Embulk 20150411
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorp
 
Azureをフル活用したサーバーレスの潮流について
Azureをフル活用したサーバーレスの潮流についてAzureをフル活用したサーバーレスの潮流について
Azureをフル活用したサーバーレスの潮流について
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
AWS Lambda Update
AWS Lambda UpdateAWS Lambda Update
AWS Lambda Update
 
Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Real World Android Akka - 日本語版
Real World Android Akka - 日本語版
 
The Next Generation for C# Developers
The Next Generation for C# DevelopersThe Next Generation for C# Developers
The Next Generation for C# Developers
 
AKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみたAKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみた
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
 
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
 
LambdaとMobileの美味しいかもしれない関係
LambdaとMobileの美味しいかもしれない関係LambdaとMobileの美味しいかもしれない関係
LambdaとMobileの美味しいかもしれない関係
 
AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境
 
WebAPIのバリデーションを、型の力でいい感じにする
WebAPIのバリデーションを、型の力でいい感じにするWebAPIのバリデーションを、型の力でいい感じにする
WebAPIのバリデーションを、型の力でいい感じにする
 

TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx

  • 2. 自己紹介  経歴  生命系専攻  組み込み&信号処理エンジニア (3年)  事業企画 (1年)  社内向けWebアプリエンジニア (1.5年)  AWS, フロントエンド, バックエンド  CDK歴  半年ほど  cloudformation半年 → ツラすぎて移行 クライヤー篠塚 一帆 2017 2018 2020 2021 2022 2019 回路、基板設計から行った 自作ニキシー管 温湿度気圧計 @badmintoncryer @nixieminton
  • 4. Introduction  やりたいこと  API Gateway & lambdaでバックエンド構築  LambdaもTypeScriptで実装  TypeScript  JavaScript + 静的型付け  TypeScriptランタイムは (あんまり)存在しない。  一度JavaScriptへ変換(トランスパイル)し、 生成されたJavaScriptを実行する。 API Gateway AWS Lambda let hoge = ‘test’ hoge = 123 // OK JavaScript let hoge: string = ‘test’ hoge = 123 // Error@静的解析 TypeScript ??
  • 5. Introduction  LambdaでTypeScriptを動かそう!  Node.jsをランタイムとして指定  TypeScriptコードをJavaScriptにトランスパイル & デプロイ  デフォルトで入っていないモジュールを用いる場合、 モジュールの紐付けが必要  aws-sdk, child_process, fs, etc.. は何もしなくても使える  選択肢  layerを使う  node_modulesを含めたzipを生成してupload  モジュールのバンドリング  目指したこと  cdk deploy コマンド一発で、以下全てをいい感じに実行  TypeScriptコードのトランスパイル  モジュールの紐付け  lambdaへのデプロイ
  • 7. 基本のやり方 トランスパイル モジュールの紐付け デプロイ // トランスパイル & バンドリング $ tsc // node_modules作成 $ npm install × N回 (各lambdaフォルダ毎) $ cdk deploy  aws-cdk-lib.aws_lambda.Function  aws_lambda.FunctionでTypeScript Lambdaをデプロイするには?? const function = new lambda.Function(this, 'MyFunction', { runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler’)), handler: 'index.handler‘ }) トランスパイル & バンドリング済みのJSファイルを指定 (正確にはディレクトリ丸ごとuploadされる) 運用でカバー or デプロイ用スクリプトが必要😩😩
  • 9. NodeJsFunctionとかいう神 トランスパイル モジュールの紐付け デプロイ  aws-cdk-lib.aws_lambda_nodejs.NodeJsFunction  NodeJsFunctionを使って TypeScript Lambdaをデプロイするには?? const hogeLambda = new nodeLambda.NodejsFunction(scope, ‘hoge’, { runtime: lambda.Runtime.NODEJS_16_X, entry: path.join(__dirname, './index.ts‘) }) // めんどくさいことぜんぶ、cdk deploy におまかせ! $ cdk deploy TypeScriptファイルをパス指定するだけ 脳死でcdk deployコマンドを叩くだけ😍
  • 10. "use strict"; var __getOwnPropNames = Object.getOwnPropertyNames; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]]) ((mod = { exports: {} }).exports, mod), mod.exports; }; …(数万行)… exports.handler = async ( event, _context) => { (なにかSqliteを操作) return {…} } 何を行っている?  コード例 (index.ts) import * as sqlite3 from ‘sqlite3’ exports.handler = async ( event: APIGatewayProxyEventV2WithJWTAuthorizer, _context: Context ): Promise<APIGatewayProxyResult> => { (なにかSqliteを操作) return {…} }  成果物 (cdk.out/asset.〇〇.js) 1. node_modules内の sqlite3モジュールを JSファイルにバンドル 2. handlerを JSにトランスパイル JSファイルをlambdaにアップロード $ cdk deploy でTypeScript Lambdaのデプロイが全て完結 1. 外部モジュールをimport 2. handlerをTypeScriptで記述 $ cdk synth $ cdk deploy
  • 12. Tips  lambda互換環境でモジュールをインストールしてほしい  Why ?  mac環境でインストールしたモジュールがlambdaで動かない…  native extensionを含むモジュール  How ?  bundling: forceDockerBundling オプション  lambda互換コンテナ環境上で一連の処理を実行してくれる  注意点  macOS上で著しく動作が遅いです。  公式でも言及有り  「macOSユーザーは、localでesbuild使うのがオススメだぜ」  私はgithub actions上で動かすことにしました モジュール インストール トランスパイル & バンドリング lambda互換コンテナ PC $ cdk synth cdk.out生成 コンテナ 立ち上げ コンテナ クローズ lambda環境向けのモジュールを バンドリングしたJSファイルが生成
  • 13. Tips  lambdaにアップロードするファイルを操作したい  Why ?  ex.1 容量制限(250MB)対策のため、不要なファイルを削除したい  prismaは各種エンジンが重く、250MB制限と戦う必要あり  ex.2 必要なファイルを投げ込みたい  クライアント証明書とか持たせたい!  How ?  コマンドフックを活用  beforeBundling, afterBundling, beforeInstall const hogeLambda = new nodeLambda.NodejsFunction(scope, ‘hoge', { entry: path.join(__dirname, './index.ts‘), bundling: { commandHooks: { beforeInstall: (inputDir: string, outputDir: string) => [ // スキーマファイルのコピー `cp -r ${inputDir}/prisma ${outputDir}`, ], afterBundling: (inputDir: string, outputDir: string) => [ // 不要なディレクトリを削除 `rm -rf ${outputDir}/unusedDirPath`, `cp ${inputDir}/libquery… ${outputDir}`, ], } } }) cdk.out/asset〇〇の中身
  • 14. まとめ  CDKを使って、lambdaをTypeScriptで実装したい  NodeJsFunctionが神  トランスパイル、モジュールの紐付け、デプロイを全て行ってくれる  lambda互換環境でのバンドリングも可能。  コマンドフック活用で、お好みのファイル操作が可能  独自モジュールの導入、lambda容量制限のため不要なファイルを削除  めんどくさいことを全てCDKにおまかせできる!  あとは $ cdk deploy するだけ♪ Have a happy TypeScript Lambda life !!

Editor's Notes

  1. 10s
  2. 50s
  3. 60s
  4. 2m
  5. 3m
  6. 3m05s
  7. 4m35s
  8. 4m40s
  9. 5m25s
  10. 6m35s
  11. 6m40s
  12. 8m00s
  13. 9m00s
  14. 9m45s