SlideShare a Scribd company logo
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

AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Amazon Web Services Japan
 
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo!デベロッパーネットワーク
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
Yoshiki Nakagawa
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
 
実録Blue-Green Deployment導入記
実録Blue-Green Deployment導入記実録Blue-Green Deployment導入記
実録Blue-Green Deployment導入記
Hiroyuki Ohnaka
 
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November
増田 亨
 
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjpAWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
Masahiro NAKAYAMA
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
増田 亨
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 
Azure App Service Overview
Azure App Service OverviewAzure App Service Overview
Azure App Service Overview
Takeshi Fukuhara
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
増田 亨
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
 
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
NTT DATA Technology & Innovation
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
Amazon Web Services Japan
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 

What's hot (20)

AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
 
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
実録Blue-Green Deployment導入記
実録Blue-Green Deployment導入記実録Blue-Green Deployment導入記
実録Blue-Green Deployment導入記
 
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November
 
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjpAWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
Azure App Service Overview
Azure App Service OverviewAzure App Service Overview
Azure App Service Overview
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
 
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 

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

20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf
20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf
20200528_AWSでサーバーレスなLINEBotLIFFアプリ環境をIaCな感じで構築するよ!.pdf
Sumihiro Kagawa
 
Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless Design
Ryuji TAKEHARA
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Toshiyuki 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 OWIN
Yoshifumi Kawai
 
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)Daisuke Ikeda
 
Embulk 20150411
Embulk 20150411Embulk 20150411
Embulk 20150411
Hiroshi Nakamura
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorp
Masahito 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
 
AWS Lambda Update
AWS Lambda UpdateAWS Lambda Update
AWS Lambda Update
Keisuke Nishitani
 
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# Developers
Takayoshi 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のバリデーションを、型の力でいい感じにする
 

Recently uploaded

クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdfクラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
TatsuyaHanayama
 
シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Eventシグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
K Kinzal
 
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer EventSolanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
K Kinzal
 
NIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしようNIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしよう
You&I
 
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdfCO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
yamamotominami
 
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
You&I
 

Recently uploaded (6)

クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdfクラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
 
シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Eventシグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
 
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer EventSolanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
 
NIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしようNIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしよう
 
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdfCO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
 
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
 

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