コンテナとコンテナのつなぎかた JAWS-UG コンテナ支部 #17 / JAWS-UG Container 17-1

コンテナとコンテナのつなぎかた JAWS-UG コンテナ支部 #17 / JAWS-UG Container 17-1

コンテナをECSにデプロイしたら、その機能を他のコンテナから呼び出したくなりますよね。ELBにコンテナを関連付けて呼び出すのもありですが、他にも様々な方法があるようです。 このセッションでは、Service DiscoveryやAmazon EventBridge、AWS Step Functionsなどに触れながら、コンテナ間をどう繋ぐか考えてみます。

De975665a5095e702c09158fb071e693?s=128

Masatoshi Hayashi

June 24, 2020
Tweet

Transcript

  1. © 2020, Amazon Web Services, Inc. or its Affiliates. Masatoshi

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

    政利, @literalice Specialist Solutions Architect, Containers SIer フリーランス 受託開発 Web系企業 サービス開発 外資ベンダー コンテナ担当SA, サポートエンジニア AWS コンテナ担当SA 2006 2014 2017 2009 2019
  3. © 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日現在のサービス内容についてご説明しています
  4. © 2020, Amazon Web Services, Inc. or its Affiliates. 三種類のコンテナ連携方法

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

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

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

  8. © 2020, Amazon Web Services, Inc. or its Affiliates. ECS

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

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

  11. © 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
  12. © 2020, Amazon Web Services, Inc. or its Affiliates. ECS

    Task 高度なモジュール化による接続という選択肢 Module(jar/gem/etc.) 機能をモジュールに分けて、CI/CDで一つのコンテナにする
  13. © 2020, Amazon Web Services, Inc. or its Affiliates. インテグレーション時に課題が発生してくるタイミング

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

    Team B 接続 仕様 インテグレーションの範囲を二つに絞る 小さく切り分けた機能のみ実装した サービス内部 サービス同士をつなぐところ
  15. © 2020, Amazon Web Services, Inc. or its Affiliates. コンテナ接続のあまりよくないパターン

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

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

  18. © 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でつなぐ
  19. © 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登録
  20. © 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
  21. © 2020, Amazon Web Services, Inc. or its Affiliates. AWS

    App Meshによるサービス間通信レイヤーの導入 API接続 仮想 ノード 仮想 ノード 仮想ノード 仮想 ノード AWS App Mesh API接続 • App Meshのレイヤーで通信方法を設定 • リトライ、タイムアウト • 通信先の切り替え • X-Rayによる可視性の確保 • 証明書による暗号化通信
  22. © 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接続
  23. © 2020, Amazon Web Services, Inc. or its Affiliates. 同期的なつなぎかたでサービスの依存関係が増える例

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

    ユーザー基盤 サービスA サービスB サービスD サービスC APIコールの向き
  25. © 2020, Amazon Web Services, Inc. or its Affiliates. イベント駆動連携でサービスの依存関係をシンプルにする例

    ユーザー基盤 サービスA サービスB サービスC Event Bus ユーザー作成 イベント発行 イベント 参照
  26. © 2020, Amazon Web Services, Inc. or its Affiliates. イベント駆動連携のパターン

  27. © 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
  28. © 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と連携することでピークの負荷が読めないワークロードに対応 • スループットが高く、配信先が膨大な量になっても対応しやすい イベントの流れ
  29. © 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 イベントの流れ
  30. © 2020, Amazon Web Services, Inc. or its Affiliates. イベント駆動連携は、依存関係が課題になりやすい

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

    サービスB イベント駆動のシステムでエラーを戻す例 サービスB イベントの流れ ホテルの手配 旅行の手配 車の手配 航空券の手配 エラーを戻すキュー • サービス間の処理の流れが明示的でない • サービスの追加が他のサービスに影響し、システムが変更しにくい
  32. © 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に委譲することで、各サービスの独立性 が高まる • あるステップを他の実装に差し替える、ということがやりやすい
  33. © 2020, Amazon Web Services, Inc. or its Affiliates. まとめ

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

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

    you !
  36. © 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/