More Related Content Similar to サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所 (20) サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所4. パラダイムシフト
• Why The Future Of Software And Apps Is Serverless
by Ken Fromm, VP of Business Development at Iron.io
• コンピューティングリソースの調達リードタイムの短縮
• スタンダローンアプリからの変化(現在のMicroservices)
• クラウドで柔軟にコンピューティングリソースをサービスとして
利用することができる
• サーバーが要らないということではなく、開発者はサーバーにつ
いて「考えなくてもよくなる」
E L. M ARMF I ) RET E CP PM C N C R M A LLN FN N M M NN
5. AWS Lambda
• 2014年末 re:Invent にて発表
• サポート言語
• Node.js – v4.3.2, v6.10
• Java – Java 8
• Python – Python 2.7, 3.6
• C# - .NET Core 1.0.1
• ホスト
• Amazon Linux (時々バージョンアップ)
• 実行環境は再利用される
• 初回起動が遅いが再利用時は高速
• 一時ストレージとして /tmp 利用可能(スケールしたり破棄されたりするので
頼らないこと)
• 課金は使った分だけ
• 確保(指定)したメモリ(128MB〜1.5GB) x 実行時間(100ms単位) x 実行回数
• メモリに比例してCPUの割当ても多くなる
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html
6. Functions as a Service の台頭
• 特徴
• 実行環境は隠蔽&プラットフォーム
管理で、必要なのはコードのみ
• コンテナベースで調達リードタイム
を短縮
• 分散実行環境による可用性の確保
• 実行時間のみ課金によるコスト低減
• アーキテクチャにおける責務
• Stateful >> Statelessへ
• 永続データ >> 揮発性
• モノリシック >> Microservices
• バッチ処理 >> イベントドリブン
https://aws.amazon.com/jp/about-aws/events/reinvent-report-2014-pt2/
10. Serverlessでの開発にどんなツールを使ってますか?
P w
: M M NN 3M I R M nyc VflV dk 7 A #
/L S u5 I A puW dk 7 A
5 I MT u5 I A puW dk 8T E
( :R DD M /84w vs
) / : : M M NN /LL F F
6 A :/6
nyc VflV dk
0 PA3 MI F
8 N I 92: Wh V a Vi
6F M N C FNP : PAF xtnyor 412 #
/ : 054 embg m Vi #
- 2 FLN xtnyor 412
8T E : M M NN 6F M CM I R M
C M / : E F
nyc VflV dk 8T E
Serverless Community(JP) https://www.facebook.com/groups/813718382095265/
12. 10X Product Development
• 製品がマーケットにフィットす
るかどうかが最も重要である
• ビジネスに関連するコードの開
発時間に極力時間を使うべきで
ある
• 顧客とまわすイテレーションを
最大化すべきである
• 依存性を最小化すべきである:
仕様確定待ちで開発者を待たせ
たり、運用やDBAやその他の開
発者の影響で待たせることを極
力避けるべきである
http://www.slideshare.net/ServerlessConf/joe-emison-10x-product-development
13. 10X Product Development
Commercial Search
• 開発者2人x4ヶ月
• TypeScript 13,307行
• 開発者の稼働 95%以上(待ち時間なし)
構成
• Auth: Firebase
• Static Site Hosting: Netlify
• 画像管理: Cloudinary
• 検索: Algolia
ペインポイント
• Firebaseのダッシュボードでは大きなデータセッ
トが扱えない
• RDBMSからFirebaseに移行する開発者のラーニン
グカーブ
http://www.slideshare.net/ServerlessConf/joe-emison-10x-product-development
15. Serverlessness, NoOps and the Tooth Fairy
ベストプラクティス
• 自分のプロダクトの問題はちゃん
と直せる人は自分しかいない
• クリティカルパスを理解する
• できるかぎり小さく維持する
• プロバイダの技術情報や、内部技
術が何に依存しているか理解する
• アウトソース先に問題が起きても、
自身のサービスにおけるそれによる
結果については依然としてあなたが
責任を持たなければいけない
http://www.slideshare.net/ServerlessConf/charity-hound-serverless-noops-the-tooth-fairy
16. Serverlessness, NoOps and the Tooth Fairy
トレードオフ
• 可視性が下がる
• 自分自身で問題をfixできない
し、新機能を実装することも
できない
• サービスはあなたの支払うお
金で維持されている
• 制限や制約は公開されること
もあるし、公開されないこと
もある
http://www.slideshare.net/ServerlessConf/charity-hound-serverless-noops-the-tooth-fairy
19. RRR S IL I
Amazon
Route 53
Amazon S3
(Static Website)
Google+ profile
Cognito
Identity Pools
Lambda DynamoDB
SPA
21. 2
4 32
1
2 1
1
4 32
2
1 3 4
1
4 2 1
1 3 4 32 1
1 3 4
1 3 4 1
1 3 4 - 4 4.
1 1
4 1
• ライブラリ:jQuery (他のものでもよい)
• テストフレームワーク:Jasmine
ビュー/アプリ開発
22. ビュー/アプリ開発
• アプリ(js)開発
• ローカルで開発可能
• チーム開発がはじまっ
たらS3で
• 気をつけること
• テスト時のブラウザ
キャッシュ
[index.html]
イベント
ループ
Javascript
[app.js]
[app_spec.js]
イベントを
トリガする
リクエスト
コールバック
関数の起動
入力の取得 マークアップの変更
マークアップのテスト
23. ビュー/アプリ開発
• テスト駆動
'use strict';
var learnjs = {};
learnjs.showView = function(hash) {
var problemView = $('<div class="problem-view">').text('Coming soon!');
$('.view-container').empty().append(problemView);
}
[app.js]
実装
describe('LearnJS', function() {
it('can show a problem view', function() {
learnjs.showView('#problem-1');
expect($('.view-container .problem-view').length).toEqual(1);
});
});
[tests/app_spec.js]
テスト
ビューコンテナの存在チェックをする→テスト:エラー
→ビューコンテナを実装する→テスト:正常
24. 'use strict';
var learnjs = {};
learnjs.problemView = function() {
return $('<div class="problem-view">').text('Coming soon!');
}
learnjs.showView = function(hash) {
var routes = {
'#problem-1': learnjs.problemView
};
var viewFn = routes[hash];
if (viewFn) {
$('.view-container').empty().append(viewFn());
}
}
ビュー/アプリ開発
• テスト駆動
[tests/app_spec.js]
describe('LearnJS', function() {
it('can show a problem view', function() {
learnjs.showView('#problem-1');
expect($('.view-container .problem-view').length).toEqual(1);
});
it('shows the landing page view when there is no hash', function() {
learnjs.showView('');
expect($('.view-container .landing-view').length).toEqual(1);
});
});
テスト
ルートの存在チェック→テスト:エラー
→ルートの実装→テスト:正常
[app.js]
実装
29. DynamoDB
• NoSQLデータベース
サービス
learnjs.saveAnswer = function(problemId, answer) {
return learnjs.identity.then(function(identity) {
var db = new AWS.DynamoDB.DocumentClient();
var item = {
TableName: 'learnjs',
Item: {
userId: identity.id,
problemId: problemId,
answer: answer
}
};
return learnjs.sendDbRequest(db.put(item), function() {
return learnjs.saveAnswer(problemId, answer);
})
});
};
ユーザーID, 問題番号, 解答をDynamoDBに保存
34. PL A S IL I
Amazon
Route 53
Amazon S3
(Static Website)
Cognito
User Pools
Lambda RDS
R dkP n
Amazon S3
Sel m
37. AWS Serverless Application Model (SAM)
• サーバーレスアプリケーションの
管理フレームワーク
• CloudFormation テンプレートで
管理
• Lambda API Gateway
DynamoDB のリソースおよび複
数のイベントソースをサポート
• Apache 2.0 ライセンス
E LN. DF EP I RN N N M M NN LL F F I A
39. 手順
準備
1. AWS CLIのインストール
2. IAMユーザー作成とクレデンシャル取得
3. リリースステージ用S3バケットの作成
開発
4. Lambdaのコードを書く
5. AWS SAMファイルを書く
デプロイ
6. Lambda関数のzip化
7. パッケージする
8. アーティファクトをステージしてデプロイする
42. アーティファクトのパッケージ
$ zip app.zip index.js
$ aws cloudformation package --template-file app-spec.yml
--output-template-file app-spec.deploy --s3-bucket bucket-name
$ tree
.
app-spec.yml
app-spec.deploy
index.js
└── app.zip
43. デプロイ
$ aws cloudformation deploy ¥
--template-file app-spec.deploy ¥
--stack-name stack-name ¥
--capabilities CAPABILITY_IAM
< 最後のcapabilities指定はFunctionのサービスロールを
作成するためのIAMリソースの承認だよ、忘れずにね
※ ¥はバックスラッシュに読み替えてね
48. AWS Serverless Application Model (SAM)
• サーバーレスアプリケーションの
管理フレームワーク
• CloudFormation テンプレートで
管理
• Lambda API Gateway
DynamoDB のリソースおよび複
数のイベントソースをサポート
• Apache 2.0 ライセンス
E LN. DF EP I RN N N M M NN LL F F I A
60. Serverless Community
• ServerlessConf Tokyo ’16
http://tokyo.serverlessconf.io
• Serverless Meetup (Tokyo|Osaka|Sapporo)
https://serverless.connpass.com
• Serverless Community (JP)
https://www.facebook.com/groups/813718382095265/