Amazon MQのオンラインセミナー受けてみた

「[AWS Black Belt Online Seminar Amazon MQ](https://www.slideshare.net/AmazonWebServicesJapan/20190703-aws-black-belt-online-seminar-amazon-mq)」の自分向けメモ
Amazon MQって何？......レベルの人向け


## 一般的なメッセージングの使われ方
 - 小売業のオーダー処理
    - フロントとエンドの非同期化
    - Webサイトの遅延を防止
    - 受注情報の欠損を防止
 - 銀行の金融トランザクション
    - 取引決済
    - トレーサビリティ
    - サードパーティへの情報転送
 - メディア企業のコンテンツ公開
    - 文書の取り込み
    - 翻訳
    - 文書を各方面に発信

### 今日のメッセージング
 - 異なるシステム同士でデータのやり取りを行うことが多い

### メッセージブローカーを内包している
 - コンポーネント間を疎結合にし、情報の伝達を容易にする
 - 投入データのバッファリング
 - 各コンポーネントが個別に効率的に処理を実施可能

## 概要
 - マネージドメッセージブローカーサービス
 - Apache ActiveMQをサポート
 - 豊富なメッセージング機能
 - 低遅延かつ高耐久性
    - 複数AZにブローカーとメッセージストア
 - 業界標準のAPIをサポート

### すくない変更でアプリ移行が可能
 - Websocket
 - STOMP
 - JMS
 - etc...

### セキュリティ
 - TLSで暗号化
 - 保管データの暗号化
 - VPC内でのブローカーへの通信
 - セキュリティグループによる制御

### モニタリング
 - CloudWatch Metricsによって、ブローカーの稼働状況を取得
 - アラームを設定し、オートスケールも可能

## 構成要素（Apache ActiveMQ 5と同等）
 - OSS
 - JMS、REST、WebSocketのIFを提供
 - JMS1.1、J2EE1.4をサポート
 - Javaをはじめ、様々な言語から接続可能

### キュー（Point-to-Pointで信頼性のあるメッセージング）
 - プロデューサーが送信したメッセージはキューに一時保管
 - メッセージの処理準備が整ったコンシューマーがキューからメッセージを取得
 - 各メッセージは単一のコンシューマーから取得される
 - メッセージの順序性（FIFO）とonly-and-only-once（１回だけ配信）をサポート

### トピック（同一メッセージを複数送信先へ送達）
 - Pub-Subモデルで同一メッセージを一斉送信が可能
 - 永続サブスクリプションによって、切断中のメッセージの受信も可能

### 複合送信先（複数の物理送信先に一括でメッセージをフォワード）
 - １つの仮想送信先に対して複数の物理送信先をマッピング可能
    - 同一の内容をトピックと他のキューに一括で送る

### 仮想トピック（トピックとキューのハイブリッド）
 - 仮想トピックに送付されたメッセージはキューに転送される
 - トピックとは切り離して、コンシューマー側を任意に増減可能

### フェイルオーバートランスポート
 - クライアントでの接続先指定時に複数のエンドポイントを列挙可能
 - デフォルトではランダムに接続先が選択される
 - 接続失敗時に他のエンドポイントを選択

### スケジュールメッセージ（スケジュールに基づいた配信）
 - クライアントから送出されるメッセージの配信タイミングを制御
 - 初期遅延、送信間隔、送信回数を指定可能

### 認可マップ（リソースに対する操作権限制御）
 - キュー、トピックに対する、操作権限の付与

### ブローカーのネットワーク
 - 複数のブローカーで構成される
 - ネットワークコネクターで相互に接続
 - 総スループットと最大クライアント接続数の拡張が可能
 - メッシュトポロジ
    - オンデマンドにすべてのブローカー間でメッセージを転送

#### トポロジの指定可能
 - メッシュトポロジ
    - オンデマンドにすべてのブローカー間でメッセージを転送
    - 地理的に分散した拠点間の通信
 - ハブアンドスポークトポロジ
    - 設定や通信パスの集約による高いメンテナンス性
    - ハブとなるブローカーのみでネットワーク全体の制御が可能
    - ハブとなるブローカーに高いサービスレベルが求められる
 - コンセントレータトポロジ
    - 大量のクライアント接続を受け入れることが可能
    - サービスを提供するブローカーとクライアント接続用ブローカーで構成
    - クライアント接続用ブローカーを増やすことで、大量接続に対応可能

## 構成要素（Amazon MQ独自）
 - ブローカーエンジン
    - Apache ActiveMQ 5系
 - インスタンスタイプ
    - 無料利用枠対象
 - 単一ブローカー
    - 無償利用枠
    - SLAは定義されない
 - マルチブローカー
    - 高可用性
    - エンドポイントはアクティブインスタンス側のみ
    - 障害時はスタンバイブローカーにテイクオーバー
    - SLA対象
 - パブリック接続の場合、ENIにIP
 - セキュリティグループ、ユーザー、認可マップによるアクセス制御

### ウェブコンソール（ActiveMQの設定を行うコンソール）
 - AWSマネジメントコンソールから起動可能
 - パブリックアクセスを許可していない場合は、踏み台、別経路確保が必要

### 設定（ブローカーの挙動を定義）
 - XMLファイルで設定
 - ActiveMQのactivemq.xmlと類似
 - 更新時にリビジョン作成、ロールバック可能

### ユーザー（キューやトピックへのアクセス元を定義）
 - AWSマネジメントコンソールからユーザーとグループを定義する
 - ユーザー名とパスワードによる認証

### ライフサイクル
 - 設定やユーザーへの変更はの反映ではブローカーのリブートが必要
 - メンテナンスウィンドウでブローカーのメンテナンスに対するポリシーを設定

### モニタリング
 - CloudWatch
 - CloudTrail
 - ActiveMQ Advisory Topics
 - ActiveMQ 統計プラグイン


## ユースケース
### 以下課題の解決に有効
 - オーバーヘッドと高額なライセンスの削減
 - 高可用性が難しい
 - 運用スタッフのクラウド適合が必要

#### Amazon MQを使うと
 - ライセンス不要
 - 高可用性
 - マネージドサービス

### 高速な移行とリファクタリング
 - オンプレとのブリッジ
 - システムの一部をクラウド化できる
 - 細かくクラウド化を進めることで最適化が容易


## ベストプラクティス
### セキュリティ
 - プライベートなブローカー
 - クライアント側の暗号化を行う
    - 通信経路、ストレージは暗号化している
 - 認可マップの設定
    - グループ単位でアクセス制御
 - システムグループを設定
 - セキュリティグループ設定

### 接続性
 - ENIの変更、削除しないこと
 - 接続プールの利用
 - フェイルオーバートランスポートを使用する
 - メッセージセレクタを使用しない
 - 永続サブスクリプションよりも仮想送信先を選択する
    - 永続サブスクリプションは接続できるコンシューマーが1つに限定される

### パフォーマンス
 - 正しいブローカーインスタンスタイプの選択
    - メッセージブローカーは性能に比例しない
 - ブローカーのネットワークを正しく設定する
    - 永続メッセージを利用する
 - Prepared状態のXAトランザクションを復旧して低速な再起動を回避する

## その他
 - 東京リージョンで利用可能
 - LSA：アクティブ/スタンバイメッセージブローカーに対し提供　99.9%

### 料金
 - ブローカーインスタンスの料金
    - サイズと利用料金
 - ブローカーストレージ料金
    - 毎月の平均使用GB数
 - データ転送料金
    - 同一リージョン間
    - クラスリージョン間はEC2の料金体系に従って、リージョン外の課金が発生

### 使い分け
#### SQSとSNS
 - クラウドネイティブなアプリケーション
 - シンプル

#### MQ
 - **アプリケーション移行**
 - APIの互換性

### まとめ
 - 最小のコード変更でコスト削減
 - クラウド移行とアプリのモダナイゼーションを加速
 - フル機能かつセキュア、高耐久性、高可用性