Slide 1

Slide 1 text

© 2020, Amazon Web Services, Inc. or its Affiliates. Masatoshi Hayashi 2020/06/24 コンテナとコンテナのつなぎかた JAWS-UG コンテナ支部 #17

Slide 2

Slide 2 text

© 2020, Amazon Web Services, Inc. or its Affiliates. 林 政利, @literalice Specialist Solutions Architect, Containers SIer フリーランス 受託開発 Web系企業 サービス開発 外資ベンダー コンテナ担当SA, サポートエンジニア AWS コンテナ担当SA 2006 2014 2017 2009 2019

Slide 3

Slide 3 text

© 2020, Amazon Web Services, Inc. or its Affiliates. 本セッションの目的 • タスク内コンテナ接続 • Service Discovery • AWS App Mesh • Amazon EventBridge • ファンアウト • Kinesis Data Streams • etc. Amazon Elastic Container Service(Amazon ECS)における コンテナとコンテナのつなぎかたを整理 ※ 本資料では2020年06月24日現在のサービス内容についてご説明しています

Slide 4

Slide 4 text

© 2020, Amazon Web Services, Inc. or its Affiliates. 三種類のコンテナ連携方法 ECS Task タスク内接続

Slide 5

Slide 5 text

© 2020, Amazon Web Services, Inc. or its Affiliates. 三種類のコンテナ連携方法 ECS Task タスク内接続 ECS Service ECS Service サービス間接続

Slide 6

Slide 6 text

© 2020, Amazon Web Services, Inc. or its Affiliates. 三種類のコンテナ連携方法 ECS Task タスク内接続 ECS Service ECS Service ECS Service ECS Service サービス間接続 イベント駆動連携

Slide 7

Slide 7 text

© 2020, Amazon Web Services, Inc. or its Affiliates. タスク内コンテナ接続

Slide 8

Slide 8 text

© 2020, Amazon Web Services, Inc. or its Affiliates. ECS Task タスク内コンテナ接続 アプリコンテナ 補助コンテナ • サイドカー、アンバサダー、アダプター • 業務と関係ない機能を別コンテナに 切り出しアプリコンテナを純粋に保つ • ネットワーク空間やストレージを共有して 密な連携ができる

Slide 9

Slide 9 text

© 2020, Amazon Web Services, Inc. or its Affiliates. Amazon CloudWatch Logs ECS Task ログ関連機能をサイドカーにする例 アプリコンテナ ログコンテナ(fluent-bit/fluentd) その他ログ基盤 ログドライバー データ(ログ)の流れ ドメイン(業務知識)と関係の無い、ログのルーティング処理を アプリコンテナの外に出す

Slide 10

Slide 10 text

© 2020, Amazon Web Services, Inc. or its Affiliates. サービス間接続

Slide 11

Slide 11 text

© 2020, Amazon Web Services, Inc. or its Affiliates. Mobile client Client IoT サービス間接続/マイクロサービスの必要性とは? API Gateway Account DB Shipping DB Inventory DB Store Front Web App Account Lookup Shipment Query Inventory Query

Slide 12

Slide 12 text

© 2020, Amazon Web Services, Inc. or its Affiliates. ECS Task 高度なモジュール化による接続という選択肢 Module(jar/gem/etc.) 機能をモジュールに分けて、CI/CDで一つのコンテナにする

Slide 13

Slide 13 text

© 2020, Amazon Web Services, Inc. or its Affiliates. インテグレーション時に課題が発生してくるタイミング Module(jar/gem/etc.) • ライブラリを更新したら壊れた • Fargateに移行したい • むしろサーバーレスにしたい インテグレーションの範囲が大きく、調整に時間が掛かる

Slide 14

Slide 14 text

© 2020, Amazon Web Services, Inc. or its Affiliates. サービス間接続でインテグレーションの課題を解決する Team B 接続 仕様 インテグレーションの範囲を二つに絞る 小さく切り分けた機能のみ実装した サービス内部 サービス同士をつなぐところ

Slide 15

Slide 15 text

© 2020, Amazon Web Services, Inc. or its Affiliates. コンテナ接続のあまりよくないパターン • コンテナの内部実装に暗黙的に依存 • DBスキーマ共有など • スキーマを「こう使っているはず」 • インテグレーションが絞れていない • サービス間接続のモチベーションを 満たさない

Slide 16

Slide 16 text

© 2020, Amazon Web Services, Inc. or its Affiliates. 一般的なサービス間の接続 サービスディスカバリー API • ドキュメント化されたAPIで接続 サービス検索 サービス登録 • サービス内の実装に依存しない • ポータビリティ性の高い環境では サービスディスカバリーが利用される

Slide 17

Slide 17 text

© 2020, Amazon Web Services, Inc. or its Affiliates. サービス間接続のパターン

Slide 18

Slide 18 text

© 2020, Amazon Web Services, Inc. or its Affiliates. Amazon ECS Service Discovery ECSサービスA ECSサービスB Container Container Container Container AWS Cloud Map サービスIP登録 Amazon Route 53 DNSレコード サービス検索 API API接続 • ヘルスチェックが通ったらサービス登録 • サービス同士をAPIでつなぐ

Slide 19

Slide 19 text

© 2020, Amazon Web Services, Inc. or its Affiliates. Amazon ECS Service Discoveryとインテグレーション ECSサービスA ECSサービスB Container Container Container Container AWS Cloud Map サービスIP登録 Amazon Route 53 DNSレコード サービス検索 API EKSサービスC Container Container API サービスIP登録

Slide 20

Slide 20 text

© 2020, Amazon Web Services, Inc. or its Affiliates. 独立性の高いサービス同士を統一した方法でつなぎたい ECSサービスA ECSサービスB Ruby Go API EC2サービスC v2 API EKSサービスC Python Rust API • リトライ、タイムアウト設定 • 通信可視性の確保 (X-Ray設定など) • B/Gデプロイの仕組み Java Ruby Go Ruby EC2サービスC API

Slide 21

Slide 21 text

© 2020, Amazon Web Services, Inc. or its Affiliates. AWS App Meshによるサービス間通信レイヤーの導入 API接続 仮想 ノード 仮想 ノード 仮想ノード 仮想 ノード AWS App Mesh API接続 • App Meshのレイヤーで通信方法を設定 • リトライ、タイムアウト • 通信先の切り替え • X-Rayによる可視性の確保 • 証明書による暗号化通信

Slide 22

Slide 22 text

© 2020, Amazon Web Services, Inc. or its Affiliates. サービス間通信の標準化 Ruby Go Ruby Java Ruby Go AWS App Mesh ECSサービス A EKSサービス B EC2サービス C ECSサービス C API接続 仮想 ノード 仮想 ノード 仮想ノード 仮想 ノード API接続

Slide 23

Slide 23 text

© 2020, Amazon Web Services, Inc. or its Affiliates. 同期的なつなぎかたでサービスの依存関係が増える例 ユーザー基盤 サービスA ユーザー情報取得 • ユーザー作成時にサービスAの キャンペーンを実施したい APIコールの向き • ユーザー基盤との調整が発生 • 独立性が損なわれる • ユーザー基盤がサービスAのAPI をコールバック

Slide 24

Slide 24 text

© 2020, Amazon Web Services, Inc. or its Affiliates. 同期的なつなぎかたでサービスの依存関係が増える例 ユーザー基盤 サービスA サービスB サービスD サービスC APIコールの向き

Slide 25

Slide 25 text

© 2020, Amazon Web Services, Inc. or its Affiliates. イベント駆動連携でサービスの依存関係をシンプルにする例 ユーザー基盤 サービスA サービスB サービスC Event Bus ユーザー作成 イベント発行 イベント 参照

Slide 26

Slide 26 text

© 2020, Amazon Web Services, Inc. or its Affiliates. イベント駆動連携のパターン

Slide 27

Slide 27 text

© 2020, Amazon Web Services, Inc. or its Affiliates. Amazon EventBridge VPC サービスA サービスB Container Container Queue Queue Container Container VPC サービスA Container Container Amazon EventBridge & Amazon SQS • EventBridgeはマネージドのイベントバス • スキーマを定義してコードを生成でき、サービス接続しやすい • SQSと連携することでピークの負荷が読めないワークロードに対応 • 様々なSaaSと直接連携できるので、イベントの連携先に柔軟性がある イベントの流れ SaaS

Slide 28

Slide 28 text

© 2020, Amazon Web Services, Inc. or its Affiliates. VPC サービスA サービスB Container Container Queue Queue Container Container VPC サービスA Container Container Amazon SNS & Amazon SQS Amazon Simple Notification Service • SQSと連携することでピークの負荷が読めないワークロードに対応 • スループットが高く、配信先が膨大な量になっても対応しやすい イベントの流れ

Slide 29

Slide 29 text

© 2020, Amazon Web Services, Inc. or its Affiliates. VPC サービスA サービスB Container Container Container Container VPC サービスA Container Container Amazon Kinesis Data Streams • イベントのリプレイがしやすい • IoTデータなどのストリームデータを任意の時点から再生して解析したり 可視化したりする用途に利用されることが多い Amazon Kinesis Data Streams イベントの流れ

Slide 30

Slide 30 text

© 2020, Amazon Web Services, Inc. or its Affiliates. イベント駆動連携は、依存関係が課題になりやすい • どのキューが、どのサービスでどういう目的で使われているのか • タイムアウト設定の整合性 • エラーが発生したときにどういう状態になり、どう戻すのか サービスA サービスB サービスB イベントの流れ

Slide 31

Slide 31 text

© 2020, Amazon Web Services, Inc. or its Affiliates. サービスA サービスB イベント駆動のシステムでエラーを戻す例 サービスB イベントの流れ ホテルの手配 旅行の手配 車の手配 航空券の手配 エラーを戻すキュー • サービス間の処理の流れが明示的でない • サービスの追加が他のサービスに影響し、システムが変更しにくい

Slide 32

Slide 32 text

© 2020, Amazon Web Services, Inc. or its Affiliates. サービスA サービスA サービスB Container Container ホテルの手配 Container Container AWS Step Functionsで依存関係を整理する ワークフローによるSaga Patternの例 AWS Step Functions 車の手配 航空券の手配 エラー処理 旅行の手配 • サービス間の処理の流れが明示的 • 依存関係の管理をStep Functionsに委譲することで、各サービスの独立性 が高まる • あるステップを他の実装に差し替える、ということがやりやすい

Slide 33

Slide 33 text

© 2020, Amazon Web Services, Inc. or its Affiliates. まとめ • タスク内コンテナ接続 • Service Discovery • AWS App Mesh • Amazon EventBridge • ファンアウト • Kinesis Data Streams • etc. Amazon ECSでのコンテナとコンテナのつなぎかたを整理

Slide 34

Slide 34 text

© 2020, Amazon Web Services, Inc. or its Affiliates. まとめ • なるべくシンプルな方法でつなぐ • 必要に応じて、さまざまなパターンを検討する • サービスの独立性を保ち、パターンを検討できる状態に しておく

Slide 35

Slide 35 text

© 2020, Amazon Web Services, Inc. or its Affiliates. Thank you !

Slide 36

Slide 36 text

© 2020, Amazon Web Services, Inc. or its Affiliates. 参考文献 • (書籍) 分散システムデザインパターン ――コンテナを使ったスケーラブルなサービスの設計 https://www.amazon.co.jp/dp/4873118751 • https://aws.amazon.com/jp/blogs/news/new-application- integration-with-aws-cloud-map-for-service-discovery/ • https://aws.amazon.com/blogs/opensource/unified-service- discovery-ecs-kubernetes/