Slide 1

Slide 1 text

宣言的かつ安全に管理する Elasticsearch 第49回Elasticsearch勉強会 @pakio 2022/08/31

Slide 2

Slide 2 text

2022 自己紹介 - 名前: 有村 和真 - 所属: 株式会社メルカリ - US@Tokyo - @pakio - @paki0o

Slide 3

Slide 3 text

2022 今回のゴール ● Elasticsearchにおける、いい感じの構成管理方法を整理する ● 可能な限りヒューマンエラーを減らす方法を考える

Slide 4

Slide 4 text

2022 はじめにアンケートから インフラ周り、どれくらいIaC化、構成・設定のコード管理できていますか? 1. 全く手つかず/取り組み中 2. アプリケーション・データベース等はできているが、 Esに関しては検討中 3. Es含め完璧 🙆 Zoomのチャット欄にて数字でご回答ください!

Slide 5

Slide 5 text

2022 前提: PostgreSQLで考える構成管理 一般的なデータベースの代表例として、PostgreSQLの管理についてまずは考えてみる ● 構成管理 ○ バージョン、使用するインスタンス、セキュリティ関連の設定共にTerraformでサポートされている ○ RDS(AWS): Terraform - AWS Provider ○ Cloud SQL(GCP): Terraform - Google Cloud Platform Provider ● テーブル定義 ○ sqldefやFlywayなどで別途ファイルに定義/管理 → 基本的にデプロイ時のパイプライン内で完結

Slide 6

Slide 6 text

2022 Elasticsearchの構成管理を考えてみる 本題、Elasticsearchの構成管理ついて考えてみる ● 構成管理 ○ ???? ● インデックス定義等その他の管理 ○ ????

Slide 7

Slide 7 text

2022 Elasticsearchの構成管理を考えてみる 本題、Elasticsearchの構成管理ついて考えてみる ● 構成管理 ○ Opensearch(AWS): Terraform - AWS Provider ○ Elasticsearch Service(Elastic Cloud): Terraform - Elastic Cloud Provider ■ 2020/12にβ版が、2021/03にGA版リリースされている ■ ecctlが少し早い2019/12にβ版をリリースしているので、その選択肢を取っているところもあるかも? ● インデックス定義等その他の管理 ○ ????

Slide 8

Slide 8 text

2022 Terraform - Elastic Cloud Provider Elastic公式のTerraform Provider Deploymentの他、プラグインやカスタム辞書などの管理や トラフィックフィルタも宣言的に管理可能 Pros ● 宣言的にクラスタの構成管理が可能 ○ コードレビューができる ● ecctlと比較し、宣言が完結で管理も簡単 ○ ecctlではDeployment IDの別途管理が必要 ⇔ tfstate内に保存される為自前の管理が不要 Cons ● UI上でサポートされている一部のコンフィグに 未対応

Slide 9

Slide 9 text

2022 Elasticsearchの構成管理を考えてみる ● 構成管理 ○ Opensearch(AWS): Terraform - AWS Provider ○ Elasticsearch Service(Elastic Cloud): Terraform - Elastic Cloud Provider ● インデックス定義等その他の管理 ○ Elasticsearch ~7.x: phillbaker/terraform-provider-elasticsearch ○ Elasticsearch 8.x~: Terraform Provider Elastic Stack

Slide 10

Slide 10 text

2022 phillbaker/terraform-provider-elasticsearch 有志開発のTerraform Provider 初期リリースが2017年と歴史が長く、またOpenSearchにも対応 Pros ● 開発が活発かつ、ユーザが多い ○ 公式: 6k, phillbaker: 60k (ダウンロード数/週) ● Mapping/Settings/Analysis周りの設定がJSONで 定義可能なため、素のJSONファイルからも移行が容易 ● SecurityやILM, Snapshot lifecycle, Userなどにも対応 Cons ● Elasticsearch v8以降に関しては、 後述の公式Terraform Providerへの移行を推奨(Issue)

Slide 11

Slide 11 text

2022 Terraform Provider Elastic Stack Elastic社が中心に開発中の、公式Terraform Provider リリースが2021/12と比較的歴史が浅く、まだまだ発展途上 Pros ● 前述のProviderでサポートされている設定に加えて、 Ingest Pipelineの定義も可能 Cons ● JSONで定義可能な設定が少なく、定義が複雑 ○ settingsに関しては、ネストも非対応 ○ analyzer等多くの設定を必要とする検索用途で は、現段階での移行は現実的ではなさそう

Slide 12

Slide 12 text

2022 Terraform Provider Elastic Stack Elastic社が中心に開発中の、公式Terraform Provider リリースが2021/12と比較的歴史が浅く、まだまだ発展途上 Pros ● 前述のProviderでサポートされている設定に加えて、 Ingest Pipelineの定義も可能 Cons ● JSONで定義可能な設定が少なく、定義が複雑 ○ settingsに関しては、ネストも非対応 ○ analyzer等多くの設定を必要とする検索用途で は、現段階での移行は現実的ではなさそう

Slide 13

Slide 13 text

2022 Elasticsearchの構成管理を考えてみる ● 構成管理 ○ Opensearch(AWS): Terraform - AWS Provider ○ Elasticsearch Service(Elastic Cloud): Terraform - Elastic Cloud Provider ● インデックス定義等その他の管理 ○ Elasticsearch ~7.x: phillbaker/terraform-provider-elasticsearch ○ Elasticsearch 8.x~: Terraform Provider Elastic Stack

Slide 14

Slide 14 text

2022 Elasticsearchの構成管理を考えてみる ● 構成管理 ○ Opensearch(AWS): Terraform - AWS Provider ○ Elasticsearch Service(Elastic Cloud): Terraform - Elastic Cloud Provider ● インデックス定義等その他の管理 ○ Elasticsearch ~7.x: phillbaker/terraform-provider-elasticsearch ○ Elasticsearch 8.x~: Terraform Provider Elastic Stack ○ 共通する課題としてインデックス定義のバリデーションができない

Slide 15

Slide 15 text

2022 バリデーション問題 Q. 右のインデックス定義で問題なく インデックスを作成できますか?

Slide 16

Slide 16 text

2022 バリデーション問題 Q. 右のインデックス定義で問題なく インデックスを作成できますか? → 🙅 setttingsになっています(typo)

Slide 17

Slide 17 text

2022 バリデーション問題 Q. 右のインデックス定義で問題なく インデックスを作成できますか?

Slide 18

Slide 18 text

2022 バリデーション問題 Q. 右のインデックス定義で問題なく インデックスを作成できますか? → 🙅 作成時にillegal_argument_exceptionになりま す(Invalid synonym rule)

Slide 19

Slide 19 text

2022 Elasticsearchの構成管理を考えてみる ● 構成管理 ○ Opensearch(AWS): Terraform - AWS Provider ○ Elasticsearch Service(Elastic Cloud): Terraform - Elastic Cloud Provider ● インデックス定義等その他の管理 ○ Elasticsearch ~7.x: phillbaker/terraform-provider-elasticsearch ○ Elasticsearch 8.x~: Terraform Provider Elastic Stack ○ CI上でのバリデーション: Elasticsearch Github Action

Slide 20

Slide 20 text

2022 Elasticsearch Github Action Elasticsearch Github Action Elasticから提供されている、Github Actions上にElasticsearchを構築するアクション。 プラグインの導入/任意のセキュリティの設定も可能。 → 他CIツールを利用している場合でも、CIプロセス上でElasticsearchの仮環境を構築すれば代替可能 バリデーション方法 CI上に構築された仮のElasticsearchを利用し実際に作成を試みることで、インデックス定義のバリデーションを行う ● Terraformを利用してインデックス管理をしている場合: CI上で terraform apply を実行 ● JSON管理で管理している場合: curlで登録、もしくはeskeeperのような管理ツールを導入/CI上で実行

Slide 21

Slide 21 text

2022 Elasticsearch Github Action デモ: GitHub

Slide 22

Slide 22 text

2022 Elasticsearchの構成管理を考えてみる ● 構成管理 ○ Opensearch(AWS): Terraform - AWS Provider ○ Elasticsearch Service(Elastic Cloud): Terraform - Elastic Cloud Provider ● インデックス定義等その他の管理 ○ Elasticsearch ~7.x: phillbaker/terraform-provider-elasticsearch ○ Elasticsearch 8.x~: Terraform Provider Elastic Stack ○ CI上でのバリデーション: Elasticsearch Github Action

Slide 23

Slide 23 text

2022 Elasticsearchの構成管理を考えてみる ● 構成管理 ○ Opensearch(AWS): Terraform - AWS Provider ○ Elasticsearch Service(Elastic Cloud): Terraform - Elastic Cloud Provider ● インデックス定義等その他の管理 ○ Elasticsearch ~7.x: phillbaker/terraform-provider-elasticsearch ○ Elasticsearch 8.x~: Terraform Provider Elastic Stack ○ CI上でのバリデーション: Elasticsearch Github Action → かなりな範囲をElastic公式ツール、もしくはクラウドプロバイダから提供されるツールでカバー可能 = 安定運用💪

Slide 24

Slide 24 text

2022 まとめ ● Elasticsearchの運用でもIaC + 自動テストで安定運用・構成管理が可能 ● 直近1~2年で多くのツールが登場しており、一般的なアプローチもとれるように ● CI上でElasticsearchを立ち上げられる -> 品質のテストも可能に?

Slide 25

Slide 25 text

2022 Thanks!

Slide 26

Slide 26 text

2022 参考文献/リンク ● elastic/terraform-provider-elasticstack: Terraform provider for Elastic Stack ● phillbaker/terraform-provider-elasticsearch: An elasticsearch provider for terraform ● Elasticsearchのバージョンアップと検索基盤の改善 - ZOZO TECH BLOG ● po3rin/eskeeper: eskeeper synchronizes index and alias with configuration files while ensuring idempotency. ● elastic/elastic-github-actions: This action spins up an Elasticsearch instance that can be accessed and used ...