こんにちは、エンジニアの君島です。
AWS公式のマウントツールであるMountpoint for Amazon S3がGAになりましたね。(今更
オープンソースのマウントツールはこれまでも存在していましたが、AWS謹製のツールがリリースされたので、こちらを使用してS3に置いてあるオブジェクトをキーワード検索してみましょう。オブジェクトの名前ではなく、ファイルの中身を検索するのでトラブルシュートなどでログを追う時には便利な方法です。
これまでは、公式ではないツールやコマンドを利用したり、S3をデータソースとしてAmazon Athenaを使ったり、Amazon Kendraを使用したりと準備が必要でしたが、公式にマウントツールが出たことで本番ワークロードでもCLIで簡単にキーワード検索が実現できるようになったので、AWS CloudShellで実行した方法を記載します。
目次 [非表示]
AWS CloudShellからmount-s3を使ってS3をファイル内検索する
Mountpoint for Amazon S3のインストール
AWS CloudShellはIntelベースのプロセッサで動いているようです。
ですので、ARM(graviton)ベースでない方のx86_64のバイナリをダウンロードしてインストールします。バイナリを永続的ストレージの/home領域にダウンロードしていれば、セッションが切れても再度ダウンロードする必要はありません。セッションが切れて再接続した場合は、2行目のインストールコマンドから実行してください。
S3バケットのマウント
マウントするディレクトリを作成して、そこにAWS CloudShell と同一リージョンで作成してあるS3バケットをマウントしましょう。
mnt-s3-bucketというマウント先のディレクトリを作成してから、マウントを実行します。コマンド1行でマウントできます。
S3内をファイル内検索
さあ、ファイル内検索をしてみましょう。普通はfindとgrepの合わせ技がオーソドックスだと思いますが、私がvim使いなので内部grepであるvimgrepを使います。
早速vimを起動しましょう。
vimを起動した状態で、コロン(:)を打つとvimのコマンドを利用することができます。vimgrepは正規表現を使ったファイル内検索をすることができます。1オプション目が正規表現のパターンで、その次のオプションでファイルを指定することになります。
例えば、exceptionという文字列をS3バケット内にある拡張子logファイルの中から検索したい場合は以下のように指定します。2番目のオプションでもワイルドカードを使用することができるのと、再帰的にディレクトリを辿って検索したい場合は**と指定しましょう。
mnt-s3-bucket/*/*と指定してしまうと、mnt-s3-bucketの直下にあるディレクトリ内のファイルだけを検索してしまいますので注意です。
vimgrepは| cwと組み合わせるのが普通かと思います。これは別のウィンドウ表示をしてくれるコマンドで、vimgrepの結果であるファイル一覧と、そのファイルの中身の検索結果をひとつのターミナルで表現することができます。
コマンドを実行してみると、例えば以下のような表示になります。上部のウィンドウはファイルの内容、下部のウィンドウは検索結果のファイル一覧のリストになります。
開いているファイル内は/コマンドを使って他のキーワードや候補の検索を行い、別のファイルを見たい時はCtrl+Wキーでファイル一覧の方へカーソルを移動することができるのですが、ブラウザのショートカットと関連付いているためか動作しなかったので、代わりにwinc、もしくはwincmdを使うようにします。ウィンドウ移動のための引数はカーソル移動のキーと同じようなhjklなどのキーを指定することができます。
ただ、難しく考えてしまうくらいならwやpオプションでウィンドウ移動できることを覚えておきましょう。
これで、CLIで行っているやり方とほぼ同じようなやり方で、S3バケットにあるファイル内のキーワード検索することができるようになりました。
余談
なお、今回は私の趣味で、内部grepであるvimgrepを採用しました。内部grepの場合、検索対象のファイルを一度メモリに読み込みます。
実際にvimgrep中のメモリ状況を見てみました。大きいファイルを検索対象とする場合は、vim実行プロセスが占めるCPUもメモリも増加傾向にあります。
AWS CloudShellの場合、メモリが1GBなので、ファイルサイズがそれよりも大きいものを検索対象とする場合は注意が必要になります。
ログを調査する上ではそこまで大きいファイルサイズにならないかもしれませんが、例えば、上記の例のようにファイル名で対象を絞る等して、大きいサイズのファイルは検索しないようにするなどの対処を行うようにしてください。
また、vimで初期設定のまま、ファイルを開くとswapファイルを作成してしまいます。grepの度にswapファイルが増えるのは嫌ですよね。
S3内にあるファイルを見るような場合は、
で開いたファイルにset noswapfileと指定して保存しておくことで、S3上のファイルを開いてもswapファイルを作成しないようになります。
最後に余談ですが、私は癖でCtrl+Wでよくブラウザのタブを閉じてしまうので、Disable keyboard shortcutsというエクステンションを入れてショートカットを無効化しています。
まとめ
AWS公式のマウントツールであるMountpoint for Amazon S3を用いて、S3内でのファイル内のキーワード検索をAWS CloudShell上で実現する方法を記載しました。
これにより、例えば、アプリケーションログをS3に出力していたときのログの調査をAmazon AthenaやAmazon Kendraを使用することなく、従来のCLIと同じ操作方法で実現できるようになります。
また、本文中で言及はしませんでしたが、AWS CloudShellとMountpoint for Amazon S3を併用することで、クレデンシャルを発行して指定する必要もないのもいいことですね。
今回は、検索結果のファイル一覧とファイルの中身を並べながら操作をすることができるvim(vimgrepとcw)を使った方法を紹介しました。/でファイル内のテキスト検索をして、他のファイル一覧に戻るためのウィンドウ移動はwinc wやwinc pを使って移動します。vimはLinuxでもWindowsでも利用できるので、大体どの環境でも同じような操作感でログの調査を行うことができるのが利点でもあります。
なお、アイキャッチ画像にはStable Diffusion XLでMountpoint for Amazon S3をCLIで使うエンジニア(アニメ風)などといったプロンプトで画像生成してみました。
プロンプトをいじってエンジニアを取り除いたら、なんとなく写実的っぽさと某アニメっぽい雰囲気が両立した画像が生成できたりもして良さそうでした。
告知
カジュアル面談も実施中
ギークフィードではAWSエンジニアなどの職種で一緒に働く仲間を募集しています。
弊社に興味を持っていただいたり、会社のことをカジュアルに聞いてみたいという場合でも、ご気軽にフォームからお問い合わせください。その場合はコメント欄に、カジュアルにお話したいです、と記載ください!

【採用情報】一緒に働く仲間を募集しています
