SlideShare a Scribd company logo
ビットバンク株式会社
Node.jsアプリの開発をモダン化するために取り組んできたこと
@d-yokoi
東京Node学園祭2018
Copyright © bitbank, inc.
自己紹介
❏ ビットバンクでサーバーサイドを担当
❏ Node.js, TypeScript
❏ 前職ではモバイルゲームを開発
❏ C++, C#, PHP, etc.
Daiki Yokoi
Copyright © bitbank, inc.
テーマとアジェンダ
各所をモダン化して組織の拡大に耐える
❏ ソースコード編
❏ TypeScript + Nestフレームワークの採用
❏ ユニットテスト環境編
❏ Docker + モックツールの活用
❏ インフラ(AWS)編
❏ Infrastructure as Code による サーバーレス環境の構築
Copyright © bitbank, inc.
テーマとアジェンダ
各所をモダン化して組織の拡大に耐える
❏ ソースコード編
❏ TypeScript + Nestフレームワークの採用
❏ ユニットテスト環境編
❏ Docker + モックツールの活用
❏ インフラ(AWS)編
❏ Infrastructure as Code による サーバーレス環境の構築
Copyright © bitbank, inc.
❏ 既存のアプリは Node.js (v6) + Express という構成
❏ データ構造がわかりにくく、可読性が低い
❏ 新規メンバーのキャッチアップコストが高い
❏ TypeScript化のメリット
❏ コンパイラによる静的なチェック
❏ IDEによる強力なサポート
❏ フロントエンドチームとの言語共通化
素のNode.jsからTypeScriptへ
ソースコード編 ▶ 概要
Copyright © bitbank, inc.
TypeScript化と同時により効率的な開発手法を模索
❏ DIの導入
❏ 依存関係を強く意識してよりテスタブルな構成に
❏ ルーティング効率化
❏ ハンドラの登録を自動化できないか
❏ APIドキュメント
❏ スプレッドシートでの手動管理から脱却
❏ なるべくコストをかけずSwaggerUIに繋ぎこみたい
ソースコード編 ▶ 概要
Copyright © bitbank, inc.
❏ InversifyJS [1]
❏ IoCコンテナ
❏ routing-controllers [2]
❏ デコレータでハンドラを登録できる
❏ tsoa [3]
❏ APIドキュメントの自動生成
[1] http://inversify.io/
[2] https://github.com/typestack/routing-controllers
[3] https://github.com/lukeautry/tsoa
いくつかのツールを試してみた
ソースコード編 ▶ 概要
Copyright © bitbank, inc.
これらが統合されたフレームワークが欲しくなった
❏ 各ツールの守備範囲が微妙に噛み合わない
❏ ツールごとの前提条件や制約もあり、まとめ上げるのが少し面倒
ソースコード編 ▶ 概要
Copyright © bitbank, inc.
Nestを使い始めるまで
そこで見つけたのがNest
Copyright © bitbank, inc.
Nestを使ってみることに
❏ もともと欲しかった機能が一通り揃っていた
❏ オリジナルのDIコンテナ
❏ デコレータでのハンドラ登録
❏ APIドキュメントの生成
❏ ポピュラーになりそう
❏ 日本語情報が全くない中、GitHubのスターは5000超え (2018/3時点)
❏ Angularのカンファレンスにも登場
ソースコード編 ▶ 概要
Copyright © bitbank, inc.
❏ 簡単に言うとクラスの集まり
❏ 例)UserModule = UserController + UserService + …
❏ 関係性の強いクラスでまとめるべき
❏ 複数のモジュールがツリー状になって一つのアプリを構成
❏ 頂点のモジュールは ApplicationModule と命名されるのが一般的
フレームワーク独自のモジュールという概念がある
ソースコード編 ▶ Nest入門
Copyright © bitbank, inc.
モジュールツリーのイメージ
ソースコード編 ▶ Nest入門
Copyright © bitbank, inc.
❏ コントローラー
❏ 各APIのリクエストハンドラを持つクラス
❏ リクエストとレスポンスを扱い、ロジックは別クラスに任せる
❏ プロバイダ
❏ コントローラー以外のクラス
❏ ロジックを持ち、コントローラーや別のプロバイダから呼び出される
モジュール内の各クラスは以下の2つに分類される
ソースコード編 ▶ Nest入門
Copyright © bitbank, inc.
コントローラーではデコレータでハンドラを登録する
@Controller(‘users’)
class UserController {
@Get(‘:id’)
get(@Param(‘id’) id: string) {
// GET /users/1 等をハンドリングする
}
@Post()
create(@Body() body: CreateUserRequest) {
// POST /users をハンドリングする
}
}
ソースコード編 ▶ Nest入門
Copyright © bitbank, inc.
プロバイダは各種ビジネスロジックを担当
UserModule
UserController UserService
UserDetailService
SessionService
Controllers Providers
ソースコード編 ▶ Nest入門
Copyright © bitbank, inc.
依存関係はコンストラクタの実装を元に解決される
@Controller(‘users’)
class UserController {
constructor(private readonly userService: UserService) {}
// 略
}
---
@Injectable()
class UserService {
constructor(private readonly userDetailService: UserDetailService) {}
// 略
}
---
class UserDetailService {
ソースコード編 ▶ Nest入門
Copyright © bitbank, inc.
❏ ツリー状のモジュール群がアプリケーションを構成
❏ トップのモジュールは Application Module と命名する
❏ モジュールは関係性の強いクラスの集合
❏ コントローラークラス => リクエストハンドラ
❏ プロバイダクラス => ビジネスロジック
❏ クラス間の依存関係はコンストラクタの実装を元に解決される
❏ モジュールをまたぐクラス間の依存関係の解決手段もある
ここまでのおさらい
ソースコード編 ▶ Nest入門
Copyright © bitbank, inc.
@Module({
imports: [UserModule]
})
export class ApplicationModule {}
---
import { NestFactory } from '@nestjs/core';
import { ApplicationModule } from './app.module.ts';
async function bootstrap() {
const app = await NestFactory.create(ApplicationModule);
await app.listen(3000);
}
bootstrap();
モジュールが作成できたらサーバーを起動できる
ツリーのトップのモジュールを渡す
ソースコード編 ▶ Nest入門
Copyright © bitbank, inc.
❏ コントローラの実装を解析してドキュメントを生成する
❏ 必要に応じてデコレータで追加の情報を与えられる
APIドキュメントを自動で作成し、SwaggerUIに連携
ソースコード編 ▶ Nestレシピ集
Copyright © bitbank, inc.
ロギングやレスポンスの整形に便利なインターセプタ
❏ ハンドラの実行前後に処理を差し込むことができる
❏ IDを振ってリクエスト開始時と終了時のログを紐づけることができる
❏ レスポンスにメタデータを追加したりするのにも便利
❏ いわゆるアスペクト指向プログラミングをサポートしてくれる
ソースコード編 ▶ Nestレシピ集
Copyright © bitbank, inc.
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(contexct: ExecutionContext, call$: Observable<any>): Observable<any> {
const requestId = uuid.v4();
console.log(`[Before] requestId: ${requestId}`);
return call$.pipe(
tap(() =>
console.log(`[After] requestId: ${requestId}`)
),
);
}
}
ロギングやレスポンスの整形に便利なインターセプタ
一つのメソッド内で
前後の処理を記述できる
ソースコード編 ▶ Nestレシピ集
Copyright © bitbank, inc.
リクエストパラメータと同時に定義するバリデーション
class CreateUserRequest {
@Length(10, 100)
@IsEmail()
readonly mail!: string;
}
@Controller(‘users’)
class UserController {
@Post()
create(@Body() body: CreateUserRequest) {
// 新規ユーザーを作成
}
}
この時点では以下が全て完了している
- リクエストボティのパース
- 指定したクラスへの変換
- バリデーションの実行
各バリデーションをデコレータで定義
- class-validatorが提供するもの
- カスタマイズも可能
ソースコード編 ▶ Nestレシピ集
Copyright © bitbank, inc.
ガードによってアクセスコントロールを実現
❏ ガードは不正なリクエストを弾くための仕組み
❏ canActivateというインターフェースが用意されている
❏ リクエストデータを受けてboolean値を返すメソッドを実装するだけ
❏ 登録されたハンドラの実行前に評価される
❏ ビットバンクでの事例
❏ 起動時にNestの全モジュールをスキャンしてAPI一覧を動的に取得
❏ これを最新のマスターデータとして各ユーザーに紐付ける
❏ ガード内で呼び出そうとしているAPIの権限があるかをチェック
ソースコード編 ▶ Nestレシピ集
Copyright © bitbank, inc.
❏ TypeORMはポピュラーな O/R Mapper
❏ 基本的なユースケースはほぼカバーされており開発効率が上がる
❏ トランザクションやパーティショニングが絡むと少し手間だが許容範囲
❏ どうにもならなければSQLを直接書くこともできる
❏ マイグレーションの仕組みも用意されている
❏ 開発コミュニティも活発
TypeORMでのデータベースアクセスをサポート
ソースコード編 ▶ Nestレシピ集
Copyright © bitbank, inc.
❏ @nestjs/typeorm パッケージ
❏ TypeORMのリポジトリクラス等を他のクラスと同じように簡単にDI できる
TypeORMでのデータベースアクセスをサポート
ソースコード編 ▶ Nestレシピ集
Copyright © bitbank, inc.
https://tech.bitbank.cc/typeorm-entity-guideline/
ソースコード編 ▶ Nestレシピ集
Copyright © bitbank, inc.
その他
❏ @nestjs/testing パッケージ
❏ モジュール内の一部のクラスをモックに差し替えることができる
❏ 依存先が多いクラスをテストする際に便利
❏ コントローラー部分はREST以外にも対応可能
❏ GraphQL, WebSocket, gRPC, etc.
❏ MVCにも対応可能
ソースコード編 ▶ Nestレシピ集
Copyright © bitbank, inc.
TypeScript + Nest + TypeORM で開発を加速
ソースコード編 ▶ まとめ
Copyright © bitbank, inc.
テーマとアジェンダ
各所をモダン化して組織の拡大に耐える
❏ ソースコード編
❏ TypeScript + Nestフレームワークの採用
❏ ユニットテスト環境編
❏ Docker + モックツールの活用
❏ インフラ(AWS)編
❏ Infrastructure as Code によるサーバーレス環境の構築
Copyright © bitbank, inc.
当時のユニットテスト環境と課題
❏ ローカルにインストールしたMySQLやRedisを利用
❏ バージョンや設定が人によって異なる
❏ 人によってユニットテストが通ったり失敗したりする
❏ git管理されていない内容なのでコミュニケーションコストが発生する
❏ AWSの認証情報を使って直接AWSのサービスを利用
❏ 認証情報を全員が持たないといけない
❏ 他の人が認証情報を更新するとユニットテストが失敗するようになる
❏ 専用のS3バケットやKinesisストリームを用意する必要がある
ユニットテスト環境編 ▶ 概要
Copyright © bitbank, inc.
再現性が高く外部に依存しない構成へ
❏ 可能なものはコンテナを使用
❏ MySQL
❏ Redis
❏ LocalStack(AWS S3, Kinesis, etc.)
❏ その他はテストツールでモッキング
❏ Jest
❏ MockDate
ユニットテスト環境編 ▶ 概要
Copyright © bitbank, inc.
ユニットテストでのDockerの利用
❏ Docker Compose
❏ 単一ホスト上でのオーケストレーションツール
❏ 使用したいコンテナの情報をYAMLで記述
❏ Dockerに馴染みがない場合でもキャッチアップしやすい
❏ CI連携
❏ Dockerコンテナをテストに利用できるサービスが多く親和性が高い
ユニットテスト環境編 ▶ Docker
Copyright © bitbank, inc.
docker-compose.yml サンプル
ユニットテスト環境編 ▶ Docker
Copyright © bitbank, inc.
テストツールも刷新し、モックを積極活用
ユニットテスト環境編 ▶ モックツール
❏ Jest
❏ Facebook製のテスティングフレームワーク
❏ デフォルトでマルチプロセスで処理するので高速
❏ チェック用のメソッドやモック機能が豊富
❏ MockDate
❏ Dateをモック化するための軽量パッケージ
Copyright © bitbank, inc.
❏ AWS StepFunctions の実行ステータスチェックをモック化
インスタンスのメソッドをモック化するサンプル
ユニットテスト環境編 ▶ モックツール
Copyright © bitbank, inc.
❏ Axios によるGETリクエストの呼び出しをモック化
依存モジュールをモック化するサンプル
ユニットテスト環境編 ▶ モックツール
Copyright © bitbank, inc.
Dateをモック化するサンプル
ユニットテスト環境編 ▶ モックツール
Copyright © bitbank, inc.
Docker + モックツールでユニットテストも効率化
ユニットテスト環境編 ▶ まとめ
Copyright © bitbank, inc.
テーマとアジェンダ
各所をモダン化して組織の拡大に耐える
❏ ソースコード編
❏ TypeScript + Nestフレームワークの採用
❏ ユニットテスト環境編
❏ Docker + モックツールの活用
❏ インフラ(AWS)編
❏ Infrastructure as Code によるサーバーレス環境の構築
Copyright © bitbank, inc.
ポイント
インフラ(AWS)編 ▶ 概要
❏ サーバーレス環境の探求
❏ Elastic Beanstalk から ECS Fargate への移行
❏ Infrastructure as Code の実践
❏ インフラ構成を CloudFormation / SAM で積極的にコード化
Copyright © bitbank, inc.
当初は Elastic Beanstalk + Docker での運用がメイン
インフラ(AWS)編 ▶ サーバーレス環境の探求
Copyright © bitbank, inc.
Elastic Beanstalk の運用
❏ Good
❏ とにかく簡単にアプリケーションの実行環境を用意できる
❏ イミュータブルなデプロイが可能
❏ EC2インスタンス削除時のオートリカバリー
❏ Bad
❏ EC2の管理コスト
❏ 色んなことを裏側でやってくれる反面、柔軟にコントロールできない
❏ アプリのアーカイブが1000件を越えるとデプロイに失敗する
インフラ(AWS)編 ▶ サーバーレス環境の探求
Copyright © bitbank, inc.
Elastic Beanstalk の運用
❏ 合うケース
❏ インフラに割くことができるリソースが少ない
❏ あれこれ設定するよりも、AWSが提案する型に乗っかりたい
❏ 合わないケース
❏ インフラを重点的に見れる人がいる
❏ より柔軟にインフラ構築していきたい
インフラ(AWS)編 ▶ サーバーレス環境の探求
Copyright © bitbank, inc.
Copyright © bitbank, inc.
Fargate 概要
❏ フルマネージド
❏ EC2(OS, Docker Agent, ECS Agent, etc.)の管理から脱却
❏ スケーラブル
❏ シームレスにスケールアップ・アウト可能
❏ 使用したリソースに対してのみ課金(秒単位)
❏ 他のAWSサービスとのインテグレーションが容易
❏ VPC, ELB, IAM, Cloud Watch Logs, etc.
インフラ(AWS)編 ▶ サーバーレス環境の探求
Copyright © bitbank, inc.
❏ OSや各エージェントにパッチを当てる
❏ ディスクの逼迫を防ぐためのログローテーション
コンテナ環境でも引き続きEC2環境の管理が必要
インフラ(AWS)編 ▶ サーバーレス環境の探求
Copyright © bitbank, inc.
インフラ(AWS)編 ▶ サーバーレス環境の探求
❏ 開発者はアプリケーションとコンテナを作ることに集中
❏ インフラの管理は全面的にAWSにお任せする
Fargateでより効果的な役割分担が可能に
Copyright © bitbank, inc.
ECSの構成要素について
インフラ(AWS)編 ▶ サーバーレス環境の探求
❏ ECS Task
❏ アプリケーションの実行単位
❏ 1つ又は複数のコンテナで構成される
❏ ECS Service
❏ 紐づけられた1つの ECS Task の実行数を制御
❏ ECS Cluster
❏ インフラやセキュリティの分割単位
❏ 1つ又は複数の ECS Service で構成される
Copyright © bitbank, inc.
Fargateのスケーリング
インフラ(AWS)編 ▶ サーバーレス環境の探求
❏ ECS Task
❏ 必要なコンピューティングリソース(CPU/Memory)を設定
❏ コンテナが複数存在する場合は上記がシェアされる
❏ リソースが枯渇した場合は即座に停止されるのでバッファが必要
❏ ECS Service
❏ Taskの実行数を設定してロードバランサーと連携
Copyright © bitbank, inc.
Fargateのスケーリング
インフラ(AWS)編 ▶ サーバーレス環境の探求
Copyright © bitbank, inc.
Elastic Beanstalk からエンドポイント単位で移行
インフラ(AWS)編 ▶ サーバーレス環境の探求
Copyright © bitbank, inc.
❏ ドキュメンテーションコストの増加
❏ 手動で構築するとより詳細なドキュメントを残す必要がある
❏ アプリケーション数に比例してドキュメンテーションコストも増加
❏ 権限管理を厳格化した副作用
❏ 権限を持った人が手動で構築するのを待つ必要がある
AWSコンソールのみでの運用の限界
インフラ(AWS)編 ▶ Infrastructure as Code の実践
Copyright © bitbank, inc.
❏ CloudFormation
❏ Serverless Application Model (SAM)
❏ CloudFormation の拡張命令セット
❏ Lambda とその周辺コンポーネントをより簡潔に表現できる
AWSのインフラをコード化する
インフラ(AWS)編 ▶ Infrastructure as Code の実践
Copyright © bitbank, inc.
❏ コンポーネントの構成を視覚化できる
❏ ドラッグ&ドロップによるリソース追加や依存関係の構築
❏ 各リソースのプロパティ名をオートコンプリート (Ctrl + Space)
Tip1: CloudFormation Designer を使ってみる
インフラ(AWS)編 ▶ Infrastructure as Code の実践
Copyright © bitbank, inc.
❏ 一度に大量に更新すると、失敗した際のロールバックが長い
❏ git でのバージョン管理と相性が良くなる
Tip2: 少しずつ記述してデプロイする
インフラ(AWS)編 ▶ Infrastructure as Code の実践
Copyright © bitbank, inc.
❏ そのリソースはどんなプロパティを持つのか
❏ コンソールでは意識せずに使ってきたプロパティもこの機会に確認
❏ そのリソースにはどんなアクションが紐付くのか
❏ 最小限の IAM Policy を作成する際に必要になる
❏ そのリソースに対する Ref 組み込み関数が何を返すのか
❏ ARN の場合もあれば ID の場合もある
❏ 必要に応じて GetAtt 組み込み関数と使い分ける
❏ リソース間に依存関係を持たせる場合に確認する必要がある
Tip3: リソースを見る観点を理解する
インフラ(AWS)編 ▶ Infrastructure as Code の実践
Copyright © bitbank, inc.
❏ 再作成されるリソースの有無は特に注意して確認する
❏ CLIの deploy コマンド実行前に ChangeSet を作成する
❏ --no-execute-change-set オプションをつける
❏ もしくは create-change-set コマンドで代替
❏ describe-change-set コマンドで差分を表示する
Tip4: デプロイ前に変更内容を確認する
インフラ(AWS)編 ▶ Infrastructure as Code の実践
Copyright © bitbank, inc.
Serverless + IaC でインフラ構築も高速化
インフラ(AWS)編 ▶ まとめ
Copyright © bitbank, inc.
テーマとアジェンダ
各所をモダン化して組織の拡大に耐える
❏ ソースコード編
❏ TypeScript + Nestフレームワークの採用
❏ ユニットテスト環境編
❏ Docker + モックツールの活用
❏ インフラ(AWS)編
❏ Infrastructure as Code による Serverless 環境の構築
Copyright © bitbank, inc.
最後に
ご静聴ありがとうございました ( ´∀`)
Ad

More Related Content

What's hot (20)

At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Yahoo!デベロッパーネットワーク
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
 
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
Tokoroten Nakayama
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
 
[GKE & Spanner 勉強会] GKE 入門
[GKE & Spanner 勉強会] GKE 入門[GKE & Spanner 勉強会] GKE 入門
[GKE & Spanner 勉強会] GKE 入門
Google Cloud Platform - Japan
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
 
KeycloakでAPI認可に入門する
KeycloakでAPI認可に入門するKeycloakでAPI認可に入門する
KeycloakでAPI認可に入門する
Hitachi, Ltd. OSS Solution Center.
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
 
AKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみたAKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみた
Hideaki Aoyagi
 
SPAのルーティングの話
SPAのルーティングの話SPAのルーティングの話
SPAのルーティングの話
ushiboy
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
信之 岩永
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
Go Miyasaka
 
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみようドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみよう
増田 亨
 
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
NTT DATA Technology & Innovation
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
JustSystems Corporation
 
AWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグAWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグ
Amazon Web Services Japan
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
BIGLOBE Inc.
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
 
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
Tokoroten Nakayama
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
 
AKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみたAKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみた
Hideaki Aoyagi
 
SPAのルーティングの話
SPAのルーティングの話SPAのルーティングの話
SPAのルーティングの話
ushiboy
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
信之 岩永
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
Go Miyasaka
 
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみようドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみよう
増田 亨
 
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
NTT DATA Technology & Innovation
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
JustSystems Corporation
 
AWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグAWS X-Rayによるアプリケーションの分析とデバッグ
AWS X-Rayによるアプリケーションの分析とデバッグ
Amazon Web Services Japan
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
BIGLOBE Inc.
 

Similar to Node.jsアプリの開発をモダン化するために取り組んできたこと (20)

TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介
bitbank, Inc. Tokyo, Japan
 
Osc fukuoka xAI Meetup
Osc fukuoka xAI MeetupOsc fukuoka xAI Meetup
Osc fukuoka xAI Meetup
ru pic
 
Open Source x AI
Open Source x AIOpen Source x AI
Open Source x AI
Tsukasa Kato
 
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
日本マイクロソフト株式会社
 
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
Saki Homma
 
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
Saki Homma
 
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT
【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT
【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT
cloudconductor
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Toru Makabe
 
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
Akira Inoue
 
Wasm blazor and wasi 2
Wasm blazor and wasi 2Wasm blazor and wasi 2
Wasm blazor and wasi 2
Takao Tetsuro
 
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
Koto Shigeru
 
【de:code 2020】 Build 2020 最新情報 〜 Azure & Visual Studio & .NET 〜
【de:code 2020】 Build 2020 最新情報 〜 Azure & Visual Studio & .NET 〜【de:code 2020】 Build 2020 最新情報 〜 Azure & Visual Studio & .NET 〜
【de:code 2020】 Build 2020 最新情報 〜 Azure & Visual Studio & .NET 〜
日本マイクロソフト株式会社
 
Gaming cicd-pipeline gaming-technight-2
Gaming cicd-pipeline gaming-technight-2Gaming cicd-pipeline gaming-technight-2
Gaming cicd-pipeline gaming-technight-2
Amazon Web Services Japan
 
Angularreflex20141210
Angularreflex20141210Angularreflex20141210
Angularreflex20141210
Shinichiro Takezaki
 
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
Issei Hiraoka
 
本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET
本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET
本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET
Akira Inoue
 
.NET の過去、現在、そして未来 ~ .NET 最新アップデート
.NET の過去、現在、そして未来 ~ .NET 最新アップデート.NET の過去、現在、そして未来 ~ .NET 最新アップデート
.NET の過去、現在、そして未来 ~ .NET 最新アップデート
Akira Inoue
 
試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift
Etsuji Nakai
 
TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介
bitbank, Inc. Tokyo, Japan
 
Osc fukuoka xAI Meetup
Osc fukuoka xAI MeetupOsc fukuoka xAI Meetup
Osc fukuoka xAI Meetup
ru pic
 
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
日本マイクロソフト株式会社
 
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
Saki Homma
 
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
Saki Homma
 
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Shotaro Suzuki
 
【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT
【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT
【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT
cloudconductor
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Toru Makabe
 
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
.NET の今と未来 ~ デバイス&クラウド ネイティブを目指して
Akira Inoue
 
Wasm blazor and wasi 2
Wasm blazor and wasi 2Wasm blazor and wasi 2
Wasm blazor and wasi 2
Takao Tetsuro
 
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
Koto Shigeru
 
【de:code 2020】 Build 2020 最新情報 〜 Azure & Visual Studio & .NET 〜
【de:code 2020】 Build 2020 最新情報 〜 Azure & Visual Studio & .NET 〜【de:code 2020】 Build 2020 最新情報 〜 Azure & Visual Studio & .NET 〜
【de:code 2020】 Build 2020 最新情報 〜 Azure & Visual Studio & .NET 〜
日本マイクロソフト株式会社
 
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
Issei Hiraoka
 
本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET
本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET
本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET
Akira Inoue
 
.NET の過去、現在、そして未来 ~ .NET 最新アップデート
.NET の過去、現在、そして未来 ~ .NET 最新アップデート.NET の過去、現在、そして未来 ~ .NET 最新アップデート
.NET の過去、現在、そして未来 ~ .NET 最新アップデート
Akira Inoue
 
試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift
Etsuji Nakai
 
Ad

More from bitbank, Inc. Tokyo, Japan (20)

ビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略についてビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略について
bitbank, Inc. Tokyo, Japan
 
ビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdfビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdf
bitbank, Inc. Tokyo, Japan
 
ビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメントビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメント
bitbank, Inc. Tokyo, Japan
 
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
bitbank, Inc. Tokyo, Japan
 
ビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdfビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdf
bitbank, Inc. Tokyo, Japan
 
Lightning Network, Swap, Nloop
Lightning Network, Swap, NloopLightning Network, Swap, Nloop
Lightning Network, Swap, Nloop
bitbank, Inc. Tokyo, Japan
 
ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略
bitbank, Inc. Tokyo, Japan
 
bitbank Corporate Information
bitbank Corporate Informationbitbank Corporate Information
bitbank Corporate Information
bitbank, Inc. Tokyo, Japan
 
ng build --prod & Continuous Delivery
ng build --prod & Continuous Deliveryng build --prod & Continuous Delivery
ng build --prod & Continuous Delivery
bitbank, Inc. Tokyo, Japan
 
マーブル図で怖くないRxJS
マーブル図で怖くないRxJSマーブル図で怖くないRxJS
マーブル図で怖くないRxJS
bitbank, Inc. Tokyo, Japan
 
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
bitbank, Inc. Tokyo, Japan
 
中規模Angularアプリケーションの再設計
中規模Angularアプリケーションの再設計中規模Angularアプリケーションの再設計
中規模Angularアプリケーションの再設計
bitbank, Inc. Tokyo, Japan
 
仮想通貨取引所 bitbank の IaC の導入と実践
仮想通貨取引所 bitbank の IaC の導入と実践 仮想通貨取引所 bitbank の IaC の導入と実践
仮想通貨取引所 bitbank の IaC の導入と実践
bitbank, Inc. Tokyo, Japan
 
Introduction of bitbank frontend development environment
Introduction of bitbank frontend development environmentIntroduction of bitbank frontend development environment
Introduction of bitbank frontend development environment
bitbank, Inc. Tokyo, Japan
 
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるかDeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
bitbank, Inc. Tokyo, Japan
 
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介	ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
bitbank, Inc. Tokyo, Japan
 
Ethereumのシャーディング概論
Ethereumのシャーディング概論Ethereumのシャーディング概論
Ethereumのシャーディング概論
bitbank, Inc. Tokyo, Japan
 
Daocasinoにおけるstate channel実装
Daocasinoにおけるstate channel実装Daocasinoにおけるstate channel実装
Daocasinoにおけるstate channel実装
bitbank, Inc. Tokyo, Japan
 
TypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみようTypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみよう
bitbank, Inc. Tokyo, Japan
 
Deploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in FargateDeploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in Fargate
bitbank, Inc. Tokyo, Japan
 
ビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略についてビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略について
bitbank, Inc. Tokyo, Japan
 
ビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdfビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdf
bitbank, Inc. Tokyo, Japan
 
ビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメントビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメント
bitbank, Inc. Tokyo, Japan
 
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
bitbank, Inc. Tokyo, Japan
 
ビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdfビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdf
bitbank, Inc. Tokyo, Japan
 
ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略
bitbank, Inc. Tokyo, Japan
 
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
bitbank, Inc. Tokyo, Japan
 
中規模Angularアプリケーションの再設計
中規模Angularアプリケーションの再設計中規模Angularアプリケーションの再設計
中規模Angularアプリケーションの再設計
bitbank, Inc. Tokyo, Japan
 
仮想通貨取引所 bitbank の IaC の導入と実践
仮想通貨取引所 bitbank の IaC の導入と実践 仮想通貨取引所 bitbank の IaC の導入と実践
仮想通貨取引所 bitbank の IaC の導入と実践
bitbank, Inc. Tokyo, Japan
 
Introduction of bitbank frontend development environment
Introduction of bitbank frontend development environmentIntroduction of bitbank frontend development environment
Introduction of bitbank frontend development environment
bitbank, Inc. Tokyo, Japan
 
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるかDeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
bitbank, Inc. Tokyo, Japan
 
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介	ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
bitbank, Inc. Tokyo, Japan
 
TypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみようTypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみよう
bitbank, Inc. Tokyo, Japan
 
Deploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in FargateDeploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in Fargate
bitbank, Inc. Tokyo, Japan
 
Ad

Node.jsアプリの開発をモダン化するために取り組んできたこと

  • 2. Copyright © bitbank, inc. 自己紹介 ❏ ビットバンクでサーバーサイドを担当 ❏ Node.js, TypeScript ❏ 前職ではモバイルゲームを開発 ❏ C++, C#, PHP, etc. Daiki Yokoi
  • 3. Copyright © bitbank, inc. テーマとアジェンダ 各所をモダン化して組織の拡大に耐える ❏ ソースコード編 ❏ TypeScript + Nestフレームワークの採用 ❏ ユニットテスト環境編 ❏ Docker + モックツールの活用 ❏ インフラ(AWS)編 ❏ Infrastructure as Code による サーバーレス環境の構築
  • 4. Copyright © bitbank, inc. テーマとアジェンダ 各所をモダン化して組織の拡大に耐える ❏ ソースコード編 ❏ TypeScript + Nestフレームワークの採用 ❏ ユニットテスト環境編 ❏ Docker + モックツールの活用 ❏ インフラ(AWS)編 ❏ Infrastructure as Code による サーバーレス環境の構築
  • 5. Copyright © bitbank, inc. ❏ 既存のアプリは Node.js (v6) + Express という構成 ❏ データ構造がわかりにくく、可読性が低い ❏ 新規メンバーのキャッチアップコストが高い ❏ TypeScript化のメリット ❏ コンパイラによる静的なチェック ❏ IDEによる強力なサポート ❏ フロントエンドチームとの言語共通化 素のNode.jsからTypeScriptへ ソースコード編 ▶ 概要
  • 6. Copyright © bitbank, inc. TypeScript化と同時により効率的な開発手法を模索 ❏ DIの導入 ❏ 依存関係を強く意識してよりテスタブルな構成に ❏ ルーティング効率化 ❏ ハンドラの登録を自動化できないか ❏ APIドキュメント ❏ スプレッドシートでの手動管理から脱却 ❏ なるべくコストをかけずSwaggerUIに繋ぎこみたい ソースコード編 ▶ 概要
  • 7. Copyright © bitbank, inc. ❏ InversifyJS [1] ❏ IoCコンテナ ❏ routing-controllers [2] ❏ デコレータでハンドラを登録できる ❏ tsoa [3] ❏ APIドキュメントの自動生成 [1] http://inversify.io/ [2] https://github.com/typestack/routing-controllers [3] https://github.com/lukeautry/tsoa いくつかのツールを試してみた ソースコード編 ▶ 概要
  • 8. Copyright © bitbank, inc. これらが統合されたフレームワークが欲しくなった ❏ 各ツールの守備範囲が微妙に噛み合わない ❏ ツールごとの前提条件や制約もあり、まとめ上げるのが少し面倒 ソースコード編 ▶ 概要
  • 9. Copyright © bitbank, inc. Nestを使い始めるまで そこで見つけたのがNest
  • 10. Copyright © bitbank, inc. Nestを使ってみることに ❏ もともと欲しかった機能が一通り揃っていた ❏ オリジナルのDIコンテナ ❏ デコレータでのハンドラ登録 ❏ APIドキュメントの生成 ❏ ポピュラーになりそう ❏ 日本語情報が全くない中、GitHubのスターは5000超え (2018/3時点) ❏ Angularのカンファレンスにも登場 ソースコード編 ▶ 概要
  • 11. Copyright © bitbank, inc. ❏ 簡単に言うとクラスの集まり ❏ 例)UserModule = UserController + UserService + … ❏ 関係性の強いクラスでまとめるべき ❏ 複数のモジュールがツリー状になって一つのアプリを構成 ❏ 頂点のモジュールは ApplicationModule と命名されるのが一般的 フレームワーク独自のモジュールという概念がある ソースコード編 ▶ Nest入門
  • 12. Copyright © bitbank, inc. モジュールツリーのイメージ ソースコード編 ▶ Nest入門
  • 13. Copyright © bitbank, inc. ❏ コントローラー ❏ 各APIのリクエストハンドラを持つクラス ❏ リクエストとレスポンスを扱い、ロジックは別クラスに任せる ❏ プロバイダ ❏ コントローラー以外のクラス ❏ ロジックを持ち、コントローラーや別のプロバイダから呼び出される モジュール内の各クラスは以下の2つに分類される ソースコード編 ▶ Nest入門
  • 14. Copyright © bitbank, inc. コントローラーではデコレータでハンドラを登録する @Controller(‘users’) class UserController { @Get(‘:id’) get(@Param(‘id’) id: string) { // GET /users/1 等をハンドリングする } @Post() create(@Body() body: CreateUserRequest) { // POST /users をハンドリングする } } ソースコード編 ▶ Nest入門
  • 15. Copyright © bitbank, inc. プロバイダは各種ビジネスロジックを担当 UserModule UserController UserService UserDetailService SessionService Controllers Providers ソースコード編 ▶ Nest入門
  • 16. Copyright © bitbank, inc. 依存関係はコンストラクタの実装を元に解決される @Controller(‘users’) class UserController { constructor(private readonly userService: UserService) {} // 略 } --- @Injectable() class UserService { constructor(private readonly userDetailService: UserDetailService) {} // 略 } --- class UserDetailService { ソースコード編 ▶ Nest入門
  • 17. Copyright © bitbank, inc. ❏ ツリー状のモジュール群がアプリケーションを構成 ❏ トップのモジュールは Application Module と命名する ❏ モジュールは関係性の強いクラスの集合 ❏ コントローラークラス => リクエストハンドラ ❏ プロバイダクラス => ビジネスロジック ❏ クラス間の依存関係はコンストラクタの実装を元に解決される ❏ モジュールをまたぐクラス間の依存関係の解決手段もある ここまでのおさらい ソースコード編 ▶ Nest入門
  • 18. Copyright © bitbank, inc. @Module({ imports: [UserModule] }) export class ApplicationModule {} --- import { NestFactory } from '@nestjs/core'; import { ApplicationModule } from './app.module.ts'; async function bootstrap() { const app = await NestFactory.create(ApplicationModule); await app.listen(3000); } bootstrap(); モジュールが作成できたらサーバーを起動できる ツリーのトップのモジュールを渡す ソースコード編 ▶ Nest入門
  • 19. Copyright © bitbank, inc. ❏ コントローラの実装を解析してドキュメントを生成する ❏ 必要に応じてデコレータで追加の情報を与えられる APIドキュメントを自動で作成し、SwaggerUIに連携 ソースコード編 ▶ Nestレシピ集
  • 20. Copyright © bitbank, inc. ロギングやレスポンスの整形に便利なインターセプタ ❏ ハンドラの実行前後に処理を差し込むことができる ❏ IDを振ってリクエスト開始時と終了時のログを紐づけることができる ❏ レスポンスにメタデータを追加したりするのにも便利 ❏ いわゆるアスペクト指向プログラミングをサポートしてくれる ソースコード編 ▶ Nestレシピ集
  • 21. Copyright © bitbank, inc. @Injectable() export class LoggingInterceptor implements NestInterceptor { intercept(contexct: ExecutionContext, call$: Observable<any>): Observable<any> { const requestId = uuid.v4(); console.log(`[Before] requestId: ${requestId}`); return call$.pipe( tap(() => console.log(`[After] requestId: ${requestId}`) ), ); } } ロギングやレスポンスの整形に便利なインターセプタ 一つのメソッド内で 前後の処理を記述できる ソースコード編 ▶ Nestレシピ集
  • 22. Copyright © bitbank, inc. リクエストパラメータと同時に定義するバリデーション class CreateUserRequest { @Length(10, 100) @IsEmail() readonly mail!: string; } @Controller(‘users’) class UserController { @Post() create(@Body() body: CreateUserRequest) { // 新規ユーザーを作成 } } この時点では以下が全て完了している - リクエストボティのパース - 指定したクラスへの変換 - バリデーションの実行 各バリデーションをデコレータで定義 - class-validatorが提供するもの - カスタマイズも可能 ソースコード編 ▶ Nestレシピ集
  • 23. Copyright © bitbank, inc. ガードによってアクセスコントロールを実現 ❏ ガードは不正なリクエストを弾くための仕組み ❏ canActivateというインターフェースが用意されている ❏ リクエストデータを受けてboolean値を返すメソッドを実装するだけ ❏ 登録されたハンドラの実行前に評価される ❏ ビットバンクでの事例 ❏ 起動時にNestの全モジュールをスキャンしてAPI一覧を動的に取得 ❏ これを最新のマスターデータとして各ユーザーに紐付ける ❏ ガード内で呼び出そうとしているAPIの権限があるかをチェック ソースコード編 ▶ Nestレシピ集
  • 24. Copyright © bitbank, inc. ❏ TypeORMはポピュラーな O/R Mapper ❏ 基本的なユースケースはほぼカバーされており開発効率が上がる ❏ トランザクションやパーティショニングが絡むと少し手間だが許容範囲 ❏ どうにもならなければSQLを直接書くこともできる ❏ マイグレーションの仕組みも用意されている ❏ 開発コミュニティも活発 TypeORMでのデータベースアクセスをサポート ソースコード編 ▶ Nestレシピ集
  • 25. Copyright © bitbank, inc. ❏ @nestjs/typeorm パッケージ ❏ TypeORMのリポジトリクラス等を他のクラスと同じように簡単にDI できる TypeORMでのデータベースアクセスをサポート ソースコード編 ▶ Nestレシピ集
  • 26. Copyright © bitbank, inc. https://tech.bitbank.cc/typeorm-entity-guideline/ ソースコード編 ▶ Nestレシピ集
  • 27. Copyright © bitbank, inc. その他 ❏ @nestjs/testing パッケージ ❏ モジュール内の一部のクラスをモックに差し替えることができる ❏ 依存先が多いクラスをテストする際に便利 ❏ コントローラー部分はREST以外にも対応可能 ❏ GraphQL, WebSocket, gRPC, etc. ❏ MVCにも対応可能 ソースコード編 ▶ Nestレシピ集
  • 28. Copyright © bitbank, inc. TypeScript + Nest + TypeORM で開発を加速 ソースコード編 ▶ まとめ
  • 29. Copyright © bitbank, inc. テーマとアジェンダ 各所をモダン化して組織の拡大に耐える ❏ ソースコード編 ❏ TypeScript + Nestフレームワークの採用 ❏ ユニットテスト環境編 ❏ Docker + モックツールの活用 ❏ インフラ(AWS)編 ❏ Infrastructure as Code によるサーバーレス環境の構築
  • 30. Copyright © bitbank, inc. 当時のユニットテスト環境と課題 ❏ ローカルにインストールしたMySQLやRedisを利用 ❏ バージョンや設定が人によって異なる ❏ 人によってユニットテストが通ったり失敗したりする ❏ git管理されていない内容なのでコミュニケーションコストが発生する ❏ AWSの認証情報を使って直接AWSのサービスを利用 ❏ 認証情報を全員が持たないといけない ❏ 他の人が認証情報を更新するとユニットテストが失敗するようになる ❏ 専用のS3バケットやKinesisストリームを用意する必要がある ユニットテスト環境編 ▶ 概要
  • 31. Copyright © bitbank, inc. 再現性が高く外部に依存しない構成へ ❏ 可能なものはコンテナを使用 ❏ MySQL ❏ Redis ❏ LocalStack(AWS S3, Kinesis, etc.) ❏ その他はテストツールでモッキング ❏ Jest ❏ MockDate ユニットテスト環境編 ▶ 概要
  • 32. Copyright © bitbank, inc. ユニットテストでのDockerの利用 ❏ Docker Compose ❏ 単一ホスト上でのオーケストレーションツール ❏ 使用したいコンテナの情報をYAMLで記述 ❏ Dockerに馴染みがない場合でもキャッチアップしやすい ❏ CI連携 ❏ Dockerコンテナをテストに利用できるサービスが多く親和性が高い ユニットテスト環境編 ▶ Docker
  • 33. Copyright © bitbank, inc. docker-compose.yml サンプル ユニットテスト環境編 ▶ Docker
  • 34. Copyright © bitbank, inc. テストツールも刷新し、モックを積極活用 ユニットテスト環境編 ▶ モックツール ❏ Jest ❏ Facebook製のテスティングフレームワーク ❏ デフォルトでマルチプロセスで処理するので高速 ❏ チェック用のメソッドやモック機能が豊富 ❏ MockDate ❏ Dateをモック化するための軽量パッケージ
  • 35. Copyright © bitbank, inc. ❏ AWS StepFunctions の実行ステータスチェックをモック化 インスタンスのメソッドをモック化するサンプル ユニットテスト環境編 ▶ モックツール
  • 36. Copyright © bitbank, inc. ❏ Axios によるGETリクエストの呼び出しをモック化 依存モジュールをモック化するサンプル ユニットテスト環境編 ▶ モックツール
  • 37. Copyright © bitbank, inc. Dateをモック化するサンプル ユニットテスト環境編 ▶ モックツール
  • 38. Copyright © bitbank, inc. Docker + モックツールでユニットテストも効率化 ユニットテスト環境編 ▶ まとめ
  • 39. Copyright © bitbank, inc. テーマとアジェンダ 各所をモダン化して組織の拡大に耐える ❏ ソースコード編 ❏ TypeScript + Nestフレームワークの採用 ❏ ユニットテスト環境編 ❏ Docker + モックツールの活用 ❏ インフラ(AWS)編 ❏ Infrastructure as Code によるサーバーレス環境の構築
  • 40. Copyright © bitbank, inc. ポイント インフラ(AWS)編 ▶ 概要 ❏ サーバーレス環境の探求 ❏ Elastic Beanstalk から ECS Fargate への移行 ❏ Infrastructure as Code の実践 ❏ インフラ構成を CloudFormation / SAM で積極的にコード化
  • 41. Copyright © bitbank, inc. 当初は Elastic Beanstalk + Docker での運用がメイン インフラ(AWS)編 ▶ サーバーレス環境の探求
  • 42. Copyright © bitbank, inc. Elastic Beanstalk の運用 ❏ Good ❏ とにかく簡単にアプリケーションの実行環境を用意できる ❏ イミュータブルなデプロイが可能 ❏ EC2インスタンス削除時のオートリカバリー ❏ Bad ❏ EC2の管理コスト ❏ 色んなことを裏側でやってくれる反面、柔軟にコントロールできない ❏ アプリのアーカイブが1000件を越えるとデプロイに失敗する インフラ(AWS)編 ▶ サーバーレス環境の探求
  • 43. Copyright © bitbank, inc. Elastic Beanstalk の運用 ❏ 合うケース ❏ インフラに割くことができるリソースが少ない ❏ あれこれ設定するよりも、AWSが提案する型に乗っかりたい ❏ 合わないケース ❏ インフラを重点的に見れる人がいる ❏ より柔軟にインフラ構築していきたい インフラ(AWS)編 ▶ サーバーレス環境の探求
  • 45. Copyright © bitbank, inc. Fargate 概要 ❏ フルマネージド ❏ EC2(OS, Docker Agent, ECS Agent, etc.)の管理から脱却 ❏ スケーラブル ❏ シームレスにスケールアップ・アウト可能 ❏ 使用したリソースに対してのみ課金(秒単位) ❏ 他のAWSサービスとのインテグレーションが容易 ❏ VPC, ELB, IAM, Cloud Watch Logs, etc. インフラ(AWS)編 ▶ サーバーレス環境の探求
  • 46. Copyright © bitbank, inc. ❏ OSや各エージェントにパッチを当てる ❏ ディスクの逼迫を防ぐためのログローテーション コンテナ環境でも引き続きEC2環境の管理が必要 インフラ(AWS)編 ▶ サーバーレス環境の探求
  • 47. Copyright © bitbank, inc. インフラ(AWS)編 ▶ サーバーレス環境の探求 ❏ 開発者はアプリケーションとコンテナを作ることに集中 ❏ インフラの管理は全面的にAWSにお任せする Fargateでより効果的な役割分担が可能に
  • 48. Copyright © bitbank, inc. ECSの構成要素について インフラ(AWS)編 ▶ サーバーレス環境の探求 ❏ ECS Task ❏ アプリケーションの実行単位 ❏ 1つ又は複数のコンテナで構成される ❏ ECS Service ❏ 紐づけられた1つの ECS Task の実行数を制御 ❏ ECS Cluster ❏ インフラやセキュリティの分割単位 ❏ 1つ又は複数の ECS Service で構成される
  • 49. Copyright © bitbank, inc. Fargateのスケーリング インフラ(AWS)編 ▶ サーバーレス環境の探求 ❏ ECS Task ❏ 必要なコンピューティングリソース(CPU/Memory)を設定 ❏ コンテナが複数存在する場合は上記がシェアされる ❏ リソースが枯渇した場合は即座に停止されるのでバッファが必要 ❏ ECS Service ❏ Taskの実行数を設定してロードバランサーと連携
  • 50. Copyright © bitbank, inc. Fargateのスケーリング インフラ(AWS)編 ▶ サーバーレス環境の探求
  • 51. Copyright © bitbank, inc. Elastic Beanstalk からエンドポイント単位で移行 インフラ(AWS)編 ▶ サーバーレス環境の探求
  • 52. Copyright © bitbank, inc. ❏ ドキュメンテーションコストの増加 ❏ 手動で構築するとより詳細なドキュメントを残す必要がある ❏ アプリケーション数に比例してドキュメンテーションコストも増加 ❏ 権限管理を厳格化した副作用 ❏ 権限を持った人が手動で構築するのを待つ必要がある AWSコンソールのみでの運用の限界 インフラ(AWS)編 ▶ Infrastructure as Code の実践
  • 53. Copyright © bitbank, inc. ❏ CloudFormation ❏ Serverless Application Model (SAM) ❏ CloudFormation の拡張命令セット ❏ Lambda とその周辺コンポーネントをより簡潔に表現できる AWSのインフラをコード化する インフラ(AWS)編 ▶ Infrastructure as Code の実践
  • 54. Copyright © bitbank, inc. ❏ コンポーネントの構成を視覚化できる ❏ ドラッグ&ドロップによるリソース追加や依存関係の構築 ❏ 各リソースのプロパティ名をオートコンプリート (Ctrl + Space) Tip1: CloudFormation Designer を使ってみる インフラ(AWS)編 ▶ Infrastructure as Code の実践
  • 55. Copyright © bitbank, inc. ❏ 一度に大量に更新すると、失敗した際のロールバックが長い ❏ git でのバージョン管理と相性が良くなる Tip2: 少しずつ記述してデプロイする インフラ(AWS)編 ▶ Infrastructure as Code の実践
  • 56. Copyright © bitbank, inc. ❏ そのリソースはどんなプロパティを持つのか ❏ コンソールでは意識せずに使ってきたプロパティもこの機会に確認 ❏ そのリソースにはどんなアクションが紐付くのか ❏ 最小限の IAM Policy を作成する際に必要になる ❏ そのリソースに対する Ref 組み込み関数が何を返すのか ❏ ARN の場合もあれば ID の場合もある ❏ 必要に応じて GetAtt 組み込み関数と使い分ける ❏ リソース間に依存関係を持たせる場合に確認する必要がある Tip3: リソースを見る観点を理解する インフラ(AWS)編 ▶ Infrastructure as Code の実践
  • 57. Copyright © bitbank, inc. ❏ 再作成されるリソースの有無は特に注意して確認する ❏ CLIの deploy コマンド実行前に ChangeSet を作成する ❏ --no-execute-change-set オプションをつける ❏ もしくは create-change-set コマンドで代替 ❏ describe-change-set コマンドで差分を表示する Tip4: デプロイ前に変更内容を確認する インフラ(AWS)編 ▶ Infrastructure as Code の実践
  • 58. Copyright © bitbank, inc. Serverless + IaC でインフラ構築も高速化 インフラ(AWS)編 ▶ まとめ
  • 59. Copyright © bitbank, inc. テーマとアジェンダ 各所をモダン化して組織の拡大に耐える ❏ ソースコード編 ❏ TypeScript + Nestフレームワークの採用 ❏ ユニットテスト環境編 ❏ Docker + モックツールの活用 ❏ インフラ(AWS)編 ❏ Infrastructure as Code による Serverless 環境の構築
  • 60. Copyright © bitbank, inc. 最後に ご静聴ありがとうございました ( ´∀`)