GeoIPプロセッサ

  1. [](#geoip-automatic-updates)デフォルトでは、プロセッサは[MaxMind](http://dev.maxmind.com/geoip/geoip2/geolite2/)からのGeoLite2 City、GeoLite2 Country、およびGeoLite2 ASN IP地理位置データベースを使用し、CC BY-SA 4.0ライセンスの下で共有されています。ノードが`````storage.googleapis.com`````ドメインに接続できる場合、次のいずれかの条件が満たされると、これらのデータベースは自動的にダウンロードされます:
  2. - `````ingest.geoip.downloader.eager.download`````trueに設定されている
  3. - クラスターに`````geoip`````プロセッサを持つパイプラインが少なくとも1つある
  4. Elasticsearchは、Elastic GeoIPエンドポイントからこれらのデータベースの更新を自動的にダウンロードします:[https://geoip.elastic.co/v1/database](https://geoip.elastic.co/v1/database?elastic_geoip_service_tos=agree)。これらの更新のダウンロード統計を取得するには、[GeoIP stats API](/read/elasticsearch-8-15/08a98111509bbe8e.md)を使用してください。
  5. クラスターがElastic GeoIPエンドポイントに接続できない場合や、自分で更新を管理したい場合は、[自分のIP地理位置データベースの更新を管理する](043d393090f955dd.md#manage-geoip-database-updates)を参照してください。
  6. ElasticsearchMaxmindから提供されたライセンスキーを使用してデータベースファイルを直接ダウンロードするようにしたい場合は、[GeoIPデータベース構成の作成または更新](/read/elasticsearch-8-15/b30edf5fb53439e4.md)を参照してください。
  7. Elasticsearch30日間エンドポイントに接続できない場合、すべての更新されたデータベースは無効になります。Elasticsearchはドキュメントのgeoipデータの強化を停止し、`````tags: ["_geoip_expired_database"]`````フィールドを代わりに追加します。
  8. ## パイプラインでのgeoipプロセッサの使用
  9. [](#ingest-geoip-options)
  10. **表22. `````geoip`````オプション**
  11. | 名前 | 必須 | デフォルト | 説明 |
  12. | :-- | :-- | :-- | :-- |
  13. | `````field````` | はい | - | 地理的ルックアップのためにIPアドレスを取得するフィールド。 |
  14. | `````target_field````` | いいえ | geoip | MaxMindデータベースから取得した地理情報を保持するフィールド。 |
  15. | `````database_file````` | いいえ | GeoLite2-City.mmdb | 自動的にダウンロードされたGeoLite2データベースのいずれかを参照するデータベースファイル名(GeoLite2-City.mmdbGeoLite2-Country.mmdb、またはGeoLite2-ASN.mmdb)、または`````ingest-geoip`````構成ディレクトリ内のサポートされているデータベースファイルの名前、または[構成されたデータベース](/read/elasticsearch-8-15/c459c7b077f0803c.md "Get geoip database configuration API")の名前(`````.mmdb`````サフィックスが追加されます)。 |
  16. | `````properties````` | いいえ | \[`````continent_name`````, `````country_iso_code`````, `````country_name`````, `````region_iso_code`````, `````region_name`````, `````city_name`````, `````location`````\] \* | geoipルックアップに基づいて`````target_field`````に追加されるプロパティを制御します。 |
  17. | `````ignore_missing````` | いいえ | `````false````` | `````true`````および`````field`````が存在しない場合、プロセッサは静かに終了し、ドキュメントを変更しません |
  18. | `````first_only````` | いいえ | `````true````` | `````true`````がある場合、最初に見つかったgeoipデータのみが返されます。`````field`````が配列を含んでいても。 |
  19. | `````download_database_on_pipeline_creation````` | いいえ | `````true````` | `````true`````がある場合(および`````ingest.geoip.downloader.eager.download``````````false`````の場合)、パイプラインが作成されるときに欠落しているデータベースがダウンロードされます。そうでない場合、ダウンロードは`````default_pipeline`````または`````final_pipeline`````としてインデックスで使用されるときにトリガーされます。 |
  20. *`````database_file`````に何が利用可能かによります:
  21. - GeoLite2 CityまたはGeoIP2 Cityデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip``````````country_iso_code``````````country_name``````````continent_code``````````continent_name``````````region_iso_code``````````region_name``````````city_name``````````timezone``````````location`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
  22. - GeoLite2 CountryまたはGeoIP2 Countryデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip``````````country_iso_code``````````country_name``````````continent_code``````````continent_name`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
  23. - GeoLite2 ASNデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip``````````asn``````````organization_name`````および`````network`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
  24. - GeoIP2 Anonymous IPデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip``````````hosting_provider``````````tor_exit_node``````````anonymous_vpn``````````anonymous``````````public_proxy`````、および`````residential_proxy`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
  25. - GeoIP2 Connection Typeデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip`````、および`````connection_type`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
  26. - GeoIP2 Domainデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip`````、および`````domain`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
  27. - GeoIP2 ISPデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip``````````asn``````````organization_name``````````network``````````isp``````````isp_organization_name``````````mobile_country_code`````、および`````mobile_network_code`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
  28. - GeoIP2 Enterpriseデータベースが使用されている場合、次のフィールドが`````target_field`````の下に追加される可能性があります:`````ip``````````country_iso_code``````````country_name``````````continent_code``````````continent_name``````````region_iso_code``````````region_name``````````city_name``````````timezone``````````location``````````asn``````````organization_name``````````network``````````hosting_provider``````````tor_exit_node``````````anonymous_vpn``````````anonymous``````````public_proxy``````````residential_proxy``````````domain``````````isp``````````isp_organization_name``````````mobile_country_code``````````mobile_network_code``````````user_type``````````connection_type`````。実際に追加されるフィールドは、見つかったものと`````properties`````で構成されたプロパティに依存します。
  29. GeoIP2 Anonymous IPGeoIP2 Connection TypeGeoIP2 DomainGeoIP2 ISP、およびGeoIP2 Enterpriseデータベースを本番環境で使用しないでください。この機能は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。
  30. 以下は、デフォルトの都市データベースを使用し、`````ip`````フィールドに基づいて`````geoip`````フィールドに地理情報を追加する例です:
  31. #### Python
  32. ``````python
  33. resp = client.ingest.put_pipeline(
  34. id="geoip",
  35. description="Add geoip info",
  36. processors=[
  37. {
  38. "geoip": {
  39. "field": "ip"
  40. }
  41. }
  42. ],
  43. )
  44. print(resp)
  45. resp1 = client.index(
  46. index="my-index-000001",
  47. id="my_id",
  48. pipeline="geoip",
  49. document={
  50. "ip": "89.160.20.128"
  51. },
  52. )
  53. print(resp1)
  54. resp2 = client.get(
  55. index="my-index-000001",
  56. id="my_id",
  57. )
  58. print(resp2)
  59. `

Ruby

  1. response = client.ingest.put_pipeline(
  2. id: 'geoip',
  3. body: {
  4. description: 'Add geoip info',
  5. processors: [
  6. {
  7. geoip: {
  8. field: 'ip'
  9. }
  10. }
  11. ]
  12. }
  13. )
  14. puts response
  15. response = client.index(
  16. index: 'my-index-000001',
  17. id: 'my_id',
  18. pipeline: 'geoip',
  19. body: {
  20. ip: '89.160.20.128'
  21. }
  22. )
  23. puts response
  24. response = client.get(
  25. index: 'my-index-000001',
  26. id: 'my_id'
  27. )
  28. puts response

Js

  1. const response = await client.ingest.putPipeline({
  2. id: "geoip",
  3. description: "Add geoip info",
  4. processors: [
  5. {
  6. geoip: {
  7. field: "ip",
  8. },
  9. },
  10. ],
  11. });
  12. console.log(response);
  13. const response1 = await client.index({
  14. index: "my-index-000001",
  15. id: "my_id",
  16. pipeline: "geoip",
  17. document: {
  18. ip: "89.160.20.128",
  19. },
  20. });
  21. console.log(response1);
  22. const response2 = await client.get({
  23. index: "my-index-000001",
  24. id: "my_id",
  25. });
  26. console.log(response2);

コンソール

  1. PUT _ingest/pipeline/geoip
  2. {
  3. "description" : "Add geoip info",
  4. "processors" : [
  5. {
  6. "geoip" : {
  7. "field" : "ip"
  8. }
  9. }
  10. ]
  11. }
  12. PUT my-index-000001/_doc/my_id?pipeline=geoip
  13. {
  14. "ip": "89.160.20.128"
  15. }
  16. GET my-index-000001/_doc/my_id

次のように返されます:

コンソール-結果

  1. {
  2. "found": true,
  3. "_index": "my-index-000001",
  4. "_id": "my_id",
  5. "_version": 1,
  6. "_seq_no": 55,
  7. "_primary_term": 1,
  8. "_source": {
  9. "ip": "89.160.20.128",
  10. "geoip": {
  11. "continent_name": "Europe",
  12. "country_name": "Sweden",
  13. "country_iso_code": "SE",
  14. "city_name" : "Linköping",
  15. "region_iso_code" : "SE-E",
  16. "region_name" : "Östergötland County",
  17. "location": { "lat": 58.4167, "lon": 15.6167 }
  18. }
  19. }
  20. }

以下は、デフォルトの国データベースを使用し、ipフィールドに基づいてgeoフィールドに地理情報を追加する例です。このデータベースは自動的にダウンロードされることに注意してください。したがって、これ:

Python

  1. resp = client.ingest.put_pipeline(
  2. id="geoip",
  3. description="Add geoip info",
  4. processors=[
  5. {
  6. "geoip": {
  7. "field": "ip",
  8. "target_field": "geo",
  9. "database_file": "GeoLite2-Country.mmdb"
  10. }
  11. }
  12. ],
  13. )
  14. print(resp)
  15. resp1 = client.index(
  16. index="my-index-000001",
  17. id="my_id",
  18. pipeline="geoip",
  19. document={
  20. "ip": "89.160.20.128"
  21. },
  22. )
  23. print(resp1)
  24. resp2 = client.get(
  25. index="my-index-000001",
  26. id="my_id",
  27. )
  28. print(resp2)

Ruby

  1. response = client.ingest.put_pipeline(
  2. id: 'geoip',
  3. body: {
  4. description: 'Add geoip info',
  5. processors: [
  6. {
  7. geoip: {
  8. field: 'ip',
  9. target_field: 'geo',
  10. database_file: 'GeoLite2-Country.mmdb'
  11. }
  12. }
  13. ]
  14. }
  15. )
  16. puts response
  17. response = client.index(
  18. index: 'my-index-000001',
  19. id: 'my_id',
  20. pipeline: 'geoip',
  21. body: {
  22. ip: '89.160.20.128'
  23. }
  24. )
  25. puts response
  26. response = client.get(
  27. index: 'my-index-000001',
  28. id: 'my_id'
  29. )
  30. puts response

Js

  1. const response = await client.ingest.putPipeline({
  2. id: "geoip",
  3. description: "Add geoip info",
  4. processors: [
  5. {
  6. geoip: {
  7. field: "ip",
  8. target_field: "geo",
  9. database_file: "GeoLite2-Country.mmdb",
  10. },
  11. },
  12. ],
  13. });
  14. console.log(response);
  15. const response1 = await client.index({
  16. index: "my-index-000001",
  17. id: "my_id",
  18. pipeline: "geoip",
  19. document: {
  20. ip: "89.160.20.128",
  21. },
  22. });
  23. console.log(response1);
  24. const response2 = await client.get({
  25. index: "my-index-000001",
  26. id: "my_id",
  27. });
  28. console.log(response2);

コンソール

  1. PUT _ingest/pipeline/geoip
  2. {
  3. "description" : "Add geoip info",
  4. "processors" : [
  5. {
  6. "geoip" : {
  7. "field" : "ip",
  8. "target_field" : "geo",
  9. "database_file" : "GeoLite2-Country.mmdb"
  10. }
  11. }
  12. ]
  13. }
  14. PUT my-index-000001/_doc/my_id?pipeline=geoip
  15. {
  16. "ip": "89.160.20.128"
  17. }
  18. GET my-index-000001/_doc/my_id

次のように返されます:

コンソール-結果

  1. {
  2. "found": true,
  3. "_index": "my-index-000001",
  4. "_id": "my_id",
  5. "_version": 1,
  6. "_seq_no": 65,
  7. "_primary_term": 1,
  8. "_source": {
  9. "ip": "89.160.20.128",
  10. "geo": {
  11. "continent_name": "Europe",
  12. "country_name": "Sweden",
  13. "country_iso_code": "SE"
  14. }
  15. }
  16. }

すべてのIPアドレスがデータベースから地理情報を見つけるわけではありません。この場合、target_fieldはドキュメントに挿入されません。

以下は、情報が見つからない場合にインデックスされるドキュメントの例です:”80.231.5.0”

Python

  1. resp = client.ingest.put_pipeline(
  2. id="geoip",
  3. description="Add geoip info",
  4. processors=[
  5. {
  6. "geoip": {
  7. "field": "ip"
  8. }
  9. }
  10. ],
  11. )
  12. print(resp)
  13. resp1 = client.index(
  14. index="my-index-000001",
  15. id="my_id",
  16. pipeline="geoip",
  17. document={
  18. "ip": "80.231.5.0"
  19. },
  20. )
  21. print(resp1)
  22. resp2 = client.get(
  23. index="my-index-000001",
  24. id="my_id",
  25. )
  26. print(resp2)

Ruby

  1. response = client.ingest.put_pipeline(
  2. id: 'geoip',
  3. body: {
  4. description: 'Add geoip info',
  5. processors: [
  6. {
  7. geoip: {
  8. field: 'ip'
  9. }
  10. }
  11. ]
  12. }
  13. )
  14. puts response
  15. response = client.index(
  16. index: 'my-index-000001',
  17. id: 'my_id',
  18. pipeline: 'geoip',
  19. body: {
  20. ip: '80.231.5.0'
  21. }
  22. )
  23. puts response
  24. response = client.get(
  25. index: 'my-index-000001',
  26. id: 'my_id'
  27. )
  28. puts response

Js

  1. const response = await client.ingest.putPipeline({
  2. id: "geoip",
  3. description: "Add geoip info",
  4. processors: [
  5. {
  6. geoip: {
  7. field: "ip",
  8. },
  9. },
  10. ],
  11. });
  12. console.log(response);
  13. const response1 = await client.index({
  14. index: "my-index-000001",
  15. id: "my_id",
  16. pipeline: "geoip",
  17. document: {
  18. ip: "80.231.5.0",
  19. },
  20. });
  21. console.log(response1);
  22. const response2 = await client.get({
  23. index: "my-index-000001",
  24. id: "my_id",
  25. });
  26. console.log(response2);

コンソール

  1. PUT _ingest/pipeline/geoip
  2. {
  3. "description" : "Add geoip info",
  4. "processors" : [
  5. {
  6. "geoip" : {
  7. "field" : "ip"
  8. }
  9. }
  10. ]
  11. }
  12. PUT my-index-000001/_doc/my_id?pipeline=geoip
  13. {
  14. "ip": "80.231.5.0"
  15. }
  16. GET my-index-000001/_doc/my_id

次のように返されます:

コンソール-結果

  1. {
  2. "_index" : "my-index-000001",
  3. "_id" : "my_id",
  4. "_version" : 1,
  5. "_seq_no" : 71,
  6. "_primary_term": 1,
  7. "found" : true,
  8. "_source" : {
  9. "ip" : "80.231.5.0"
  10. }
  11. }

位置をジオポイントとして認識する

このプロセッサは、IPアドレスの推定緯度と経度を含むlocationフィールドでドキュメントを強化しますが、このフィールドはマッピングで明示的に定義しない限り、Elasticsearchでgeo_pointタイプとしてインデックスされません。

上記の例のインデックスに対して、次のマッピングを使用できます:

Python

  1. resp = client.indices.create(
  2. index="my_ip_locations",
  3. mappings={
  4. "properties": {
  5. "geoip": {
  6. "properties": {
  7. "location": {
  8. "type": "geo_point"
  9. }
  10. }
  11. }
  12. }
  13. },
  14. )
  15. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my_ip_locations',
  3. body: {
  4. mappings: {
  5. properties: {
  6. geoip: {
  7. properties: {
  8. location: {
  9. type: 'geo_point'
  10. }
  11. }
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my_ip_locations",
  3. mappings: {
  4. properties: {
  5. geoip: {
  6. properties: {
  7. location: {
  8. type: "geo_point",
  9. },
  10. },
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);

コンソール

  1. PUT my_ip_locations
  2. {
  3. "mappings": {
  4. "properties": {
  5. "geoip": {
  6. "properties": {
  7. "location": { "type": "geo_point" }
  8. }
  9. }
  10. }
  11. }
  12. }

自分のIP地理位置データベースの更新を管理する

ElasticエンドポイントからIP地理位置データベースを自動的に更新できない場合、いくつかの他のオプションがあります:

プロキシエンドポイントを使用する

Elastic GeoIPエンドポイントに直接接続できない場合は、安全なプロキシを設定することを検討してください。次に、各ノードのelasticsearch.ymlファイルのingest.geoip.downloader.endpoint設定にプロキシエンドポイントのURLを指定できます。

厳格な設定では、次のドメインを許可されたドメインリストに追加する必要がある場合があります:

  • geoip.elastic.co
  • storage.googleapis.com

カスタムエンドポイントを使用する

Elastic GeoIPエンドポイントを模倣するサービスを作成できます。次に、このサービスから自動更新を取得できます。

  • 1. MaxMindサイトから.mmdbデータベースファイルをダウンロードします。
  • 2. データベースファイルを1つのディレクトリにコピーします。
  • 3. Elasticsearchディレクトリから、次のコマンドを実行します:
    1. ./bin/elasticsearch-geoip -s my/source/dir [-t target/directory]
  • 4. ディレクトリから静的データベースファイルを提供します。たとえば、Dockerを使用してnginxサーバーからファイルを提供できます:
    1. docker run -v my/source/dir:/usr/share/nginx/html:ro nginx
  • 5. 各ノードのelasticsearch.ymlファイルのingest.geoip.downloader.endpoint設定にサービスのエンドポイントURLを指定します。
    デフォルトでは、Elasticsearchは3日ごとにエンドポイントを更新の確認を行います。別のポーリング間隔を使用するには、クラスタ更新設定APIを使用してingest.geoip.downloader.poll.intervalを設定します。

手動でIP地理位置データベースを更新する

  • 1. クラスタ更新設定APIを使用してingest.geoip.downloader.enabledfalseに設定します。これにより、データベースの変更を上書きする可能性のある自動更新が無効になります。また、すべてのダウンロードされたデータベースが削除されます。
  • 2. MaxMindサイトから.mmdbデータベースファイルをダウンロードします。
    カスタムの都市、国、およびASN .mmdbファイルも使用できます。これらのファイルは解凍されている必要があります。タイプ(都市、国、またはASN)はファイルメタデータから取得されるため、ファイル名は重要ではありません。
  • 3. Elasticsearch Serviceのデプロイメントでは、カスタムバンドルを使用してデータベースをアップロードします。
  • 4. 自己管理のデプロイメントでは、データベースファイルを$ES_CONFIG/ingest-geoipにコピーします。
  • 5. geoipプロセッサで、database_fileパラメータをカスタムデータベースファイルを使用するように構成します。

ノード設定

  1. - `````ingest.geoip.cache_size
  • キャッシュすべき最大結果数。デフォルトは1000です。

これらの設定はノード設定であり、すべてのgeoipプロセッサに適用されることに注意してください。つまり、すべての定義されたgeoipプロセッサに対して1つのキャッシュがあります。

クラスター設定

  • ingest.geoip.downloader.enabled
  • (動的、Boolean) trueの場合、Elasticsearchは自動的にIP地理位置データベースの更新をingest.geoip.downloader.endpointからダウンロードして管理します。falseの場合、Elasticsearchは更新をダウンロードせず、すべてのダウンロードされたデータベースを削除します。デフォルトはtrueです。

  • ingest.geoip.downloader.eager.download
  • (動的、Boolean) trueの場合、Elasticsearchはgeoipプロセッサを持つパイプラインが存在するかどうかに関係なく、IP地理位置データベースを即座にダウンロードします。falseの場合、Elasticsearchはgeoipプロセッサを持つパイプラインが存在するか追加されるまでデータベースのダウンロードを開始しません。デフォルトはfalseです。

  • ingest.geoip.downloader.endpoint
  • (静的、string) IP地理位置データベースの更新をダウンロードするために使用されるエンドポイントURL。たとえば、https://myDomain.com/overview.json。デフォルトはhttps://geoip.elastic.co/v1/databaseです。Elasticsearchは、各ノードの一時ディレクトリ$ES_TMPDIR/geoip-databases/<node_id>でダウンロードされたデータベースファイルを保存します。Elasticsearchは${ingest.geoip.downloader.endpoint}?elastic_geoip_service_tos=agreeにGETリクエストを行い、通常overview.jsonに見られるデータベースに関するメタデータのリストを期待します。

GeoIPダウンローダーはJDKの組み込みcacertsを使用します。カスタムエンドポイントを使用している場合は、カスタムhttpsエンドポイントcacertをJDKのトラストストアに追加してください。

  • ingest.geoip.downloader.poll.interval
  • (動的時間値) Elasticsearchがingest.geoip.downloader.endpointでIP地理位置データベースの更新を確認する頻度。1d(1日)より大きくする必要があります。デフォルトは3d(3日)です。