AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
- 1. ソニー株式会社 江藤 武司 / 岩井 良和
Copyright 2019 Sony Corporation
AWS Lake Formation で実現、
マイクロサービスの
サーバーレスな分散トレーシング
- 3. Copyright 2019 Sony Corporation2019.10.223
Agenda
• 分散トレーシングを必要とした背景
• トレーシング基盤の構成
• トレーシングIDの取得と伝播
• まとめ
- 5. Copyright 2019 Sony Corporation2019.10.225
Takeshi Etoh - About us
EA* の テクノロジー領域にたずさわり10年
社内 IT 全体最適化 や 新技術の検証・導入と
様々な技術の評価と実証実験に取り組む。
その後、サービス構築の最前線にて IoT プラットフォームや
ウェブサービス、モバイルアプリ など の アーキテクチャ・
デザインから実装までをこなし、現在はサーバーレスだけで
構成する BaaS の開発・展開をしている。
サーバーレスはアイデアを高速に
実現できるアーキテクチャとして大のお気に入り。
* EA: Enterprise Architecture, 業務とシステムの現状 AsIs、あるべき姿 ToBe、その方向性 CanBe を策定し事業体を全体最適化する方法論
- 6. Copyright 2019 Sony Corporation2019.10.226
Yoshikazu Iwai - About us
入社以来、
サーバーレスアーキテクチャを
採用したサービス開発を
行ってきたバックエンドエンジニア。
現在は、BaaS の開発・展開をしている。
- 8. Copyright 2019 Sony Corporation2019.10.228
全体イメージ
• aibo や Multifunctional Light など の バックエンド (BaaS)
• サーバーレスの構成 (Lambda, DynamoDB, S3, SNS, etc...)
• 10 近い AWS アカウントに配置されている
aibo - http://aibo.com/
Multifunctional Light - https://sony.co.jp/Products/multifunctional-light/
Multifunctional Light
aibo
製造
販売
物流
サポート
認証システム
aibo
Service
Provider
Prod, QA, Dev…
- 9. Copyright 2019 Sony Corporation2019.10.229
システム構成概要と特徴
• API Gateway/Lambda に加え、非同期イベント処理も多い
• 呼出チェーンは長く多岐、クロス・アカウントやオンプレも
• 1ヶ月を超えてからの問合せで確認や障害のトレースあり
- 10. Copyright 2019 Sony Corporation2019.10.2210
分散トレーシングとは (1/5)
マイクロサービスなどの分散アーキテクチャで
処理の可視化や追跡性を向上させるための仕組み
Web Process
External Service
Web API Proc. Web API Proc.
Async Function
Web API Proc.
- 11. Copyright 2019 Sony Corporation2019.10.2211
分散トレーシングとは (2/5)
マイクロサービスなどの分散アーキテクチャで
処理の可視化や追跡性を向上させるための仕組み
• 基本的な概念
• Span: 処理ユニット、例えば1つの AWS Lambda Function などにあたる
• Trace: 関連する Span を まとめる単位、Lambda ⇒ SNS ⇒ Lambda など
• Propagation: “Trace” 実現用のメタデータを、各 “Span” で伝搬させること
Web Process
External Service
Web API Proc. Web API Proc.
Async Function
Web API Proc.Span
- 12. Copyright 2019 Sony Corporation2019.10.2212
分散トレーシングとは (3/5)
マイクロサービスなどの分散アーキテクチャで
処理の可視化や追跡性を向上させるための仕組み
• 基本的な概念
• Span: 処理ユニット、例えば1つの AWS Lambda Function などにあたる
• Trace: 関連する Span を まとめる単位、Lambda ⇒ SNS ⇒ Lambda など
• Propagation: “Trace” 実現用のメタデータを、各 “Span” で伝搬させること
Web Process
Trace
External Service
Web API Proc. Web API Proc.
Async Function
Web API Proc.Span
- 13. Copyright 2019 Sony Corporation2019.10.2213
分散トレーシングとは (4/5)
マイクロサービスなどの分散アーキテクチャで
処理の可視化や追跡性を向上させるための仕組み
• 基本的な概念
• Span: 処理ユニット、例えば1つの AWS Lambda Function などにあたる
• Trace: 関連する Span を まとめる単位、Lambda ⇒ SNS ⇒ Lambda など
• Propagation: “Trace” 実現用のメタデータを、各 “Span” で伝搬させること
Web Process
Trace
External Service
Web API Proc. Web API Proc.
Async Function
Web API Proc.Span
Propagation
- 14. Copyright 2019 Sony Corporation2019.10.2214
分散トレーシングとは (5/5)
マイクロサービスなどの分散アーキテクチャで
処理の可視化や追跡性を向上させるための仕組み
• 基本的な概念
• Span: 処理ユニット、例えば1つの AWS Lambda Function などにあたる
• Trace: 関連する Span を まとめる単位、Lambda ⇒ SNS ⇒ Lambda など
• Propagation: “Trace” 実現用のメタデータを、各 “Span” で伝搬させること
OpenTeremetry Dapper AWS X-Ray
OpenTracing Zipkin Datadog
OpenCensus Jaeger
dazn-lambda-powertools
主な仕様や製品・サービス
Web Process
Trace
External Service
Web API Proc. Web API Proc.
Async Function
Web API Proc.Span
Propagation
- 15. Copyright 2019 Sony Corporation2019.10.2215
• 多種多様なソースを一元的に集めて分析を行うことが得意
• 複数のAWSアカウントにまたがるログを集約分析できる
• サーバーレスで実現できる!
なぜ Lake Formation を 分散トレーシングに? (1/4)
AWS Lake Formation
Web Process
External ServiceWeb API Proc. Web API Proc.
Async Function
Web API Proc.
- 16. Copyright 2019 Sony Corporation2019.10.2216
• 多種多様なソースを一元的に集めて分析を行うことが得意
• 複数のAWSアカウントにまたがるログを集約分析できる
• サーバーレスで実現できる!
なぜ Lake Formation を 分散トレーシングに? (2/4)
AWS Lake Formation
Web Process
External ServiceWeb API Proc. Web API Proc.
Async Function
Web API Proc.
柔軟な
権限設定が可能
- 17. Copyright 2019 Sony Corporation2019.10.2217
• 多種多様なソースを一元的に集めて分析を行うことが得意
• 複数のAWSアカウントにまたがるログを集約分析できる
• サーバーレスで実現できる!
なぜ Lake Formation を 分散トレーシングに? (3/4)
AWS Lake Formation
Web Process
External ServiceWeb API Proc. Web API Proc.
Async Function
Web API Proc.
1ヶ月を超える
ログも追跡可能
柔軟な
権限設定が可能
- 18. Copyright 2019 Sony Corporation2019.10.2218
• 多種多様なソースを一元的に集めて分析を行うことが得意
• 複数のAWSアカウントにまたがるログを集約分析できる
• サーバーレスで実現できる!
なぜ Lake Formation を 分散トレーシングに? (4/4)
AWS Lake Formation
Web Process
External ServiceWeb API Proc. Web API Proc.
Async Function
Web API Proc.
1ヶ月を超える
ログも追跡可能
AWS X-Ray や Datadog との使い分け
利用方法
- X-Ray は Trace 確認後の詳細分析
- Datadog は 主に監視と短期の可視化
制約
- X-Ray は AWS アカウント内に閉じる
- Datadog は 最長1ヶ月まで
柔軟な
権限設定が可能
- 20. Copyright 2019 Sony Corporation2019.10.2220
トレーシング基盤の構成(1/2)
• Step Functionsを利用したログの出力
• エクスポート対象のロググループを事前に定義
• CloudWatch ログデータのエクスポート機能を順次実行
• ログの即時性はそこまで重視していない
• 即時性を考慮する場合は、Subscription filterの利用を検討
• Serverless Application Repositoryに公開すると便利
• Lake Formationを利用して各アカウントからログを集約
• Lake Formationを配置したアカウントにログ集約バケットを配置
- 23. Copyright 2019 Sony Corporation2019.10.2223
トレースIDの重要性
• ログの横断的分析をするためには
• 出力するログのスキーマ定義
• トレーシングIDの注入
• AWS X-Rayだけでは非同期イベントのトレースが困難
• 非同期イベントを処理する際に、
どのようにトレースIDを伝播させているかを紹介
• API Gateway
• SNS
• SQS
• Step Functions
• S3
- 24. Copyright 2019 Sony Corporation2019.10.2224
Amazon API Gateway
• カスタム HTTP headerを利用
• HTTP headersの x-correlation-id の存在を確認
• なければ、awsRequestId, uuidを利用してIDを生成
• トレースIDの保持にはzone.jsを利用
• Zone.js:
https://github.com/angular/angular/tree/master/packages/zone.js
• Zoneに登録したプロパティを参照できるライブラリ
• 非同期処理からもzoneに登録したプロパティの参照が可能import 'zone.js';
import { APIGatewayEvent, Context } from 'aws-lambda';
export const handler = async (event: APIGatewayEvent, context: Context) => {
const correlationId = event.headers['x-correlation-id'] || context.awsRequestId;
Zone.current.fork({
name: context.awsRequestId,
properties: { context: new EventContext(context, correlationId) }
}).run(async () => ...);
};
- 25. Copyright 2019 Sony Corporation2019.10.2226
Amazon SNS
• SNS message attributesを利用
• メッセージに関する構造化メタデータを指定可能
• タイムスタンプ, データ署名, 識別子
• MessageAttributesからトレースIDを取得、保持する
import 'zone.js';
import { Context, SNSEvent } from 'aws-lambda';
export const handler = async (event: SNSEvent, context: Context) => {
const correlationId = event.Records[0].Sns.MessageAttributes.correlationId.Value
|| context.awsRequestId;
Zone.current.fork({
name: context.awsRequestId,
properties: { context: new EventContext(context, correlationId) }
})
.run(async () => …);
};
- 26. Copyright 2019 Sony Corporation2019.10.2228
Amazon SQS
• SQS message attributesを利用
• メッセージに関する構造化メタデータを指定可能
• タイムスタンプ, 地理空間データ署名, 識別子
• MessageAttributesからトレースIDを取得、保持する
import 'zone.js';
import { Context, SQSEvent } from 'aws-lambda';
export const handler = async (event: SQSEvent, context: Context) => {
const correlationId = event.Records[0].messageAttributes.correlationId.stringValue
|| context.awsRequestId;
Zone.current.fork({
name: context.awsRequestId,
properties: { context: new EventContext(context, correlationId) }
})
.run(async () => ...);
};
- 27. Copyright 2019 Sony Corporation2019.10.2230
Step Functions
• StateMachine実行時にトレースIDを注入
• Input parameterに追加する
• Parameters, ResultPathを活用して、各Taskに
トレースIDを伝播
import 'zone.js';
import { StepFunctions } from 'aws-sdk';
const sfn = new StepFunctions();
const startExecution = async (input: any, stateMachineArn: string) => {
const context = Zone.current.get('context');
input.correlationId = context.correlationId;
await sfn.startExecution({
stateMachineArn,
input: JSON.stringify(input)
}).promise();
};
- 28. Copyright 2019 Sony Corporation2019.10.2231
Amazon S3 (1/2)
• S3オブジェクトメタデータを利用する
• オブジェクトアップロード時に設定可能なkey-valueセット
• S3 APIの head-objectを利用してメタデータを取得
• S3イベントオブジェクトからは取得できない
const s3 = new S3();
export const handler = async (event: S3Event, context: Context): Promise<void> => {
const metadata = await s3.headObject({
Bucket: event.Records[0].s3.bucket.name,
Key: event.Records[0].s3.object.key
})
.promise()
.then((res: S3.HeadObjectOutput) => res.Metadata);
const correlationId = metadata.correlationId || context.awsRequestId;
Zone.current.fork({
name: event.Records[0].eventName,
properties: { new EventContext(context, correlationId) }
})
.run(async () => ...);
};
- 29. Copyright 2019 Sony Corporation2019.10.2232
Amazon S3 (2/2)
• オブジェクト削除イベントの場合は一工夫必要
• 同じLambdaで処理を継続させる
• SNSを利用してObject削除通知を送信する際にIDを伝播させる
- 31. Copyright 2019 Sony Corporation2019.10.2234
まとめ
• サーバーレスは必然的にマイクロサービス・アーキテクチャ
可視化・トレーサビは複雑になりがち、ログ・トレースは五里霧中の彷徨いに
• 分散トレーシングによりシステムの視界を確保する
OpenTeremetry, Dapper, Zipkin, Datadog, dazn-lambda-powertools...
• データレイク活用でサーバーレスなトレーサビの実現も
霧の中に浮かび上がる澄んだ湖のようにシステムを見渡すかのように
- 32. Copyright 2019 Sony Corporation2019.10.2235
まとめ
• サーバーレスは必然的にマイクロサービス・アーキテクチャ
可視化・トレーサビは複雑になりがち、ログ・トレースは五里霧中の彷徨いに
• 分散トレーシングによりシステムの視界を確保する
OpenTeremetry, Dapper, Zipkin, Datadog, dazn-lambda-powertools...
• データレイク活用でサーバーレスなトレーサビの実現も
霧の中に浮かび上がる澄んだ湖のようにシステムを見渡すかのように
サーバーレスはルーブ・ゴールドバーグ・マシンに例えられるように
さまざまな部品を組み合わせて必要なものを実現するのも魅力
- 33. SONY is a registered trademark of Sony Corporation.
Names of Sony products and services are the registered trademarks and/or trademarks of Sony Corporation or its Group companies.
Other company names and product names are registered trademarks and/or trademarks of the respective companies.