技術四課の鎌田(裕)です。
S3へのログファイルの転送に、AWS CLIやをお使いになることを検討される方は多いことでしょう。
aws s3 cpのコマンドでファイルをS3にコピーは出来る訳ですが、Linuxのcpコマンドを同じ感覚で指定すると、上手くコピーが出来ません。
どんなポイントがあるでしょうか。見て行きましょう。
ポイント1『ファイル名の指定でワイルドカード(*)を使えない』
AWSのコマンドラインツールで、ファイルをS3にコピーしたい時は、以下のようなイメージになります。ファイルを1つだけ送る場合です。
aws s3 cp [送りたいファイル名] s3://[バケット名]/
実行例
これを、複数のファイルで送りたい場合、以下のような指定をしたくなりますね。
aws s3 cp *.txt s3://[バケット名]/
これを実行してみると、どうでしょう。
そんなパスは存在しないと、エラーになってしまいました。
aws cliでは、S3へのファイル転送において、ファイル指定の中で、ワイルドカード(*)を使えません。
では、どうすればいいのでしょうか。
ポイント2『複数のファイルを指定する時はexcludeとincludeを使う』
そこで、オプションを使います。excludeとincludeです。
excludeとincludeでは、ワイルドカードを使うことが可能です。excludeでは転送から除外したいファイルまたはファイル群を、includeでは転送に含めたいファイルまたはファイル群を指定します。
この説明では、少し分かりづらいと思うので、具体的な例を見てみましょう。
以下のようなファイルがあるフォルダから、test*.htmlだけを送りたいとします。
この場合は、以下のような指定をします。
aws s3 cp test s3://[バケット名]/ --recursive --exclude "*" --include "test*.html"
実行例
この例では、testフォルダにあるファイルを対象外にするが、その中でtest*.htmlのファイルは転送対象にする、という指定をしています。
なお、この例の場合では、includeのオプションのみの指定をしたくなりますが、includeの指定のみで実行するとエラーになるため注意してください。
実行例
今回の例で使っているフォルダでは、htmlとtxtのファイルしかないため、txtファイルを対象外にする、という指定だけでもOKです。
aws s3 cp test s3://[バケット名]/ --recursive --exclude "*.txt"
この例では、testフォルダにあるファイル全部の中から、*.txtのファイル以外全部を転送対象としています。
実行例
ここからさらに、test.htmlとtest1.txtの両方を送りたい場合は、以下のような指定をします。
aws s3 cp test s3://[バケット名]/ --recursive --exclude "*.txt" --include "test1*.txt"
この例では、testフォルダにあるファイル全部の中から、.txtのファイル以外全部を対象外にするが、test1.txtは対象外にしない、といった指定をしています。
実行例
最初は指定の仕方に戸惑うかも知れませんが、上記の実行例を参考に、試してみてください。
ポイント3『フォルダの中身を再帰的に送信する』
先程から、コマンドの実行オプションに、–recursiveという指定をしています。
Linuxのcpコマンドなどでもおなじみの、再帰的にディレクトリをコピーするオプションです。つまり、指定したフォルダの中にあるフォルダ・ファイルすべてが転送されます。
先ほどのフォルダに、htmlというフォルダを作ってコピーを実行すると、htmlフォルダの中身までコピーが実行されます。
aws s3 cp test s3://[バケット名]/ --recursive
実行例
–excludeと–includeオプションを使って、コピーするファイルを限定することも可能です。
しかし、この場合、inculdeで指せるのは単一フォルダのファイルのみのため、複数フォルダのファイルを対象にする場合は、以下のようにincludeオプションを並べて記述する必要があります。
s3 cp test s3://[バケット名]/ --recursive --exclude "*" --include "test*.html" --include "html\test*.html"
実行例
ポイント4『ファイルの同期はsyncを使う』
ここまで、ファイルの転送にcpコマンドを使いましたが、Linuxのrsyncように、同期のコマンドも用意されています。
cpの部分をsyncにするだけで、ローカルのフォルダとS3のファイルを同期させることができます。
aws s3 sync test s3://[バケット名]/
実行例
syncの時は–recursiveの指定をせずとも、再帰的に同期が行われます。
削除したファイルの情報も同期したい場合、rsyncなどと同様に、–deleteオプションを付けることで、削除情報も同期されます。
aws s3 sync test s3://[バケット名]/ --delete
実行例
おわりに
S3は、ファイルのバックアップなどで利用するのに便利ですが、ファイルの転送でコマンドラインを使う際は、少しコマンドを使う時にオプション指定に特徴があります。
公式ドキュメントにも、コマンドの実行例が示されていますので、こちらも参考に、良きS3ライフを!