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

PDF
AWS Black Belt Online Seminar Amazon Aurora
PDF
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
PDF
20190806 AWS Black Belt Online Seminar AWS Glue
PDF
AWS Black Belt Techシリーズ AWS Direct Connect
PPTX
RLSを用いたマルチテナント実装 for Django
PDF
20210317 AWS Black Belt Online Seminar Amazon MQ
PDF
20190424 AWS Black Belt Online Seminar Amazon Aurora MySQL
PPTX
AWSで作る分析基盤
AWS Black Belt Online Seminar Amazon Aurora
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
20190806 AWS Black Belt Online Seminar AWS Glue
AWS Black Belt Techシリーズ AWS Direct Connect
RLSを用いたマルチテナント実装 for Django
20210317 AWS Black Belt Online Seminar Amazon MQ
20190424 AWS Black Belt Online Seminar Amazon Aurora MySQL
AWSで作る分析基盤

What's hot (20)

PDF
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
PDF
20190226 AWS Black Belt Online Seminar Amazon WorkSpaces
PDF
AWS Black Belt Tech シリーズ 2015 - Amazon Redshift
PDF
Amazon Athena 初心者向けハンズオン
PDF
[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな
PDF
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
PDF
20190206 AWS Black Belt Online Seminar Amazon SageMaker Basic Session
PDF
DevOps with Database on AWS
PPTX
LINEのMySQL運用について 修正版
PDF
AWS Black Belt Online Seminar 2016 AWS Key Management Service
PDF
最近のストリーム処理事情振り返り
PDF
AWS Black Belt Online Seminar 2016 AWS上でのActive Directory構築
PPTX
Boto3からの解放。python3の標準ライブラリのみでawsサービスを取り扱うには
PDF
20200812 AWS Black Belt Online Seminar Amazon Macie
PDF
AWS Black Belt Online Seminar 2017 Amazon ElastiCache
PDF
AWS Black Belt Online Seminar 2017 AWS WAF
PDF
AWSのログ管理ベストプラクティス
PDF
20200303 AWS Black Belt Online Seminar AWS Cloud Development Kit (CDK)
PDF
DynamoDB設計のちょっとした技
PDF
AWS Black Belt Online Seminar 2017 AWS X-Ray
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
20190226 AWS Black Belt Online Seminar Amazon WorkSpaces
AWS Black Belt Tech シリーズ 2015 - Amazon Redshift
Amazon Athena 初心者向けハンズオン
[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
20190206 AWS Black Belt Online Seminar Amazon SageMaker Basic Session
DevOps with Database on AWS
LINEのMySQL運用について 修正版
AWS Black Belt Online Seminar 2016 AWS Key Management Service
最近のストリーム処理事情振り返り
AWS Black Belt Online Seminar 2016 AWS上でのActive Directory構築
Boto3からの解放。python3の標準ライブラリのみでawsサービスを取り扱うには
20200812 AWS Black Belt Online Seminar Amazon Macie
AWS Black Belt Online Seminar 2017 Amazon ElastiCache
AWS Black Belt Online Seminar 2017 AWS WAF
AWSのログ管理ベストプラクティス
20200303 AWS Black Belt Online Seminar AWS Cloud Development Kit (CDK)
DynamoDB設計のちょっとした技
AWS Black Belt Online Seminar 2017 AWS X-Ray
Ad

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