~~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}}