~~NOCACHE~~ ~~DISCUSSION~~ ## 13.S3に置いたファイルを自動登録する 結局ShellScript頼みなので、ご参考までに・・・。 ### 成功事例 ■処理の流れ S3→SQS→Logstash→ShellScript→ElasticSearch ※S3イベント通知の設定は[[Aws:SimpleQueueService:S3EventNotification|Aws/SimpleQueueService/S3イベント通知]]を参照願います。 ■処理イメージ図 {{:Aws:ElasticSearch:pasted:20210728-092011.png?direct 800x0}} #### Logstash.conf ・input:[[https://www.elastic.co/guide/en/logstash/current/plugins-inputs-sqs.html|plugins-inputs-sqs]]でSQSからキューを取得 ・filter:SQSからキューで取得できるRecords(fields)からkeyとsizeとbucketnameを抽出。※urldecodeは日本語ファイルを想定してです。 ・output:sizeが0じゃなかったらkeyとbucketnameをShellScriptに渡しています。※sizeが0はフォルダ作成イベントなので除外。 input { sqs { queue => "{SQSのキュー名}" region => "ap-northeast-1" } } filter { split { field => "Records" } mutate { add_field => { "key" => "%{[Records][s3][object][key]}" "size" => "%{[Records][s3][object][size]}" "bucket" => "%{[Records][s3][bucket][name]}" } remove_field => [ "Records" ] } urldecode { field => "key" } } output { if !([size] == "0") { exec { command => "bash /tmp/logstash.sh %{key} %{bucket}" } } stdout{} } #### /tmp/logstash.sh [[Aws:ElasticSearch:RegisterJapaneseFile#投入データの加工、登録|Aws/ElasticSearch/11.日本語ファイルを登録する]]の処理を流用し、前処理にAWSCLIコマンドでバケット名とキー名からファイルを取得しています。 #! /bin/bash path="/tmp/filebeat/" file_name=$(basename $1) file_path=$path$file_name aws s3api get-object --bucket $2 --key $1 $file_path file=$(base64 $file_path | perl -pe 's/\n//g') echo -e "{ \"index\" : { \"_index\" : \"{インデックス名}\", \"_type\" : \"_doc\", \"_id\" : \"{ID}\", \"pipeline\": \"{pipeline名}\" }\n{ \"@timestamp\" : \"`date +'%Y-%m-%dT%H:%M:%S.%NZ'`\", \"data\" : \"$file\" }" > input.json curl -X POST -H 'Content-Type: application/json' '{Elasticsearchエンドポイント}/_bulk?pretty' --data-binary @input.json rm -f $file_path #### Template、Pipeline TemplateとPipelineは下記を参考に設定願います。 [[Aws:ElasticSearch:Template|Aws/ElasticSearch/3.Template]] [[Aws:ElasticSearch:Pipeline|Aws/ElasticSearch/4.Pipeline]] ### 失敗事例 #### その1Logstash(Filebeatのoutput.logstash)連携 ・S3→SQS→Filebeat→Logstash→ElasticSearch  →[[Aws:ElasticSearch:AutomaticallyRegisterFilesPlacedDirectory#その1|Aws/ElasticSearch/12.ディレクトリに置いたファイルを自動登録するの失敗事例]]と同じで実現を断念、やはりバイナリファイル向きではない。 #### その2Logstash(Filebeatのoutput.file)連携 ・S3→SQS→Filebeat→Logstash→ShellScript→ElasticSearch  →output.fileは、SQSのキュー毎にファイルが分けられない為[[Aws:ElasticSearch:AutomaticallyRegisterFilesPlacedDirectory#成功事例|Aws/ElasticSearch/12.ディレクトリに置いたファイルを自動登録するの成功事例]]の方法が使えなかった。 {{tag>AWS Elasticsearch}}