S3の情報を取得する方法(tags設定時)

再度質問を失礼させて頂きます。

S3→SQS→Filebeat→Logstash→Elasticsearchの連携時、
filebeat.ymlでS3バケット名・ファイル名毎にtagsを設定し連携しようとしています。

以下の定義情報の元、疎通すると意図しないインデックスデータが登録されます。

filebeat.yml

#=========================== Filebeat inputs =============================

filebeat.inputs:

- type: s3

  enabled: true
  queue_url: https://XXX/XXX/TEST-001
  access_key_id: XXX
  secret_access_key: XXX
  aws.s3.bucket.name: "test-001"
  aws.s3.object.key: "test1.log"
  tags:
    - "companyA_1"


- type: s3

  enabled: true
  queue_url: https://XXX/XXX/TEST-001
  access_key_id: XXX
  secret_access_key: XXX
  aws.s3.bucket.name: "test-002"
  aws.s3.object.key: "test2.log"
  tags:
    - "companyB_1"

#----------------------------- Logstash output --------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["XX.XXX.XX.XX:5044","XX.XXX.XXX.XXX:5044"]
  loadbalance: false

Logstashのconfig

input {
  beats {
  port => 5044
  }
}

filter{
}

output{
  if "companyA_1" in [tags] {
    elasticsearch{
       proxy => "http://XXX:XXX@XXXX:XXXX" 
       hosts => "https://XXX.XXX.XXX.XXX.XX:XXX" 
       user => "XXX" 
       password => "XXX" 
       index => "test-a-1" 
    }
  }

  if "companyB_1" in [tags] {
    elasticsearch{
       proxy => "http://XXX:XXX@XXXX:XXXX" 
       hosts => "https://XXX.XXX.XXX.XXX.XX:XXX" 
       user => "XXX" 
       password => "XXX" 
       index => "test-b-1" 
    }
  }
}

indexデータ
→index名が逆で登録される。

▼登録データ
|index|aws.s3.bucket.name|aws.s3.object.key|
|test-b-1|soc-backup-001|soctest1.log|
|test-a-1|soc-backup-002|soctest2.log|

▼想定データ
|index|aws.s3.bucket.name|aws.s3.object.key|
|test-a-1|soc-backup-001|soctest1.log|
|test-b-1|soc-backup-002|soctest2.log|

原因について御存知の方がいらっしゃいましたらお手数ですが返信をお願い致します。

いくつか不明なところがあったので、確認させてもらえますか?


- type: s3

  enabled: true
  queue_url: https://XXX/XXX/TEST-001  # ←①
  access_key_id: XXX
  secret_access_key: XXX
  aws.s3.bucket.name: "test-002"    # ←②
  aws.s3.object.key: "test2.log"  # ←②
  tags:
    - "companyB_1"


もう1か所inputを指定されているところでも、キューのURLがhttps://XXX/XXX/TEST-001と同じ文字列になっていますが、同じSQSキューを指定されているのでしょうか?それとも、違うURLが指定されてますでしょうか?(違うものを指定した場合、おっしゃる現象が再現できなかったものですから確認したいです)


aws.s3.bucket.name や aws.s3.object.keyは、filebeatで取得した結果出力される項目だと思いますが、設定項目としては不要なのでは?と思いました。
https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-input-s3.html

あとは、問題の切り分けのためにLogstashをいったん切り離してfilebeatのstdoutのoutputで確認するのも良いかもしれません。この時点でindexが逆転していれば、Logstashには問題がないと言えそうですし。

tsgkdt様

回答頂きありがとうございます。
返信が遅れ申し訳ありません。

①はい、2つのinputともに同じSQSキューを指定しています。

②aws.s3.bucket.name や aws.s3.object.keyは設定項目として必要だと認識しています。

実現したい構成図は以下の通りです。
filebeatにてtagsの条件にS3バケット名とファイル名を入れたいので、項目を設定しています。

あとは、問題の切り分けのためにLogstashをいったん切り離してfilebeatのstdoutのoutputで確認するのも良いかもしれません。
→filebeatのデバックログを確認したところ、filebeatの時点でtag名、S3バケット名・ファイル名の紐づけが誤っていました。なのでLogstash側には問題がなさそうです。

気になったのが、何度もS3からのアップロードを行ったところ
tag名、S3バケット名・ファイル名の紐づけが一致してインデックス登録されることがあります。

恐れ入りますが、再度返信頂けますと幸いです。

②のaws.s3.bukect.name、aws.s3.object.keyについて確認させてください。

filebeat.reference.ymlを見ても、この設定項目がなく、ドキュメントにも記載がないため、どこかに書いてありましたでしょうか?

# Beta: Config options for AWS S3 input
#- type: s3
  #enabled: false

  # AWS Credentials
  # If access_key_id and secret_access_key are configured, then use them to make api calls.
  # If not, s3 input will load default AWS config or load with given profile name.
  #access_key_id: '${AWS_ACCESS_KEY_ID:""}'
  #secret_access_key: '${AWS_SECRET_ACCESS_KEY:""}'
  #session_token: '${AWS_SESSION_TOKEN:"”}'
  #credential_profile_name: test-s3-input

  # Queue urls (required) to receive queue messages from
  #queue_urls: ["https://sqs.us-east-1.amazonaws.com/1234/test-s3-logs-queue"]

  # The duration (in seconds) that the received messages are hidden from subsequent
  # retrieve requests after being retrieved by a ReceiveMessage request.
  #visibility_timeout: 300

テストとして、以下のような設定で、test.log以外のファイルをアップしても、filebeatでinput処理されました。

- type: s3
  queue_url: 	https://sqs.ap-northeast-1.amazonaws.com/***********/sqs-test
  access_key_id: himitsunoid
  secret_access_key: himitsunokey
  aws.s3.bucket.name: "temp.work"  
  aws.s3.object.key: "test.log" 
  tags:
    - "companyA_1"

このことからすると、aws.s3.bucket.nameなどでフィルタリング処理されているわけではないように考えています。

つまり、結果としてどちらのS3 inputでも処理される可能性があり、意図しない方のS3インプットに入って処理されると、逆のタグ設定がされ、
たまたま意図した方のS3インプットで処理されると、期待した結果と一致したインデックス登録になると考えます。
こうしたことから、逆のもあれば、正解のもあるといった状況になっているのではと考えます。

ドキュメント上、実際の挙動からみてaws.s3.bukect.name、aws.s3.object.keyといった設定はできない(あくまでも処理した結果が格納されるOutputのフィールドな)のではないでしょうか。

→ドキュメントには記載されていません。(個人的に可能かなと思い試してみました)

上記について理解しました。
回答頂きありがとうございました。