※当サイトの記事には、広告・プロモーションが含まれます。

Elasticsearch、Logstash、KibanaでTwitter APIで情報を収集し分析してみたかったけど...

gigazine.net

⇧ Oh, my gosh...

Twitterだけでなく、

gigazine.net

www.security-next.com

⇧ Elasticもセキュリティが崩壊してる模様...

残念ながら

www.cvedetails.com

脆弱性も報告されてるようですね...

Elasticsearch、Logstash、KibanaでTwitter APIで情報を収集し分析してみたかったけど...

前回、

ts0818.hatenablog.com

Twitter APIを利用できるように準備したので、

qiita.com

qiita.com

⇧ 上記サイト様を参考に、Twitterの情報を収集して分析するのを試してみようとしましたが、結論から申し上げますと、実現できませんでした。

Twitterの仕様変更なのか、logstash-input-twitterというlogstashのプラグイン側の問題なのか分かりませんが、Twitter APIのエンドポイントにアクセスできない状態を解消できませんでした。

なので、以降は、お時間のある方のみご照覧ください。

Logstashのプラグインについては、

github.com

⇧ logstash-input-twitter以外もあるみたい。

設定ファイルについては、

qiita.com

⇧ /etc/logstash配下のフォルダにあるみたい。

twitter.confについては、

stackoverflow.com

⇧ 上記サイト様によりますと、

/etc/logstash/conf.d/twitter.conf

⇧ 上記のディレクトリに配置している模様。

設定ファイルのバックアップについては、/etc/logstash/conf.dに配置しないようにすればどこに配置しても良いんかな?

今回は、設定ファイルのバックアップ作らなかったけど。

twitter.confを作成。

www.mtioutput.com

logstash-input-twittertwitterの投稿収集を開始。

sudo /usr/share/logstash/bin/logstash --path.settings=/etc/logstash/ --path.data /var/lib/logstash -f /etc/logstash/conf.d/twitter.conf

はい、エラー。

とりあえず、

qiita.com

⇧ 上記サイト様を参考に、HTTPSの対応を行います。

2023年1月9日(月)追記:↓ ここから

なんか、HTTPSの対応したら、

security.stackexchange.com

⇧ 上記サイト様と同じ現象が起こるようになってしまったので、Elasticsearch 8でセキュリティの仕様が変わったらしいので、HTTPS化の手順も変わってるのかもしれない...

出てるエラーとしては、Pythonライブラリのelasticsearchを使った時に、

File "/usr/local/lib/python3.8/dist-packages/elastic_transport/_node/_http_urllib3.py", line 199, in perform_request
    raise err from None
elastic_transport.TlsError: TLS error caused by: TlsError(TLS error caused by: SSLError(hostname '10.255.255.16' doesn't match 'client'))    

⇧ 上記のようなエラーメッセージが表示されるのだけど、

ネットの情報を見る限り、

access.redhat.com

knowledge.informatica.com

⇧ 対応方法としては、

  1. /etc/hostsファイルにホスト名を追加
  2. 証明書ファイルの「subject」を修正

ってことだとは思うのだけど、参考サイト様が参考にしてるElasticの公式のブログのTLS化の手順でも「/etc/hosts」にホスト名を追加してるっぽいので、『1./etc/hostsファイルにホスト名を追加』で対応するのが良いのかな?

そして、

hymd3a.hatenablog.com

⇧ WSL 2(Windows SubSystem for Linux 2)を使ってる場合は、/etc/hostsファイルが再起動の度に初期化されるという罠があるようです...

/etc/hostsファイルに追加してみたけど、エラー解消されなかった...

discuss.elastic.co

⇧ 上記サイト様によりますと、証明書を作成する時に、IPアドレスとホスト名を追加するしか無さそうなのかな?

2023年1月9日(月)追記:↑ ここまで

caとcertは同時に作成できなくなったようなので、caの方から作成する。

cd /usr/share/elasticsearch
sudo bin/elasticsearch-certuti ca --pem

展開(解凍)しておく。

sudo unzip elastic-stack-ca.zip -d /etc/elasticsearch/certs/

続いて、作成したcaを元にcertを作成する。

sudo bin/elasticsearch-certutil cert \
  --name client \
  --ca-cert /etc/elasticsearch/certs/ca/ca.crt \
  --ca-key /etc/elasticsearch/certs/ca/ca.key \
  --pem

展開(解凍)しておきます。

sudo unzip certificate-bundle.zip -d /etc/elasticsearch/certs/

/etc/elasticsearch/elasticsearch.ymlの設定を行います。

設定ファイルの書き方が変わったっぽい?

再起動しておきます。

Kibanaも同様に設定しておく必要があるようなので、設定します。

sudo cp /etc/elasticsearch/certs/ca/ca.crt /etc/kibana/config/certs
sudo cp /etc/elasticsearch/certs/client/client.crt /etc/kibana/config/certs
sudo cp /etc/elasticsearch/certs/client/client.key /etc/kibana/config/certs

再起動しておきます。

Logstashについても設定を行います。

sudo cp /etc/elasticsearch/certs/ca/ca.crt /etc/logstash/config/certs
sudo cp /etc/elasticsearch/certs/client/client.crt /etc/logstash/config/certs
sudo cp /etc/elasticsearch/certs/client/client.key /etc/logstash/config/certs

再起動が何故か失敗...

ログを確認。

-- Logs begin at Thu 2022-12-29 21:10:25 JST, end at Mon 2023-01-02 18:52:28 JST. --
Dec 30 13:08:29 Toshinobu-PC systemd[1]: Started logstash.
Dec 30 13:08:29 Toshinobu-PC logstash[2362]: Using bundled JDK: /usr/share/logstash/jdk
Dec 30 13:11:43 Toshinobu-PC logstash[2362]: Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
Dec 30 13:11:43 Toshinobu-PC logstash[2362]: [2022-12-30T13:11:43,580][INFO ][logstash.runner          ] Log4j configuration path used is: /etc/logstash/log4j2.properties
Dec 30 13:11:43 Toshinobu-PC logstash[2362]: [2022-12-30T13:11:43,596][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"8.5.3", "jruby.version"=>"jruby 9.3.9.0 (2.6.8) 2022-10-24 537cd1>Dec 30 13:11:43 Toshinobu-PC logstash[2362]: [2022-12-30T13:11:43,599][INFO ][logstash.runner          ] JVM bootstrap flags: [-Xms1g, -Xmx1g, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djruby.compile.in>Dec 30 13:11:43 Toshinobu-PC logstash[2362]: [2022-12-30T13:11:43,642][INFO ][logstash.settings        ] Creating directory {:setting=>"path.queue", :path=>"/var/lib/logstash/queue"}
Dec 30 13:11:43 Toshinobu-PC logstash[2362]: [2022-12-30T13:11:43,658][INFO ][logstash.settings        ] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/var/lib/logstash/dead_letter_queue"}
Dec 30 13:11:44 Toshinobu-PC logstash[2362]: [2022-12-30T13:11:44,080][INFO ][logstash.agent           ] No persistent UUID file found. Generating new UUID {:uuid=>"de0b2a09-d375-4eef-ae0f-98a376c8d95a", :path=>Dec 30 13:11:45 Toshinobu-PC logstash[2362]: [2022-12-30T13:11:45,460][INFO ][logstash.config.source.local.configpathloader] No config files found in path {:path=>"/etc/logstash/conf.d/*.conf"}
Dec 30 13:11:45 Toshinobu-PC logstash[2362]: [2022-12-30T13:11:45,471][ERROR][logstash.config.sourceloader] No configuration found in the configured sources.
Dec 30 13:11:45 Toshinobu-PC logstash[2362]: [2022-12-30T13:11:45,665][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600, :ssl_enabled=>false}
Dec 30 13:11:45 Toshinobu-PC logstash[2362]: [2022-12-30T13:11:45,784][INFO ][logstash.runner          ] Logstash shut down.
Dec 30 13:11:45 Toshinobu-PC logstash[2362]: [2022-12-30T13:11:45,795][FATAL][org.logstash.Logstash    ] Logstash stopped processing because of an error: (SystemExit) exit
Dec 30 13:11:45 Toshinobu-PC logstash[2362]: org.jruby.exceptions.SystemExit: (SystemExit) exit
Dec 30 13:11:45 Toshinobu-PC logstash[2362]:         at org.jruby.RubyKernel.exit(org/jruby/RubyKernel.java:790) ~[jruby.jar:?]
Dec 30 13:11:45 Toshinobu-PC logstash[2362]:         at org.jruby.RubyKernel.exit(org/jruby/RubyKernel.java:753) ~[jruby.jar:?]
Dec 30 13:11:45 Toshinobu-PC logstash[2362]:         at usr.share.logstash.lib.bootstrap.environment.
<main>(/usr/share/logstash/lib/bootstrap/environment.rb:91) ~[?:?] Dec 30 13:11:45 Toshinobu-PC systemd[1]: logstash.service: Main process exited, code=exited, status=1/FAILURE Dec 30 13:11:45 Toshinobu-PC systemd[1]: logstash.service: Failed with result 'exit-code'. Dec 30 13:11:46 Toshinobu-PC systemd[1]: logstash.service: Scheduled restart job, restart counter is at 1. Dec 30 13:11:46 Toshinobu-PC systemd[1]: Stopped logstash.</main>

⇧ 「No config files found in path {:path=>"/etc/logstash/conf.d/*.conf"}」って言われてるんだけど、/etc/logstash/conf.d/twitter.confが認識されていない...

なんか、

github.com

⇧ 権限の問題とか仰ってる人がいたので、権限を変更しときました。

あと、よく分からんけども、

www.elastic.co

github.com

akng-engineer.hatenablog.com

logstash-input-twitterがインストールされてるのかどうか分からんので、インストールしておきます。

sudo /usr/share/logstash/bin/logstash-plugin install --no-verify logstash-input-twitter

再度、logstashを実行

sudo /usr/share/logstash/bin/logstash --path.settings=/etc/logstash/ --path.data /var/lib/logstash -f /etc/logstash/conf.d/twitter.conf

で、エラー。

ログを見てみる。

Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
[2023-01-03T10:40:26,797][INFO ][logstash.runner          ] Log4j configuration path used is: /etc/logstash/log4j2.properties
[2023-01-03T10:40:26,803][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"8.5.3", "jruby.version"=>"jruby 9.3.9.0 (2.6.8) 2022-10-24 537cd1f8bc OpenJDK 64-Bit Server VM 17.0.5+8 on 17.0.5+8 +indy +jit [x86_64-linux]"}
[2023-01-03T10:40:26,806][INFO ][logstash.runner          ] JVM bootstrap flags: [-Xms1g, -Xmx1g, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djruby.compile.invokedynamic=true, -Djruby.jit.threshold=0, -XX:+HeapDumpOnOutOfMemoryError, -Djava.security.egd=file:/dev/urandom, -Dlog4j2.isThreadContextMapInheritable=true, -Djruby.regexp.interruptible=true, -Djdk.io.File.enableADS=true, --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED, --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED, --add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED, --add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED, --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED, --add-opens=java.base/java.security=ALL-UNNAMED, --add-opens=java.base/java.io=ALL-UNNAMED, --add-opens=java.base/java.nio.channels=ALL-UNNAMED, --add-opens=java.base/sun.nio.ch=ALL-UNNAMED, --add-opens=java.management/sun.management=ALL-UNNAMED]
[2023-01-03T10:40:27,156][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2023-01-03T10:40:29,995][INFO ][logstash.monitoring.internalpipelinesource] Monitoring License OK
[2023-01-03T10:40:29,996][INFO ][logstash.monitoring.internalpipelinesource] Validated license for monitoring. Enabling monitoring pipeline.
[2023-01-03T10:40:30,425][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600, :ssl_enabled=>false}
[2023-01-03T10:40:31,043][INFO ][org.reflections.Reflections] Reflections took 111 ms to scan 1 urls, producing 125 keys and 438 values
[2023-01-03T10:40:33,026][INFO ][logstash.javapipeline    ] Pipeline `main` is configured with `pipeline.ecs_compatibility: v8` setting. All plugins in this pipeline will default to `ecs_compatibility => v8` unless explicitly configured otherwise.
[2023-01-03T10:40:33,026][INFO ][logstash.javapipeline    ] Pipeline `.monitoring-logstash` is configured with `pipeline.ecs_compatibility: v8` setting. All plugins in this pipeline will default to `ecs_compatibility => v8` unless explicitly configured otherwise.
[2023-01-03T10:40:33,087][INFO ][logstash.outputs.elasticsearch][main] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["https://10.255.255.16:9200"]}
[2023-01-03T10:40:33,087][INFO ][logstash.outputs.elasticsearchmonitoring][.monitoring-logstash] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearchMonitoring", :hosts=>["https://10.255.255.16:9200"]}
[2023-01-03T10:40:33,098][WARN ][logstash.outputs.elasticsearchmonitoring][.monitoring-logstash] You have enabled encryption but DISABLED certificate verification, to make sure your data is secure remove `ssl_certificate_verification => false`
[2023-01-03T10:40:33,098][WARN ][logstash.outputs.elasticsearch][main] You have enabled encryption but DISABLED certificate verification, to make sure your data is secure remove `ssl_certificate_verification => false`
[2023-01-03T10:40:33,139][INFO ][logstash.outputs.elasticsearch][main] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[https://elastic:xxxxxx@10.255.255.16:9200/]}}
[2023-01-03T10:40:33,139][INFO ][logstash.outputs.elasticsearchmonitoring][.monitoring-logstash] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[https://elastic:xxxxxx@10.255.255.16:9200/]}}
[2023-01-03T10:40:33,218][WARN ][logstash.outputs.elasticsearchmonitoring][.monitoring-logstash] Restored connection to ES instance {:url=>"https://elastic:xxxxxx@10.255.255.16:9200/"}
[2023-01-03T10:40:33,221][WARN ][logstash.outputs.elasticsearch][main] Restored connection to ES instance {:url=>"https://elastic:xxxxxx@10.255.255.16:9200/"}
[2023-01-03T10:40:33,233][INFO ][logstash.outputs.elasticsearch][main] Elasticsearch version determined (8.5.3) {:es_version=>8}
[2023-01-03T10:40:33,233][INFO ][logstash.outputs.elasticsearchmonitoring][.monitoring-logstash] Elasticsearch version determined (8.5.3) {:es_version=>8}
[2023-01-03T10:40:33,235][WARN ][logstash.outputs.elasticsearchmonitoring][.monitoring-logstash] Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>8}
[2023-01-03T10:40:33,235][WARN ][logstash.outputs.elasticsearch][main] Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>8}
[2023-01-03T10:40:33,285][WARN ][logstash.outputs.elasticsearchmonitoring][.monitoring-logstash] Elasticsearch Output configured with `ecs_compatibility => v8`, which resolved to an UNRELEASED preview of version 8.0.0 of the Elastic Common Schema. Once ECS v8 and an updated release of this plugin are publicly available, you will need to update this plugin to resolve this warning.
[2023-01-03T10:40:33,298][INFO ][logstash.outputs.elasticsearch][main] Config is not compliant with data streams. `data_stream => auto` resolved to `false`
[2023-01-03T10:40:33,300][INFO ][logstash.outputs.elasticsearch][main] Config is not compliant with data streams. `data_stream => auto` resolved to `false`
[2023-01-03T10:40:33,306][WARN ][logstash.outputs.elasticsearch][main] Elasticsearch Output configured with `ecs_compatibility => v8`, which resolved to an UNRELEASED preview of version 8.0.0 of the Elastic Common Schema. Once ECS v8 and an updated release of this plugin are publicly available, you will need to update this plugin to resolve this warning.
[2023-01-03T10:40:33,307][WARN ][logstash.javapipeline    ][.monitoring-logstash] 'pipeline.ordered' is enabled and is likely less efficient, consider disabling if preserving event order is not necessary
[2023-01-03T10:40:33,349][INFO ][logstash.outputs.elasticsearch][main] Using a default mapping template {:es_version=>8, :ecs_compatibility=>:v8}
[2023-01-03T10:40:33,379][INFO ][logstash.javapipeline    ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>8, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>1000, "pipeline.sources"=>["/etc/logstash/conf.d/twitter.conf"], :thread=>"#<Thread:0x4879fea7@/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:131 run>"}
[2023-01-03T10:40:33,384][INFO ][logstash.javapipeline    ][.monitoring-logstash] Starting pipeline {:pipeline_id=>".monitoring-logstash", "pipeline.workers"=>1, "pipeline.batch.size"=>2, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>2, "pipeline.sources"=>["monitoring pipeline"], :thread=>"#<Thread:0xd237e77@/usr/share/logstash/logstash-core/lib/logstash/pipeline_action/create.rb:52 run>"}
[2023-01-03T10:40:34,291][INFO ][logstash.javapipeline    ][main] Pipeline Java execution initialization time {"seconds"=>0.91}
[2023-01-03T10:40:34,292][INFO ][logstash.javapipeline    ][.monitoring-logstash] Pipeline Java execution initialization time {"seconds"=>0.9}
[2023-01-03T10:40:34,345][INFO ][logstash.javapipeline    ][.monitoring-logstash] Pipeline started {"pipeline.id"=>".monitoring-logstash"}
[2023-01-03T10:40:34,383][INFO ][logstash.inputs.twitter  ][main] ECS compatibility is enabled but `target` option was not specified. This may cause fields to be set at the top-level of the event where they are likely to clash with the Elastic Common Schema. It is recommended to set the `target` option to avoid potential schema conflicts (if your data is ECS compliant or non-conflicting, feel free to ignore this message)
[2023-01-03T10:40:34,385][INFO ][logstash.javapipeline    ][main] Pipeline started {"pipeline.id"=>"main"}
[2023-01-03T10:40:34,394][INFO ][logstash.inputs.twitter  ][main][xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx] Starting twitter tracking
[2023-01-03T10:40:34,444][INFO ][logstash.agent           ] Pipelines running {:count=>2, :running_pipelines=>[:".monitoring-logstash", :main], :non_running_pipelines=>[]}
[2023-01-03T10:45:41,406][WARN ][logstash.inputs.twitter  ][main][xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx] Twitter client error {:message=>"End of file reached", :exception=>EOFError, :backtrace=>["org/jruby/ext/openssl/SSLSocket.java:846:in `sysread'", "/usr/share/logstash/vendor/jruby/lib/ruby/stdlib/openssl/buffering.rb:148:in `readpartial'", "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/twitter-6.2.0/lib/twitter/streaming/connection.rb:19:in `stream'", "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/twitter-6.2.0/lib/twitter/streaming/client.rb:119:in `request'", "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/twitter-6.2.0/lib/twitter/streaming/client.rb:59:in `sample'", "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/logstash-input-twitter-4.1.0/lib/logstash/inputs/twitter.rb:161:in `do_run'", "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/logstash-input-twitter-4.1.0/lib/logstash/inputs/twitter.rb:146:in `run'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:411:in `inputworker'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:402:in `block in start_input'"], :options=>nil}

⇧ エラー部分を抜粋してみると、

Twitter client error {
  :message=>"End of file reached"
  , :exception=>EOFError
  , :backtrace=>[
    "org/jruby/ext/openssl/SSLSocket.java:846:in `sysread'"
    , "/usr/share/logstash/vendor/jruby/lib/ruby/stdlib/openssl/buffering.rb:148:in `readpartial'"
    , "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/twitter-6.2.0/lib/twitter/streaming/connection.rb:19:in `stream'"
    , "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/twitter-6.2.0/lib/twitter/streaming/client.rb:119:in `request'"
    , "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/twitter-6.2.0/lib/twitter/streaming/client.rb:59:in `sample'"
    , "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/logstash-input-twitter-4.1.0/lib/logstash/inputs/twitter.rb:161:in `do_run'"
    , "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/logstash-input-twitter-4.1.0/lib/logstash/inputs/twitter.rb:146:in `run'"
    , "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:411:in `inputworker'"
    , "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:402:in `block in start_input'"
  ]
  , :options=>nil
}

⇧ logstash-input-twitterのバグ?

github.com

⇧ 同じ事象のissueが2016年に公開されてるんだけど、未解決のままだし...elasticのforumでも解決されてないことが多過ぎて、無秩序状態なんだが...

アウトプットの方のプラグインも一応、インストールしてみました。

そして、/etc/logstash/conf.d/twitter.confの設定を変えてみたところ、

[2023-01-05T19:59:37,710][WARN ][logstash.inputs.twitter  ][main][6a87fcdbecf1372f1375785462379dce6562a9de029b2b0d839dec3794f112f5] Twitter client error {:message=>"", :exception=>Twitter::Error::Forbidden, :backtrace=>["/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/twitter-6.2.0/lib/twitter/streaming/response.rb:24:in `on_headers_complete'", "org/ruby_http_parser/RubyHttpParser.java:370:in `<<'", "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/twitter-6.2.0/lib/twitter/streaming/response.rb:19:in `<<'", "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/twitter-6.2.0/lib/twitter/streaming/connection.rb:20:in `stream'", "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/twitter-6.2.0/lib/twitter/streaming/client.rb:119:in `request'", "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/twitter-6.2.0/lib/twitter/streaming/client.rb:38:in `filter'", "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/logstash-input-twitter-4.1.0/lib/logstash/inputs/twitter.rb:166:in `do_run'", "/usr/share/logstash/vendor/bundle/jruby/2.6.0/gems/logstash-input-twitter-4.1.0/lib/logstash/inputs/twitter.rb:146:in `run'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:411:in `inputworker'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:402:in `block in start_input'"], :options=>nil}

⇧ 別のエラーが出てきて、

stackoverflow.com

⇧ まさかの、logstash-input-twitterというプラグインTwitter API v2に対応していない説が浮上。

さらに、

github.com

from elastic/logstash#5834 (comment) :

Twitter apps created after April 29 2022 no longer have access to the v1.1 streaming API, even if you have Elevated access. Those endpoints are in the process of being retired.

https://github.com/logstash-plugins/logstash-input-twitter/issues/74

⇧ 2022年4月29日以降にTwitter appsを作成した場合は、Twitter API v1.1を参照しないらしい...

試しに、TwitterのDeveloper Portalで、v1.1のエンドポイントにアクセスするっぽいappを作成してみて、

作成できたら、「Keys and tokens」で「Access Token」と「Access Secret」を作成しておきます。

/etc/logstash/conf.d/twitter.confの設定をTwitter API v1.1のエンドポイントにアクセスするものに変えてみたのですが、エラー変わらず...

Twitter Developer PortalだとStandalone Appsは、V1.1 ACCESSってなってるんだけど、Twitter API v1.1なら対応になってるんじゃないのかね?、話が違うんやんけ...

Twitterのドキュメント見てみると、

developer.twitter.com

⇧ アカウントの権限の問題とか言ってるんだけど、

developer.twitter.com

Can I use the v1.1 version of the Twitter API with Essential access?

No, not at this time. Elevated access is required to make requests to the v1.1 version of the Twitter API. If an Essential access account requests a v1.1 endpoint, the error will likely be:

Request failed with code 403 - You currently have Essential access which includes access to Twitter API v2 endpoints only. If you need access to this endpoint, you'll need to apply for Elevated access via the Developer Portal. You can learn more here: https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api#v2-access-level (Twitter code 453)

https://developer.twitter.com/en/support/twitter-api/developer-account

⇧ う~む、Elevated accessである必要があるらしいのだけど、

Please note:

If you were approved for a developer account before November 15th, 2021, you were automatically converted to Elevated access. This means that your existing Apps can continue to be used to make requests to standard v1.1, premium v1.1, and enterprise endpoints, and that all of your user Access Tokens are still valid.

https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api#v2-access-leve

⇧ 2021年11月15日以降に作成したTwitterアカウントは、「Elevated access」にならないらしい...でも、自分が使ったの2021年11月15日以前に作成してたTwitterアカウントなんだけどな...

ということで、

otona-life.com

blog.dan-russell.com

⇧ 上記サイト様を参考に、Twitterのアカウントをもう一つ作成することにしました。

Twitter Developer Portalを利用する場合、Twitterのアカウントにメールアドレスが登録されてることも必須らしいのだけど、同じメールアドレスは使えないらしい...と思ったんだけど、普通に使えました、謎過ぎる...。

で、自動的に「Elevated access」にはならないので、「Apply」押下で。

で、承認されると、「Elevated」にアクセスが変わるのだけど、

「Projects & Apps」>「Overview」の「Standalone Apps」で「Create App」でTwitter Appを作成して、認証情報を取得します。

で、取得した認証情報を、/etc/logstash/conf.d/twitter.confに設定して、logstash-input-twitterプラグインを試したけども、エラー変わらず、403になる...。

う~む、Twitter APIの仕様が変わったのか分からんけど、logstash-input-twitterプラグインが対応してくれるのを待つしかないのかな...

なんか、

https://twittercommunity.com/t/getting-403-forbidden-error-even-though-elevated-access/167276

⇧「Elevated access」にしても403になるって仰ってる人がいて、Twitter側の仕様変更に、サードパーティーのライブラリの対応が追い付いてないってことなんかね?

stackoverflow.com

If you created your app on or after 2022-04-29, you won't be able to access streaming with Twitter API v1.1:

Additionally, beginning today, new client applications will not be able to gain access to v1.1 statuses/sample and v1.1 statuses/filter.

https://twittercommunity.com/t/deprecation-announcement-removing-compliance-messages-from-statuses-filter-and-retiring-statuses-sample-from-the-twitter-api-v1-1/170500

You'll have to use Twitter API v2 instead.
Tweepy's interface for streaming with Twitter API v2 is StreamingClient.

https://stackoverflow.com/questions/72101437/stream-encountered-http-error-403-twitter-api-but-i-have-elevated-access

⇧ 2022年4月29日以降に作成したTwitter appの認証情報だと、Twitter API v1.1のエンドポイントにアクセスできないって話が本当なら、logstash-input-twitterプラグインTwitter API v2に対応してくれないと、logstash-input-twitterは利用できないってことね...

zero-cheese.com

⇧ 上記サイト様を参考に、「User authentication settings」を設定してみたけど、403でエラーは変わらず。

代替案としては、

www.rittmanmead.com

⇧ Tweepyなるものが有力なんかな?

github.com

⇧ README.mdを見た限り、Twitter API v2に対応している模様。

次回は、Tweepyを試してみるとしますか。

それにしても、Twitterの仕様変更のせいなのか、logstash-input-twitterプラグインの説明不足なのか、ブラックボックス過ぎて時間を無駄にしてしまいましたわ...

貴重な正月休みを返して欲しいですわ...

毎度モヤモヤ感が半端ない...

今回はこのへんで。