AWS認定Big Data勉強記 - 9: Elasticsearch Service

こんにちは、えいりんぐーです

今回は Amazon Elasticsearch Service についてまとめます。

**Q: Amazon Elasticsearch Service (ES) とは何ですか?**
AWS クラウドで Elasticsearch クラスターを簡単にデプロイ、運用、スケールできるようにするマネージドサービスです。

**Q: Elasticsearch とは何ですか?**
Elasticsearch は、オープンソースの RESTful 分散検索/分析エンジンで、Apache Lucene を基盤として構築されています。さまざまな言語、高パフォーマンス、スキーマフリー JSON ドキュメントをサポートしている Elasticsearch は、さまざまなログ分析および検索のユースケースに最適です。

**Q: Apache Lucene とは何ですか?**
Javaで記述された全文検索ソフトウェアで、あらかじめ蓄積した大量のデータから、指定したキーワードを探し出す機能を持ちます。

**Q: 全文検索とは何ですか?**
コンピュータにおいて、複数の文書から特定の文字列を検索することで、ファイル名検索や単一ファイル内の文字列検索とは異なり、複数の文書に渡って、文書に含まれる全文を対象とした検索という意味で使われます。

#### 参考資料

 - Black Belt
    - [Elasticsearch Service](https://d1.awsstatic.com/webinars/jp/pdf/services/20160323_AWS-BlackBelt-CloudSearch_AmazonES.pdf)
 - 公式ドキュメント
    - [開発者ガイド](https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/what-is-amazon-elasticsearch-service.html)
        - [ベストプラクティス](https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/aes-bp.html)
    - [よくある質問](https://aws.amazon.com/jp/elasticsearch-service/resources/faqs/?nc=sn&loc=5&dn=3)
 - YouTube
    - [Amazon Elasticsearch Service Deep Dive](https://www.youtube.com/watch?v=SOTFnRezIH0)
 - その他
    - [ELKスタックとは](https://aws.amazon.com/jp/elasticsearch-service/the-elk-stack/?nc=sn&loc=6&dn=1)

#### 概要
Amazon Elasticsearch Service では、必要なネットワーク環境でのインフラストラクチャ容量のプロビジョニングから、Elasticsearch ソフトウェアのインストールまで、ドメインのセットアップに関係する作業が管理されます。ドメインが実行されると、ES によってバックアップの実行、インスタンスのモニタリング、ソフトウェアへのパッチ適用など、一般的な管理タスクが自動化されます。ES は Amazon CloudWatch と統合されており、ドメインの状態に関する情報を提供するためのメトリクスが生成されます。

###### 転置インデックス
キーワードがどの文書に存在するかを索引付けます。「ページXにビールとサキイカが含まれる」ではなく、「ビールはページXとページYにある」と記録します。

###### Amazon Elasticsearch Service ドメイン
ES コンソール、CLI、または API を使用して作成する Elasticsearch クラスターです。各ドメインは、指定したコンピューティングリソースおよびストレージリソースを備えたクラウド内の Elasticsearch クラスターとなります。お客様はドメインの作成や削除、インフラストラクチャ属性の定義、アクセスやセキュリティの制御が可能です。Amazon Elasticsearch Service ドメインは 1 つまたは複数実行できます。

###### ELKスタック
Elasticsearch, Logstash, Kibana アーキテクチャをサポートします。ELK スタックは、システムおよびアプリケーションすべてのログを集計して分析し、アプリケーションおよびインフラストラクチャのモニタリングの可視化、トラブルシューティングの高速化、セキュリティ分析などを実現します。

**Logstash**
オープンソースのデータインジェスチョンツールで、さまざまなソースからデータを収集して変換し、希望する送信先に送信できます。事前構築済みのフィルターおよび 200 を超えるプラグインをサポートしている Logstash を使用すれば、データソースまたはタイプを問わずデータを簡単にインジェストできます。
AWS のプラグインが提供されており、入力として S3 や DynamoDB Streams をサポートしています。

**Kibana**
オープンソースのデータ可視化/探索ツールで、ログおよびイベントの確認に使用できます。Kibana では、使いやすいインタラクティブなグラフ、事前構築済みの集計機能およびフィルター、地理情報のサポートが用意されており、Elasticsearch に保存されたデータの可視化に推奨します。

#### 使用方法
###### データの取り込み
大まかに方法は3つあります。

 - 大量のデータの場合は、Amazon Kinesis Firehoseが推奨
 - Logstash から受け取る
 - Index や Bulk API などのネイティブ Elasticsearch APIを使う

###### ノードのストレージ
インスタンスストアやEBSが使用可能で、EBSは磁気・汎用・プロビジョンドIOPSが選択できます。また、ドメインに関連付けられたインスタンスにつき EBS ボリューム 1つ (最大 1.5 TB) がサポートされます。デフォルトでは 1 つの ES ドメインあたり最大で 20 個のデータノードを使用できます。

###### 用語

 - Document
    - ユニークな ID を持つ (RDBMS でいう行)
    - Field を持つ (RDBMS でいう列)
 - Type
    - 同じ Field の Document の集合体 (RDBMS でいう Table)
 - Index
    - Document の集合体 (RDBMS でいう Database)
 - Shard
    - Document が保存されるところ
    - Index 内で複数存在する
 - Node
    - コンピューティングインスタンス
    - 複数の Shard を保持
    - 3台構成が推奨される
    - データの保持と検索を行うデータノードとそれらを管理するマスターノードと切り分けることが可能
 - Cluster
    - 1つ以上のノードからなる
    - Index が配置されるところ
 - Zone awareness
    - ES は1つ以上のAZにデプロイすることができ、マルチAZ構成にすること

###### 日本語解析
ICU (正規化) とKuromoji (形態素解析) プラグインが ES にインストールされています。

#### セキュリティ

 - IAM
    - IPアドレスベースでアクセスを制限可能
    - リクエスト署名を使用して Logstash の実装で発生する呼び出しを認証したり、リソースベースの IAM ポリシーを使用して Logstash を実行するインスタンスの IP アドレスを指定したり可能
        - 署名バージョン 4 は、HTTP で送信される AWS リクエストに認証情報を追加するプロセスです。
 - VPC
    - VPC の IP アドレスは Amazon Elasticsearch Service ドメインに接続され、すべてのネットワークトラフィックが AWS ネットワーク内に留まり、インターネットにアクセスできなくなります。
    - VPC アクセスが有効な場合、Amazon Elasticsearch Service のエンドポイントはお客様の VPC 内のみアクセス可能です。お使いのノートパソコンを使用して VPC 外部から Kibana にアクセスするには、VPN または VPC の Direct Connect を使用して VPC に接続する必要があります。
    - ドメインがデプロイされる AZ の数は、VPC ドメイン用に設定したサブネットの数に対応します。3 つの AZ 配置を有効にするには、VPC ドメインに少なくとも 3 つのサブネットを設定する必要があります。
 - Amazon Cognito
    - SAML 2.0 を使用する Microsoft Active Directory などのエンタープライズ ID プロバイダーや、Google、Facebook、Amazon などのソーシャル ID プロバイダーを通じたエンドユーザーの Kibana へのログインを許可することもできます。
 - 暗号化
    - KMS で管理するキーを使用してデータを暗号化するオプションが用意されています。このオプションが有効になっている場合、基盤となるストレージシステムに保存されている、プライマリインデックス、レプリカインデックス、ログファイル、メモリスワップファイル、自動 S3 スナップショットなどのデータすべてが暗号化されます。
    - KMS マスターキーを新しく作成することも、独自のものから選択することもできます。
    - 保管時の暗号化は、EBS とインスタンスストレージの両方をサポートしています。
    - クライアントとドメインエンドポイント間の通信を HTTPS で暗号化することができます。ノードツーノード暗号化を有効にすることで、Elasticsearch ドメイン内のインスタンス間における通信すべてに対して TLS を実装し、追加のセキュリティレイヤーを取得することができます。

#### バックアップ

 - AWSが自動で1日1回、スナップショットを作成する
    - 毎日自動で作成されるスナップショットは過去 14 日分保存されます
 - _snapshot APIで任意のタイミングでスナップショットを作成できる
 - Elasticsearch の Restore API を使用して、スナップショットのデータを新しく作成した Amazon Elasticsearch Service ドメインにロードできる
 - クロスリージョンレプリケーション
    - Elasticsearch インデックスのレプリカを有効にし、複数のアベイラビリティーゾーンを使用する場合、Amazon Elasticsearch Service は自動的にプライマリシャードとレプリカシャードを異なる AZ のインスタンスに分散させます。

#### スローログ
スローログは、操作のさまざまな段階のパフォーマンスを追跡できるログファイルです。特定のインデックスの設定を更新して、そのインデックスのスローログを有効または無効にできます。スローログは、インデックスのトラブルシューティングを行うか、パフォーマンスを微調整する場合にのみ必要です。推奨する方法は、パフォーマンスに関する追加の洞察が必要なインデックスに対してのみ、ログ記録を有効にすることです。Elasticsearch では次の 2 種類のスローログを公開しています。

 - インデックススローログ
    - このログでは、インデックス作成処理に関する洞察が得られ、このログを使用してインデックスの設定を微調整します。
 - 検索スローログ
    - このログでは、クエリの取得と実行速度に関する洞察が得られます。このログは、Elasticsearch で任意の種類の検索操作のパフォーマンスを微調整するのに役立ちます。

また、Elasticsearch は Apache Log4j 2 とその組み込みログレベル (最も軽度から最も重度)、TRACE、DEBUG、INFO、WARN、ERROR、FATAL を使用します。エラーログを有効にした場合、Amazon Elasticsearch Service は WARN、ERROR、FATAL のログの行と、DEBUG レベルの一部のエラーを CloudWatch に発行します。

#### CloudSearch (参考)

 - 自動拡張するフルマネージド検索サービス
    - Apache Solr ベース (Solr 自体は Lucene ベース)
 - 垂直なスケールと水平なスケール。
    - ノードのパーティションは EMR で行われる
 - 全てのノードに ELB 経由で均等にアップロード
    - ノードはデータを受け取ると S3 に保存して、メタ情報を DynamoDB に保存
 - DocValues
    - JavaVM からファイルシステムのキャッシュにオフロードする