DevAx connect - pages.awscloud.com
Transcript of DevAx connect - pages.awscloud.com
![Page 1: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/1.jpg)
connectDevAx
connectDevAx
How to Test your Events?
金森政雄DevAx ソリューションアーキテクトAmazon Web Services Japan K,K
![Page 2: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/2.jpg)
connectDevAx
アジェンダ
![Page 3: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/3.jpg)
connectDevAx
![Page 4: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/4.jpg)
connectDevAx
作成したシステムに不具合があると、、、
なぜテストが必要か
コスト(経済的/時間的)
信頼の失墜 重大な事故機会の損失
![Page 5: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/5.jpg)
connectDevAx
• 要件レビューによる要件の正確性向上、余計な工数の排除
• テストしやすい設計による拡張性の高いソフトウェア
• 不具合の少ないソフトウェアによりビジネスの成功の可能性をアップ
テストはビジネスを成功させるためにある
![Page 6: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/6.jpg)
connectDevAx
テストにおける制約• 時間的制約• リソース的制約
• テスト人員• テスト環境• ソフトウェア的制約
→「いかに効率よく重要な欠陥を見つけるか」がテスト成功の鍵
だから制約もある
![Page 7: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/7.jpg)
connectDevAx
我々開発者にとっては、
はやく、正確に、簡単に動く
![Page 8: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/8.jpg)
connectDevAx
「テスト」と言う言葉は幅が広い
本日のセッションでは、システムが期待する機能を提供することを確認する行為を「テスト」とします。システムにおいて、単体テスト、結合テスト、受入テストなどと呼ばれるテストを想定します。(非機能は含みません)
![Page 9: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/9.jpg)
connectDevAx
![Page 10: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/10.jpg)
connectDevAx
基盤となるフレームワーク
データアクセスサービス
フライト、ホテル、旅行のデータがモノリスなデータベース
に格納される
フライト/ホテル/旅行サービス
ユーザーエクスペリエンスとセッションマネージャー
コードベースの内部に複雑性が隠蔽されていた
モノリスアーキテクチャ
![Page 11: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/11.jpg)
connectDevAx
コードベースの複雑さ
コンポーネント間の連携の複雑さ
複雑さが内から外へ移行している
![Page 12: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/12.jpg)
connectDevAx
イベント駆動/分散システムのテストの課題
![Page 13: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/13.jpg)
connectDevAx
イベント駆動/分散システムのテストの課題
2. 非同期処理の結果確認の手間3. 早い変化の中で整合性を取らないといけない
![Page 14: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/14.jpg)
connectDevAx
コード上でも外部の依存関係が多くなる
Client ClientAmazon API Gateway
EndpointLambda function Table
Dynamo DBStreams
Lambda functionSNS Topic
Queue Lambda function
![Page 15: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/15.jpg)
connectDevAx
イベント駆動/分散システムのテストの課題
1. 外部の依存関係が増える
3. 早い変化の中で整合性を取らないといけない
![Page 16: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/16.jpg)
connectDevAx
© 2021, Amazon Web Services, Inc. or its affiliates. All rights reserved.
非同期化による応答性の改善と依存性の削減
同期コマンド
Client Service A Service B
非同期イベント
Client Service A Service B
![Page 17: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/17.jpg)
connectDevAx
非同期処理のテスト
ClientClient
Amazon API GatewayEndpoint
Lambda function Table
Dynamo DBStreams
Lambda functionSNS Topic
Queue Lambda function
202:Accepted
![Page 18: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/18.jpg)
connectDevAx
イベント駆動/分散システムのテストの課題
1. 外部の依存関係が増える2. 非同期処理の結果確認の手間
![Page 19: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/19.jpg)
connectDevAx
早い変化の中で協調していく必要がある
AWS CodePipeline
AWS CodePipelineAWS CodePipeline
AWS CodePipeline
![Page 20: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/20.jpg)
connectDevAx
早い変化の中で協調していく必要がある
AWS CodePipeline
AWS CodePipelineAWS CodePipeline
AWS CodePipeline
![Page 21: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/21.jpg)
connectDevAx
早い変化の中で協調していく必要がある
AWS CodePipeline
AWS CodePipelineAWS CodePipeline
AWS CodePipeline
![Page 22: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/22.jpg)
connectDevAx
早い変化の中で協調していく必要がある
AWS CodePipeline
AWS CodePipelineAWS CodePipeline
AWS CodePipeline
![Page 23: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/23.jpg)
connectDevAx
早い変化の中で協調していく必要がある
AWS CodePipeline
AWS CodePipelineAWS CodePipeline
AWS CodePipeline
?
?正しく動く?
?要求を満たしている?
![Page 24: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/24.jpg)
connectDevAx
ここまでのまとめ
• はやく、
• 正確に、
• 簡単に動く
分散システムのテストの難しさ依存関係が増える
• 非同期処理
整合性
![Page 25: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/25.jpg)
connectDevAx
![Page 26: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/26.jpg)
connectDevAx
よくあるご質問
サーバーレスでシステムを構築しているんですが、AWS のマネージドサービスの呼び出しをどうやってテストすればよいでしょうか?
![Page 27: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/27.jpg)
connectDevAx
TravelBuddy を例に考えてみる
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
![Page 28: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/28.jpg)
connectDevAx
どこをテストしようとしている?
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
![Page 29: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/29.jpg)
connectDevAx
どこをテストしようとしている?
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
自分たちで実装する部分(コードの記述が必要)
AWS がサービスとして提供する機能による連携(設定のみで実現可能)
ここのテストは必要??
![Page 30: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/30.jpg)
connectDevAx
AWS or 外部のサービスをテストする必要性
このテストの問題点• かなりのコスト(工数/金額)が必要な上にビジネスに貢献しない• 本来の仕様が自分たちではわからない• バグが見つかっても自分たちでは改修できない
サービスを使う理由• ビジネスに重要な機能に集中するため
• 「差別化できない重労働」をオフロードする
開発者にとってのテスト• 素早くフィードバックを得て開発を加速する
• 自信を持って変更できるようにする
![Page 31: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/31.jpg)
connectDevAx
※動作確認やPoC は必要
![Page 32: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/32.jpg)
connectDevAx
どこをテストしようとしている?
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
AWSのサービスの機能自体(図では色をつけていない部分)
![Page 33: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/33.jpg)
connectDevAx
どこをテストしようとしている?
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
AWS がサービスとして提供する機能による連携(設定のみで実現可能
![Page 34: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/34.jpg)
connectDevAx
どこをテストしようとしている?
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
AWS がサービスとして提供する機能による連携(設定のみで実現可能
• 解決策:Policy Validation の自動化や、AWS Config, CDK のテスト など
• 今回の話とはズレてくるのでスキップ
![Page 35: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/35.jpg)
connectDevAx
どこをテストしようとしている?
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
AWS がサービスとして提供する機能による連携(設定のみで実現可能
- IAM の権限設定不備
![Page 36: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/36.jpg)
connectDevAx
どこをテストしようとしている?
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
自分たちで実装する部分(コードの記述が必要)
AWS がサービスとして提供する機能による連携(設定のみで実現可能)
![Page 37: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/37.jpg)
connectDevAx
どうやってテストする?
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
ローカルでの実行 クラウド上で実施
![Page 38: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/38.jpg)
connectDevAx
どうやってテストする?
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
クラウド上で実施ローカルでの実行
![Page 39: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/39.jpg)
connectDevAx
ローカルでの実行
SAM CLI
例: SAM CLI を使ったローカルでのサーバーレスアプリケーション実行
$ sam local generate-event ¥dynamodb update ¥--table reservation > event.json
ローカル起動用の Dummy Event データの生成
$ sam local invoke -e event.json
生成したEvent データを使ったLambda の実行
$ sam local start-api
API Gatewayから、Lambdaを呼び出し実行
→ http://127.0.0.1:3000 で起動
![Page 40: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/40.jpg)
connectDevAx
ローカルでの実行
Step Functions Local
AWS CodeBuild agent
DynamoDB Local
AWS Amplify
$ docker run -p 8083:8083 ¥amazon/aws-stepfunctions-
local
$ docker run -d -p 8000:8000 ¥amazon/dynamodb-local ¥-jar DynamoDBLocal.jar ¥-sharedDb
SAM CLI 以外のローカルでのAWS サービスの実行
$ amplify mock$ ./codebuild_build.sh
-i aws/codebuild/standard:5.0 ¥-a output
![Page 41: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/41.jpg)
connectDevAx
ローカルマシン
ローカルでの実行
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
DynamoDB Local
今回のサンプルは全てローカルで実行することも可能
ツールなどのインストール設定/コードの書換 連携設定の確認にはならないクラウド上での動作を
全て再現はできない
![Page 42: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/42.jpg)
connectDevAx
ローカルでの実行メリット/デメリット
メリット• 高速に動作確認が可能• デプロイ不要、AWS利用料なし• ブレークポイントのサポート
デメリット• 完全に再現できるわけではない• IAM など検証できない部分も• 環境構築、維持にコストがかかる
はやく 正確に※ 簡単に動く
※
![Page 43: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/43.jpg)
connectDevAx
どうやってテストする?
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
ローカルでの実行 クラウド上で実施
![Page 44: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/44.jpg)
connectDevAx
クラウド上で実施
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
≒結合テスト、E2Eテスト
AWS Cloud
![Page 45: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/45.jpg)
connectDevAx
クラウド上で実施メリット/デメリット
メリット• 正確なサービスの動作を確認• 権限設定の確認も可能
デメリット• 時間がかかる• デプロイなど毎回準備が必要• AWS利用料もかかる
はやく 正確に※ 簡単に動く
※
![Page 46: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/46.jpg)
connectDevAx
テストフェーズについて
UI(E2E)テスト
サービステスト
ユニット(単体)テスト
![Page 47: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/47.jpg)
connectDevAx
テストフェーズについて
UI(E2E)テスト
サービステスト
ユニット(単体)テスト
![Page 48: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/48.jpg)
connectDevAx
この二択しかないのか
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
クラウド上で実施
ローカルでの実行
一部クラウド上で実施
外部依存を分離する
![Page 49: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/49.jpg)
connectDevAx
ローカルマシン
一部クラウド上で実施
AmazonDynamoDB
Application
AWS LambdaAmazonDynamoDB Streams Amazon SNS Amazon SQS Application
A AWS Cloud
AWS Lambda
AWS Toolkit
スコープを限定して実施
![Page 50: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/50.jpg)
connectDevAx
一部クラウド上で実施メリット/デメリット
メリット• 正確なサービスの動作を確認• デプロイも全体を実施するより高速
etc.
デメリット• 自動化には適さない• ローカル実施よりは遅い
(回数が限定されるなら許容範囲)
etc.
はやく 正確に 簡単に動く
![Page 51: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/51.jpg)
connectDevAx
外部依存を分離するポート&アダプター ( ヘキサゴナルアーキテクチャ)
![Page 52: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/52.jpg)
connectDevAx
Lambda関数の実装例def lambda_handler(event, context):
""" Unit TestしやすいLambda関数のサンプル"""id = get_parameter(event, "id")is_takeout = get_parameter(event, "is_takeout")
item = get_item(id)
tax = calc_tax(item, is_takeout)
return {"statusCode": 200,"body": json.dumps({
'id': item['id'],'item_name': item['item_name'],'price': item['price'],'tax': tax
}),}
![Page 53: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/53.jpg)
connectDevAx
Lambda関数の実装例def lambda_handler(event, context):
""" Unit TestしやすいLambda関数のサンプル"""id = get_parameter(event, "id")is_takeout = get_parameter(event, "is_takeout")
item = get_item(id)
tax = calc_tax(item, is_takeout)
return {"statusCode": 200,"body": json.dumps({
'id': item['id'],'item_name': item['item_name'],'price': item['price'],'tax': tax
}),}
コアドメイン• PureなロジックとしてUnit Testを実施可能• AWS など外部の知識は不要
def calc_tax(item, is_takeout):price = Decimal(item['price'])tax_rate = Decimal(0.1)if is_takeout is not None and is_takeout.lower() == "true":
tax_rate = Decimal(0.08)return int(math.floor(price * tax_rate))
![Page 54: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/54.jpg)
connectDevAx
Lambda関数の実装例def lambda_handler(event, context):
""" Unit TestしやすいLambda関数のサンプル"""id = get_parameter(event, "id")is_takeout = get_parameter(event, "is_takeout")
item = get_item(id)
tax = calc_tax(item, is_takeout)
return {"statusCode": 200,"body": json.dumps({
'id': item['id'],'item_name': item['item_name'],'price': item['price'],'tax': tax
}),}
アダプタ• この場合handler()がアダプタ• Lambda サービスとの変換を担当
ポート• ドメインとアダプタのIF• get_item() の先にはDynamoDB とのアダプタ
![Page 55: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/55.jpg)
connectDevAx
コアドメインに対する単体テスト• 純粋な要件に対してテストケースを書く
• 他のAWSサービスとの結合方法に対する知識を含まない
• テストが軽くなるため、開発やデリバリーを高速化できる
• 外部のアーキテクチャが変更された時にも、テストケースが影響を受けにくい
• テストの陳腐化が防げる• テストのメンテナンスコストの軽減
• Pure Logicなので意図が伝わりやすい、理解しやすい• テストケースから仕様を理解出来る
![Page 56: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/56.jpg)
connectDevAx
テストダブル(Double=代役)
Test Double
Dummy Stub Spy Mock Fake
https://martinfowler.com/bliki/TestDouble.html
テストダブルは、テスト目的で本番オブジェクトを置き換える場合の置き換えデザインパターンを表す用語。
さまざまな種類のdoubleがある
![Page 57: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/57.jpg)
connectDevAx
システムの一部を差し替えてテストする手法ダミーオブジェクト パラメータとして受け渡しするが利用されることの
ないオブジェクトスタブ テスト時に呼び出され、あらかじめ容易した結果を
返すオブジェクトスパイ テスト対象からの出力を記録しておくことでテスト
コード実行後に値を取り出して検証する
モック 期待した通りに呼び出されることを確認するためのオブジェクト。期待されない呼び出しが行われた場合は例外を返す。
フェイク 動作するように実装されているがエラー処理などを手抜きしたテスト用オブジェクト
![Page 58: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/58.jpg)
connectDevAx
外部依存を分離するメリット/デメリット
メリット• 高速に開発内容へのフィードバックが得られる
• 外部との依存関係がないので、影響を受けづらく維持しやすい
• Mock などの活用で連携部分のロジックのテストも
デメリット• 連携部分は実際の接続ではないので、結合テストなどで補完が必要
はやく 正確に 簡単に動く
![Page 59: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/59.jpg)
connectDevAx
ここまでの振り返り
クラウド上で実施
ローカルでの実行
一部クラウド上で実施
外部依存を分離するMock
Fake
![Page 60: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/60.jpg)
connectDevAx
イベント駆動/分散システムのテストの課題
![Page 61: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/61.jpg)
connectDevAx
イベント駆動/分散システムのテストの課題
1. 外部の依存関係が増える
3. 早い変化の中で整合性を取らないといけない
![Page 62: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/62.jpg)
connectDevAx
非同期テストの問題を見直す
AmazonDynamoDBApplication AWS LambdaAmazon
DynamoDB Streams Amazon SNS Amazon SQS Application
最小化したE2E テストと、ユニットテストでカバー
AWS Cloud
![Page 63: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/63.jpg)
connectDevAx
設計段階からテスト/調査のしやすさを組み込む
AmazonDynamoDBApplication Amazon
DynamoDB Streams Amazon SNS Amazon SQS Application
相関ID を利用してイベントを識別できるようにAWS Cloud
Amazon CloudWatch
![Page 64: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/64.jpg)
connectDevAx
イベント駆動/分散システムのテストの課題
![Page 65: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/65.jpg)
connectDevAx
イベント駆動/分散システムのテストの課題
1. 外部の依存関係が増える2. 非同期処理の結果確認の手間
![Page 66: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/66.jpg)
connectDevAx
改めて課題の整理
AWS CodePipeline AWS CodePipeline
![Page 67: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/67.jpg)
connectDevAx
コンシューマー駆動契約
AWS CodePipeline AWS CodePipeline
Consumer-Driven Contracts (CDC)
![Page 68: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/68.jpg)
connectDevAx
PACT
![Page 69: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/69.jpg)
connectDevAx
Message Pact Specification
https://github.com/pact-foundation/pact-specification/tree/version-3
![Page 70: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/70.jpg)
connectDevAx
プロバイダからの変更はどうする?
AWS CodePipeline AWS CodePipeline
コンシューマー駆動契約
?
![Page 71: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/71.jpg)
connectDevAx
Amazon EventBridge- Schema Registry and Discovery
.
Event Schema
SchemaRegistry
SchemaDiscovery
Event Bus
Code BindingIDE / Console / API
![Page 72: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/72.jpg)
connectDevAx
Schema Registry & Schema Discovery
Schema Registry - EventBridge (CloudWatch Events) でやり取りされる様々なデータのスキーマを、コンソールからまとめて公開 (例) EC2 インスタンスの状態変化通知のスキーマ
プロパティの一覧とそれぞれの型 (String や独自の型など)
独自の型の定義も確認できる
![Page 73: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/73.jpg)
connectDevAx
Schema Registry & Schema Discovery
73
Schema Discovery - EventBridge へ送信されたイベントからスキーマ情報を自動生成 (例) MongoDB Atlas (MongoDB 社にて提供されるマネージドサービス) へデータの CRUD 処理が行われた場合のスキーマ
プロパティの一覧とそれぞれの型(String や独自の型など)
AWS のサービスと全く同じ形で、パートナーから送信されるデータやカスタムイベントのスキーマも確認できる
![Page 74: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/74.jpg)
connectDevAx
Schema Registry & Schema Discovery Code Bindings – スキーマ定義を言語ごとにダウンロード可能 2021 年 7 月時点で Java 8+、Python 3.6+、TypeScript 3+ に対応 アプリケーション開発の際に、ダウンロードしたスキーマ定義をインポートしておくことで、コード補完やコンパイル時のエラー検出に役立てることができる
![Page 75: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/75.jpg)
connectDevAx
Event Replay
Event BusEvent SourceTarget
AWS Lambda Amazon Kinesis
Amazon SQS Amazon SNS
ArchiveReplay
Archive – 指定した(全ても可能)パターンのイベントを保存する Replay – Archive したイベントを再生できる 開始/終了時間とルール(全ても可能)して再生する 順番は保存された順序を保証しない 現在は、同じEvent Bus にのみ再生可能
![Page 76: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/76.jpg)
connectDevAx
EventBridge でイベントの仕様を連携
AWS CodePipeline AWS CodePipeline
SchemaRegistry
![Page 77: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/77.jpg)
connectDevAx
実装例:PACT とEventBridge による連携
AWS CodePipeline AWS CodePipeline
Amazon S3Bucket
Amazon S3Bucket
AWS CodePipeline
SchemaRegistry
![Page 78: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/78.jpg)
connectDevAx
![Page 79: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/79.jpg)
connectDevAx
まとめ
イベント駆動を導入するための税金(今後、成熟していく領域であるはず)
難しさを軽減するために• コアドメインをPureに保ち、単体テストを充実させる• E2Eテストを過度に増やしすぎない• 協調しやすい方法を検討(CDC やSchema の共有)
![Page 80: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/80.jpg)
connectDevAx
![Page 81: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/81.jpg)
connectDevAx
次回予告
![Page 82: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/82.jpg)
connectDevAx
Client(SPA)
SNS Topic
SQS Queue
SQS Queue
SQS Queue
Amazon KinesisData Firehose
• 単体テストを充実させる
• コンシューマ駆動契約やEventBridgeでのスキーマ共有
イベントのテスト
![Page 83: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/83.jpg)
connectDevAx
次のお題:外部のSaaSを使いたい
Client(SPA) SNS Topic
SQS Queue
SQS Queue
SQS Queue
Amazon KinesisData Firehose
どうやって連携する?
![Page 84: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/84.jpg)
connectDevAx
第7回Amazon EventBridge を使ってイベントドリブンな外部サービス連携を実現する櫻谷広人アマゾンウェブサービスジャパン株式会社パートナーソリューションアーキテクト
SaaS やそのほかの外部サービスとの連携はモダンなアプリケーション開発において、コア機能に集中しアジリティ高くサービスを成長させるために必須になってきています。しかし、SaaS との連携は、考慮/調整事項が多く、結果的に工数が大きくなってしまうことも。Amazon EventBridge の SaaS 連携機能を活用し、SaaS との連携もイベント駆動でシンプルに実現する方法を解説します
![Page 85: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/85.jpg)
connectDevAx
アンケートご協力のお願いアンケートにご協力ください!!
• 登壇者へのフィードバック
• 次回以降のDevAx::connect について 開催方法や時間帯など 取り上げて欲しいテーマDevAx::connect は皆さんと共に作っていきたいと考えています!!
![Page 86: DevAx connect - pages.awscloud.com](https://reader030.fdocuments.net/reader030/viewer/2022032422/6233f02c31091b1cbe0cea2a/html5/thumbnails/86.jpg)
Thank you!
connectDevAx