AWS CLIを利用してS3上のファイルをgrepする
先日Hadoop Streamingを利用してS3上のファイル群にgrepコマンドを実行する方法を紹介しました。
とはいえ、ファイル数が少ない場合や時間が掛かってもいいからEMRを利用せずにローカルPC上でgrepコマンドを実行したいこともありますよね。ということで、今回用意したのがAWS CLIを利用してS3上のファイル群をローカルPC上でgrepするbashスクリプトです。
動作確認環境
今回の動作確認を行った環境です。
- Mac OS X 10.12.5
- GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
- aws-cli/1.11.60 Python/2.7.10 Darwin/16.6.0 botocore/1.5.23
s3grep
s3grepというbashスクリプトを用意しました。
#!/bin/bash S3_BUCKET=$1 S3_KEY_PREFIX=$2 GREP_ARG=${@:3} # ループ時に Ctrl + C を入力された際に即時終了するようにtrapしておく。 trap 'exit' 2 s3_key_list=`aws s3api list-objects-v2 --bucket ${S3_BUCKET} --prefix ${S3_KEY_PREFIX} --query 'Contents[].Key' --output text` for s3_key in ${s3_key_list}; do aws s3 cp s3://${S3_BUCKET}/${s3_key} - | grep ${GREP_ARG} done
実際に実行してみたいと思います。grepコマンドをHadoop Streaming上で実行すると同様にS3上に存在するELBのアクセスログに対してgrepコマンドを実行します。検索キーワードはhbase
にします。
$ bash s3grep ap-northeast-1.elasticmapreduce.samples elb-access-logs/data hbase 2014-09-26T00:14:54.095610Z lb-demo 248.249.135.182:16314 243.176.48.223:8888 0.000045 0.015074 0.000093 200 200 0 331 "GET http://www.abcxyz.com:80/hbase/static/art/icon_hbase_48.png HTTP/1.1" 2014-09-26T01:08:20.486129Z lb-demo 245.132.4.0:30572 253.116.224.20:8899 0.000091 0.013434 0.000046 200 500 0 331 "GET http://www.abcxyz.com:80/hbase/static/art/icon_hbase_48.png HTTP/1.1" ...
s3grepの引数は以下の通りです。
- 第1引数は検索対象のS3バケット名です。
- 第2引数は検索対象のS3バケットのKeyのプレフィックスです。
- 第3引数以降はgrepコマンドの引数として利用されます。
第3引数以降はgrepコマンドの引数として利用されますので、-C 3
というオプション付きでgrepコマンドジョブを実行できます。
$ bash s3grep ap-northeast-1.elasticmapreduce.samples elb-access-logs/data -C 3 hbase 2014-09-26T00:14:53.942159Z lb-demo 255.66.115.35:16314 249.37.166.85:8888 0.000051 0.013419 0.0001 200 200 0 1052 "GET http://www.abcxyz.com:80/impala/static/art/icon_impala_48.png HTTP/1.1" 2014-09-26T00:14:54.030229Z lb-demo 240.174.2.168:53891 252.65.1.24:8888 0.000049 0.008665 0.000095 200 200 0 1084 "GET http://www.abcxyz.com:80/jobsub/static/art/icon_jobsub_48.png HTTP/1.1" 2014-09-26T00:14:54.081101Z lb-demo 250.7.2.164:45667 252.134.40.229:8899 0.000047 0.014202 0.000096 200 200 0 614 "GET http://www.abcxyz.com:80/metastore/static/art/icon_metastore_48.png HTTP/1.1" 2014-09-26T00:14:54.095610Z lb-demo 248.249.135.182:16314 243.176.48.223:8888 0.000045 0.015074 0.000093 200 200 0 331 "GET http://www.abcxyz.com:80/hbase/static/art/icon_hbase_48.png HTTP/1.1" 2014-09-26T00:14:54.203009Z lb-demo 246.8.166.208:16314 253.14.207.224:8888 0.000045 0.014536 0.000093 200 200 0 970 "GET http://www.abcxyz.com:80/oozie/static/art/icon_oozie_editor_48.png HTTP/1.1" 2014-09-26T00:14:54.250976Z lb-demo 248.83.190.156:45667 245.184.68.60:8888 0.000043 0.015893 0.000093 200 200 0 1542 "GET http://www.abcxyz.com:80/static/art/spinner.gif HTTP/1.1" 2014-09-26T00:14:54.779575Z lb-demo 248.146.237.105:45667 248.249.135.182:8000 0.000108 0.062291 0.000109 200 200 0 26 "GET http://www.abcxyz.com:80/beeswax/api/autocomplete/ HTTP/1.1" 2014-09-26T01:08:20.240551Z lb-demo 243.216.137.234:30572 245.68.140.143:8888 0.000096 0.026642 0.000098 200 200 0 1052 "GET http://www.abcxyz.com:80/impala/static/art/icon_impala_48.png HTTP/1.1" 2014-09-26T01:08:20.316970Z lb-demo 241.151.71.88:43045 241.151.71.88:8888 0.000089 0.01395 0.000113 200 200 0 1084 "GET http://www.abcxyz.com:80/jobsub/static/art/icon_jobsub_48.png HTTP/1.1" 2014-09-26T01:08:20.362970Z lb-demo 251.95.219.198:30572 245.202.249.169:8888 0.00009 0.013596 0.000144 200 400 0 614 "GET http://www.abcxyz.com:80/metastore/static/art/icon_metastore_48.png HTTP/1.1" 2014-09-26T01:08:20.486129Z lb-demo 245.132.4.0:30572 253.116.224.20:8899 0.000091 0.013434 0.000046 200 500 0 331 "GET http://www.abcxyz.com:80/hbase/static/art/icon_hbase_48.png HTTP/1.1" 2014-09-26T01:08:20.584244Z lb-demo 244.213.218.63:30572 241.118.194.220:8888 0.000089 0.082825 0.000065 200 200 0 1119 "GET http://www.abcxyz.com:80/oozie/static/art/icon_oozie_dashboard_48.png HTTP/1.1" 2014-09-26T01:08:20.584502Z lb-demo 249.221.75.197:30850 244.144.55.8:8888 0.000038 0.08285 0.000029 200 200 0 1542 "GET http://www.abcxyz.com:80/static/art/spinner.gif HTTP/1.1" 2014-09-26T01:08:20.584406Z lb-demo 243.26.83.207:43045 242.60.164.143:443 0.00004 0.08307 0.000026 200 500 0 970 "GET http://www.abcxyz.com:80/oozie/static/art/icon_oozie_editor_48.png HTTP/1.1"
最後に
非常に短いスクリプトかと思いますので、いい感じに加工して利用してもらえますと幸いです。