Weitere ähnliche Inhalte Ähnlich wie Elastic circle ci-co-webinar-20210127 (20) Mehr von Shotaro Suzuki (20) Elastic circle ci-co-webinar-202101273. 自己紹介
名前:車井 登 / Noboru Kurumai
ポジション:Solutions Engineer
経歴:パッケージソフト開発
クラウドサービスエンジニア
3
4. Elastic x CircleCI で始める DevOps ⼊⾨
Elastic の技術・ソリューション
ご紹介と Demo
鈴⽊ 章太郎
Elastic テクニカルプロダクトマーケティングマネージャー/エバンジェリスト
内閣官房 IT 総合戦略室 政府 CIO 補佐官
5. このセッションの⽬的
• Elastic は超⾼速な OSS ベースの検索エンジン
• どこにでもデプロイができ、様々なパブリッククラウド上でも稼働
• 検索の⼒を活かして監視、セキュリティソリューションも提供
• 今回は、下記の内容をご紹介します
– Elastic 概要と Microsoft Azure への Elastic Cloud デプロイ
– Visual Studio Code の Elastic プラグインご紹介
– .NET ⽤のクライアントライブラリご紹介
– ASP.NET Core Web アプリへの検索機能の追加⽅法
– 続いて、⾞井さんパートで、CircleCI による DevOps の実践⽅法
8. 3 Solutions, 1 Stack, Deploy Anywhere
Elastic スタックで実現
Kibana
Elasticsearch
Beats Logstash
Elastic エンタープライズサーチ Elastic セキュリティ
Elastic オブザーバビリティ
3 つのソリューション
SaaS
(AWS/Azure/GCP)
IaaS
(クラウド & オンプレ)
Elastic Cloud
on Kubernetes
Elastic Cloud Elastic Cloud
Enterprise
豊富なデプロイ選択肢
Kubernetes
(クラウド & オンプレ)
14. なぜ Elasticsearch なのか︖
• 企業では主にリレーショナルデータベースを使⽤してデータを格納
• テーブルを簡単に結合し、必要なデータベースからこのデータを取得できる
• しかし、時間の経過とともに、データベースとテーブルが肥⼤化して、数百万のデータセットを含む⼤規模なデータ
ベースになると、操作を実⾏できなくなる
• ⼀⽅、Elasticsearch は、数百万のドキュメントを数秒で簡単に検索できる
• Elasticsearch は、柔軟で強⼒なオープンソースの分散型リアルタイム検索
および分析エンジン
• Elasticsearch はドキュメントベースのデータベースでデータを JSON 形式で保存
• Elasticsearch は、アプリケーションの強⼒な検索ツールとして使⽤できる
• インデックス、ドキュメント、フィールド等を作成し、データを Elasticsearch にプッシュで、検索の準備が整う
• Elasticsearch の2つのユニークで重要な機能
• ⽔平スケール
• ⾼可⽤性
17. 膨⼤なデータ処理とリアルタイム性を要求
される配⾞マッチング検索で Elastic を活⽤
1秒あたりのデータ投⼊件数︓ 85万から130万メッセージ
1⽇あたりのデータ投⼊量︓ 12TB
1秒あたりのドキュメントスキャン︓ 1億から40億のドキュメント数
データサイズ︓ 1PB
クラスターサイズ︓ 700台の Elasticsearch
インジェスションパイプライン︓ 100 + Data パイプラインジョブ
2018年4⽉の Qcon での Uber 様 講演より
https://www.infoq.com/presentations/uber-elasticsearch-clusters/
21. Elasticsearch for VSCode ホスト設定
http://user:pass@host:9200
https://elastic:oRHGj80iJUO6CF7WBUMiwyu1x@8009bf958b6w592
3b3c56983d4048df824.japaneast.azure.elastic-cloud.com:9243
26. 新しいドキュメントの作成 -2
“title”: ”Elastic ⼊⾨ - Elasticsearch/Kibana/Logstash/Beats”
“title”: ”Elastic & ASP.NET Core 3.x プログラミング”
“title”: ”Elastic による AKS Log/Metric/APM 管理”
“title”: ”Visual Studio Code による Elasticsearch プログラミング”
“title”: ”Elastic Logstash/Beats 開発と管理 徹底解説”
•
•
27. ドキュメントの取得 - 1
•
•
(結果)
{
"_index": "books",
"_type": "_doc",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"title": "Elastic 入門",
"date": "Oct 1, 2020",
"author": {
"first_name": "Shotaro",
"last_name": "Suzuki"
}
}
}
GET books/_doc/1/
28. ドキュメントの取得 – 2 _source のみ
•
•
(結果)
{
"title": "Elastic 入門",
"date": "Oct 1, 2020",
"author": {
"first_name": "Shotaro",
"last_name": "Suzuki"
}
}
GET books/_doc/1/_source
29. ドキュメントの検索 – 1 全てのデータを検索
•
•
•
took – Elasticsearchが検索を実⾏するのにミリ秒単位の時間
timed_out –検索がタイムアウトしたかどうかを⽰します
_shards –検索されたシャードの数と、検索されたシャードの成功/失敗の数を⽰す
hits –検索結果
hits.total –検索条件に⼀致するドキュメントの総数
hits.hits –検索結果の実際の配列(デフォルトは最初の10ドキュメント)
hits.sort -結果のソートキー(スコアでソートする場合は⽋落)
POST books/_doc/_search
{
”query": {
“match_all” : {}
}
}
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
30. ドキュメントの検索 – 2 シャードとは
•
•
•
•
• コンテンツボリュームを⽔平に分割/スケーリングすることが可能
• シャード間(場合によっては複数のノード上)で操作を分散および並列化できるため パフォーマ
ンス/スループットが向上
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
31. ドキュメントの特定のデータの検索 – クエリ DSL とは︖
•
•
•
•
POST books/_doc/_search
{
"query": {
"match" : {
"title" : "Elasticsearch"
}
}
}
Elasticsearch データをクエリする⽅法はたくさんあります。詳細についてはこちら。
https://www.elastic.co/guide/en/elasticsearch/guide/current/_most_important_queries.html
32. ドキュメントの更新 - 1(データの変更)
•
POST books/_doc/1/_update
{
"doc": {
"title": "Elastic ⼊⾨ -
Elasticsearch/Kibana/Logstash/Beats"
}
}
GET books/_doc/1
{
"title": "Elastic ⼊⾨ –
Elasticsearch/Kibana/Logstash/Beats",
"date": "Oct 21, 2020",
"author": {
"first_name": "Taro",
"last_name": "Sato"
}
}
36. Model の作成
• Elasticsearch のデータ
から JSON にシリアライズ
のため必要
• Book という名のクラスを
追加
public class Book
{
public string Title { get; set; }
public string Isbn { get; set; }
public int PageCount { get; set; }
public string ThumbnailUrl { get; set; }
public string ShortDescription { get; set; }
public string LongDescription { get; set; }
public string Status { get; set; }
public string Authors { get; set; }
public string Categories { get; set; }
}
37. Elasticsearch への接続を作成
• NEST ライブラリ追加
• Startup.cs のサービス構成メソッド( )内に接続を作成
dotnet add package NEST
using Elasticsearch.Net;
using Nest;
===
var pool = new SingleNodeConnectionPool
(new Uri(“http://localhost:9200”)); //ローカル実⾏の場合
var settings = new ConnectionSettings(pool)
.DefaultIndex("books");
var client = new ElasticClient(settings);
services.AddSingleton(client);
38. Elasticsearch への接続を作成 - Elastic Cloud ⽤
•
var pool = new SingleNodeConnectionPool
(new Uri(http://localhost:9200/));
// Elastic Cloud デプロイ時に取得した値3つ (例)
https://elastic:oRHGj80iJUO6CF7WBUMiwyu1x@8009bf95
8b6w5923b3c56983d4048df824.japaneast.azure.elastic
-cloud.com:9243
39. Search ⽤の HTML を作成 (index.cshtml 編集)
@model Nest.ISearchResponse<Book>
<form asp-controller="Home" asp-action="Index"
method="post">
<input type="text" name="query" />
<input type="submit" value="Search" />
</form>
@if (Model.Documents.Any())
{
<h3>検索結果</h3>
<ul>
@foreach (var book in Model.Documents)
{
<li>Title: @book.Title (ISBN:
@book.Isbn)</li>
}
</ul>
}
• @model を
[ISearchResponse]<Book>
に設定
• これは Elasticsearch 呼び出し
からの応答のタイプ
• 検索クエリをサーバーにポストバック
できる HTML フォームを追加
• Elasticsearch に渡して結果をレ
ンダリング
• ⼀致するドキュメントのタイトルと
ISBN をレンダリングする単純な
ループを追加
40. Elasticsearch クエリー ① MatchAll
•
•
private readonly ElasticClient _client;
public HomeController(ILogger<HomeController> logger, ElasticClient client)
{
_logger = logger;
_client = client;
}
public IActionResult Index()
{
var results = _client.Search<Book>(s => s
.Query(q => q
.MatchAll()
)
);
return View(results);
}
インデックス内の全てのドキュメントを返す
クエリ
≒ RDBMS の "SELECT *" クエリ
41. Elasticsearch クエリー ② Term
•
public IActionResult Index()
{
ISearchResponse<Book> results;
if (!string.IsNullOrWhiteSpace(query))
{
var results = _client.Search<Book>(s => s
.Query(q => q
.Term(t => t)
.Field(f => f.Isbn)
.Value(query)
)
)
);
}
else
{
.Query(q => q
.MatchAll()
)
);
…
⽤語クエリ
正確なクエリに⼀致するドキュメントを
⾒つける
42. Elasticsearch クエリー ③ Match
•
public IActionResult Index(string query)
{
ISearchResponse<Book> results;
if (!string.IsNullOrWhiteSpace(query))
{
results = _client.Search<Book>(s => s
.Query(q => q
.Match(t => t
.Field(f => f.Title)
.Query(query)
)
)
);
}
else
{
…
ユーザーにテキストを⼊⼒し、そのテキ
ストをドキュメント内のコンテンツの任意
の部分と⼀致させる
[重要な点]
• 複数のドキュメントを照合
• すべての⼀致する⽂書には、タイトル
に、当該テキストが含まれる
• ⼩⽂字で指定したのにマッチする
• この動作はカスタムアナライザーで
上書き可能
• これは別の⾼度なトピック
• Elasticsearch でサポートされる
クエリは他にも多数
• Term クエリと Match クエリは
基本的ユースケース
44. Elasticsearch Aggregations ー 範囲集計
•
…
results = _client.Search<Book>(s => s
.Query(q => q
.MatchAll()
)
.Aggregations(a => a
.Range("pageCounts", r => r
.Field(f => f.PageCount)
.Ranges(r => r.From(0),
r => r.From(200).To(400),
r => r.From(400).To(600),
r => r.From(600)
)
)
…
[重要な点]
• MatchAll クエリに加えて、集計メソ
ッドを使⽤
• "範囲" 集計を指定
• Index.cshtml も編集必要
45. Elasticsearch Aggregations ー 条件集計
•
…
)
.Aggregations(a => a
.Range("pageCounts", r => r
.Field(f => f.PageCount)
.Ranges(r => r.From(0),
r => r.From(200).To(400),
r => r.From(400).To(600),
r => r.From(600)
)
)
.Terms("categories", t => t
.Field("categories.keyword")
)
)
…
• タグバブルやファセットUIシステム
のユースケース
• ⽤語集計
• ≒ RDBMS の“GROUP BY”句
• ドキュメント間でさまざまな単語
(または「⽤語」)に関する統計を
取得可能
• Index.cshtml も編集必要
フィールド値が⽂字列 “categories.keyword”
に設定されているのは、⽤語の集計は負荷の⾼い
操作であり、通常は "text" フィールドでは実⾏され
ないため
46. Search ⽤の HTML を修正 (index.cshtml 編集)
@model Nest.ISearchResponse<Book>
<form asp-controller="Home" asp-action="Index" method="post">
<input type="text" name="query" />
<input type="submit" value="検索" />
</form>
@if (Model.Documents.Any())
{
<h3>検索結果</h3>
<ul>
@foreach (var book in Model.Documents)
{
<li>Title: @book.Title (ISBN:
@book.Isbn)</li>
}
</ul>
}
@if (Model.Aggregations != null)
{
<h3>集計</h3>
@if (Model.Aggregations.ContainsKey("pageCounts"))
{
<h4>ページ数 (範囲)</h4>
<ul>
@foreach (var bucket in
Model.Aggregations.Range("pageCounts").Buckets)
{
<li>@bucket.Key: @bucket.DocCount</li>
}
</ul>
}
@if (Model.Aggregations.ContainsKey("categories"))
{
<h4>カテゴリ (Terms)</h4>
<ul>
@foreach (var bucket in
Model.Aggregations.Terms("categories").Buckets)
{
<li>@bucket.Key: @bucket.DocCount</li>
}
</ul>
}
}
50. Learn, Build, and Scale with Elastic
- Elastic Cloud で快適なアプリ開発を実現しよう︕
https://event.shoeisha.jp/devsumi/20210218/session/3062/
59. CircleCIの特徴
- Build Intelligence
- さまざまなサイズ(スペック)のコンテナ/VMによってビルド可能
- Orbsを使ってベストプラクティスをすばやく取り込める
• - 各種クラウドに応じたデプロイ用Orbsを取り揃えている
- Test Intelligence
- 過去のテスト結果を活用したテスト並列処理
- CircleCI公式Dockerイメージを使って言語に応じたビルド環境をすばやく起動
- Change Validation
- ビルド失敗時にSSHビルドによるすばやい原因調査が可能
- Insights Endpointによるビルド状況の可視化
73. Logstash による Elasticsearch へのドキュメント⼀括挿⼊
https://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-2017
sqlazuredb.conf という名前で作る
74. Logstash インストール(macOS の場合)
// brew の更新
brew update
// Elasticsearch インストール
brew install elasticsearch
// サービスを⼀覧表⽰したり、サービス(Elastic など)起動もできる
brew services list
brew services start elasticsearch
//Elastic が正常にインストールされたら、Logstash をインストール
//このタスクを達成するために必要なのは、別の brew コマンドだけ
brew install logstash
//インストールが終わったら同じくサービス起動
brew services start logstash
75. Azure SQL Database ⽤設定ファイル(logstash.conf)のコード例 (1)
"jdbc:sqlserver://hostname.database.windows.net:1433;
database=AdventureWorksLT;encrypt=true; hostNameInCertificate=*.database.windows.net"
”<username>@hostname"
”<password>"
/Users/(username)/Documents/sqljdbc_8.4/jpn/mssql-jdbc-8.4.1.jre8.jar"
"com.microsoft.sqlserver.jdbc.SQLServerDriver"
"Select * from [SalesLT].[Customer]"
sqlazuredb.conf
com.microsoft.sqlserver.jdbc.SQLServerDriver
76. Azure SQL Database ⽤設定ファイル(logstash.confB)のコード例 (2)
sqlazuredb.conf
filter{}
output
{
stdout{
codec=>json_lines
}
elasticsearch{
cloud_id
=>":bynGyXZ6lYXN0LmF6dXJlLmVs8w867943534egGKh6GBZXQITdk34XN0aWMtY2xvdWQuY29tOjkyN…DMkNzA==="
cloud_auth => "elastic:pHkMI91iGYZ4DG9KCVNjxn2y”
index=>"customer1"
}
}
79. オンライン決済サービスの監視を⽀える Elastic Stack
ECサイト向けに様々な決済⼿段を提供 / 加盟店に決済画⾯は決済APIを提供するシステム(年間取引額2兆円、2億件以上のトランザクション)
https://www.elastic.co/jp/customers/softbank-payment-service
事例︓ソフトバンク・ペイメント・サービス株式会社
オンライン決済サービスの状況をほぼリアルタイムで可視化
• ダッシュボードで、成功した決済はグリーン、失敗したものはレッド、決済手段ごと
に OK/NG の比率の推移を俯瞰。「1. グリーンが急激に少なくなったら要注意。2. レッ
ドが急激に多くなったら要注意。」
• 誰でも、いつでも、どこでも、簡単に、サービスの状況を把握
• 障害以外でも、爆売れ、不正利用といった、加盟店の変化に気がつく
• エンジニアの決済トランザクションへの関心が高まる
Machine Learning で決済トランザクションの異常を検知
• 決済トランザクションの合計の日次の増減を3周期で学習し、それが予測した範
囲から大きく外れれば、異常として検出
• 可視化だけでは埋蔵してしまう変化を ML にて新たに発見
可視化をビジネスデータにまで広げる
• 2年分の売上推移を部署別・案件別に表現。ヒートマップで営業部門や個人の目
標達成率を表現。年間の加盟店契約の獲得状況を都道府県マップに表示
• サービスサイト閲覧状況を、アクセス元の IP アドレスから企業名を推定し、契約
済み企業からのアクセス、未契約企業からのアクセスランキングを作成
• 非エンジニアでもデータ投入からダッシュボードの作成までできる
80. 事例︓株式会社リコー
すべてのログを Elastic Stack 上に集約。35 ノードで1 ⽇2TB のログを監視
「リコーグループ全システムの IT デバイスで発⽣する1 ⽇2 テラバイトにおよぶログが、すべて Elastic Stack に送り込まれます。これを35ノード、約400テラバ
イトのクラスターで処理します。インデックス数は約10,000 でサイズは約250 テラバイト。ドキュメント数は3,450 億にも及びますが、これは昨年12 ⽉の話で、
現在はさらに増えている状況です」と話す。Elastic Stack の製品については、Elasticsearch、Logstash、Kibana、Filebeat、Packetbeat、
Winlogbeat、Monitoring、Alerting 等が使⽤されており、特に⾒える化でキーとなる Kibana については、セキュリティ統括部のオフィス室内で、⼤型
モニターに常時チャートが表⽰され、担当者がシステムの状況をリアルタイムかつ直感的に把握できるようになっている。
https://www.elastic.co/jp/customers/ricoh
82. 事例︓⽇本経済新聞社
⽇経電⼦版の記事検索およびログ解析の両⽅を1つの仕組みで実現
利⽤範囲の広さで Elasticsearch を採⽤
Elasticsearch を選定したのは、記事検索とログの可視化の両⽅に
使える利⽤範囲の広さが最⼤の理由
15台のクラスタ構成で、1秒あたり9000リクエスト以上という⾼
い性能を発揮
記事検索とログ解析に Elasticsearch を活⽤
⽇経電⼦版の記事は、5年分で約200万件、データサイズは5GB。記事の更新は、1⽇あたり数千回、ピーク時には1分間に300件程度の記事が更
新。検索における利⽤者からのアクセスは、1秒あたり100回程度だが、1秒あたり数千回のアクセスも想定
ログ解析で Elasticsearch を利⽤した最⼤のメリットは、専⾨的な深い知識がなくてもログ解析が可能になること。Elasticsearch と Kibana を利⽤
したログ解析により、たとえば、記事検索のレスポンスにどれくらいの時間がかかっているかを容易に解析でき、アプリケーションのどこにボトルネックがあるのか、
改善するべき機能はどこなのかを迅速に把握できる
https://www.elastic.co/jp/customers/nikkei
“Elasticsearch と Kibana を活⽤することで、エンジニア秘伝の“タレ( shell 芸)”を使って可視化していたログ解析を URL や、
画像で即座に社内共有できるようになりました。これまではログ解析ができるエンジニアが2⼈しかいなかったのですが、Elasticsearch と
Kibana を利⽤することで、秘伝のタレが不要になり、ログ解析ができるエンジニアを6⼈以上に増やすことができましたようになりました。"
– 日本経済新聞社 デジタル編成局 編成部 梅崎裕利氏
84. 事例︓PSCU(⽶国有数の信⽤組合サービス組織)
Elastic は信⽤組合に対する数百万ドル相当の不正⾏為被害を防⽌することでリスク回避を実現
Elastic 製システムをデプロイしてからわずか18か⽉間で、3,500万ドルもの不正⾏為を阻⽌
PSCU における課題
PSCUは、⽶国有数の信⽤組合サービス組織で1,500の信⽤組合にサービスを提供し、年間38億件もの取引を扱う。
会員に対して⽀払い処理、リスク管理、データ分析、オンラインバンキング、モバイルプラットフォームなどさまざまな⾦融サービスを提供
年⽉が経つにつれデータベースが巨⼤化しデータ⼊⼒が困難になり、前⽇のデータを読み込むのに丸1⽇かかる状態で適切なタイミングで不正検
知ができていなかった。
Elasticsearch による解決
会員のオンラインログイン、IP アドレス、住所、サポートセンターへの問い合わせ履歴など、数多くのデータソースを Elasticsearch に集約しログを可視化
当初は内部の不正⾏為検知が⽬的であったが問題なく稼働したため、さらに全⽶1500の信⽤組合の外部からの不正⾏為を阻⽌できるよう、幅広い⾦
融関連データソースからのログを追加
機械学習を使⽤した不正検知を導⼊し導⼊後18ヶ⽉で3,500万ドルもの不正⾏為を阻⽌
単なる不正検知にとどまらず、災害発⽣時の地域で検知された平時と異なる⾏動(⾼価な発電機、⼤量の⽸詰などを突然購⼊するなど)をブロックし
ない機能なども追加
https://www.elastic.co/jp/customers/pscu
"Elastic Stackを構築したことで、不正⾏為を従来よりもはるかに簡単に検知できるようになりました。Elasticプラットフォームに⼊⼒
するデータベースを⼤幅に増やしたことで、従来は決して気付かなかったデータの特徴をとらえられるようになりました。現在では、発⽣中
の不正⾏為を検知できるだけでなく、発⽣前にそれを検知できるようになりました。"
– ジョナソン・ロビンソン氏, PSCU、不正インテリジェンス部門マネージャー
85. 事例︓古野電気株式会社
船舶運航の安全・安⼼・効率化を⽀えるサービスを提供
データ・分析結果を得るまでの平均時間(MTTR)の短縮率 94%
差別化されたカスタマーエクスペリエンス
古野電気は、同社の Elastic オブザーバビリティソリューショ
ンの⼀部として Kibana と Elastic Maps を採⽤したこと
で、船上でのデータ使⽤に関するデータ・分析結果をより多
く得られるようになっています。それらのデータ・分析結果は、
お客様の船舶と陸上の接続コストとパフォーマンスの改善に
役⽴ちます。
コストパフォーマンスに優れたプロアクティブなサービスを
提供
今後発⽣しそうな機器の障害、予兆を検知し、予防保守
を⾏う必要があれば、修理内容を特定し、部品を迅速に
⼿配することで費⽤を抑えながら効果的な対応をご⽀援し
ます。
安全で効率的な航⾏を実現
古野電気は、Elastic Cloud の Elasticsearch
Service を活⽤することで、ライフサイクルソリューションを効
果的に多くのお客様へ展開することができます。また、お客
様のニーズにより最適なサービスプランをパッケージ化し販売
することで、安全で効率的な航⾏へ貢献します。
https://www.elastic.co/jp/customers/furuno