AWS CLIを利用してS3上のファイルをgrepする

2017.06.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

先日Hadoop Streamingを利用してS3上のファイル群にgrepコマンドを実行する方法を紹介しました。

grepコマンドをHadoop Streaming上で実行する

とはいえ、ファイル数が少ない場合や時間が掛かってもいいから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スクリプトを用意しました。

s3grep

#!/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"

最後に

非常に短いスクリプトかと思いますので、いい感じに加工して利用してもらえますと幸いです。