AWS CLIのS3へのファイル転送コマンドとオプションのポイント

記事タイトルとURLをコピーする

技術四課の鎌田(裕)です。

S3へのログファイルの転送に、AWS CLIやをお使いになることを検討される方は多いことでしょう。
aws s3 cpのコマンドでファイルをS3にコピーは出来る訳ですが、Linuxのcpコマンドを同じ感覚で指定すると、上手くコピーが出来ません。
どんなポイントがあるでしょうか。見て行きましょう。

ポイント1『ファイル名の指定でワイルドカード(*)を使えない』

AWSのコマンドラインツールで、ファイルをS3にコピーしたい時は、以下のようなイメージになります。ファイルを1つだけ送る場合です。

aws s3 cp [送りたいファイル名] s3://[バケット名]/

実行例

f:id:cmpokuma:20200508100816p:plain

これを、複数のファイルで送りたい場合、以下のような指定をしたくなりますね。

aws s3 cp *.txt s3://[バケット名]/

これを実行してみると、どうでしょう。

f:id:cmpokuma:20200508101016p:plain

そんなパスは存在しないと、エラーになってしまいました。

aws cliでは、S3へのファイル転送において、ファイル指定の中で、ワイルドカード(*)を使えません。
では、どうすればいいのでしょうか。

ポイント2『複数のファイルを指定する時はexcludeとincludeを使う』

そこで、オプションを使います。excludeとincludeです。
excludeとincludeでは、ワイルドカードを使うことが可能です。excludeでは転送から除外したいファイルまたはファイル群を、includeでは転送に含めたいファイルまたはファイル群を指定します。

この説明では、少し分かりづらいと思うので、具体的な例を見てみましょう。
以下のようなファイルがあるフォルダから、test*.htmlだけを送りたいとします。

f:id:cmpokuma:20200508101128p:plain

この場合は、以下のような指定をします。

aws s3 cp test s3://[バケット名]/ --recursive --exclude "*" --include "test*.html"

実行例

f:id:cmpokuma:20200508101418p:plain

この例では、testフォルダにあるファイルを対象外にするが、その中でtest*.htmlのファイルは転送対象にする、という指定をしています。
なお、この例の場合では、includeのオプションのみの指定をしたくなりますが、includeの指定のみで実行するとエラーになるため注意してください。

実行例

f:id:cmpokuma:20200508101500p:plain

今回の例で使っているフォルダでは、htmlとtxtのファイルしかないため、txtファイルを対象外にする、という指定だけでもOKです。

aws s3 cp test s3://[バケット名]/ --recursive --exclude "*.txt"

この例では、testフォルダにあるファイル全部の中から、*.txtのファイル以外全部を転送対象としています。

実行例

f:id:cmpokuma:20200508101635p:plain

ここからさらに、test.htmlとtest1.txtの両方を送りたい場合は、以下のような指定をします。

aws s3 cp test s3://[バケット名]/ --recursive --exclude "*.txt" --include "test1*.txt"

この例では、testフォルダにあるファイル全部の中から、.txtのファイル以外全部を対象外にするが、test1.txtは対象外にしない、といった指定をしています。

実行例

f:id:cmpokuma:20200508101909p:plain

最初は指定の仕方に戸惑うかも知れませんが、上記の実行例を参考に、試してみてください。

ポイント3『フォルダの中身を再帰的に送信する』

先程から、コマンドの実行オプションに、–recursiveという指定をしています。
Linuxのcpコマンドなどでもおなじみの、再帰的にディレクトリをコピーするオプションです。つまり、指定したフォルダの中にあるフォルダ・ファイルすべてが転送されます。

先ほどのフォルダに、htmlというフォルダを作ってコピーを実行すると、htmlフォルダの中身までコピーが実行されます。

aws s3 cp test s3://[バケット名]/ --recursive 

実行例

f:id:cmpokuma:20200508102932p:plain

–excludeと–includeオプションを使って、コピーするファイルを限定することも可能です。
しかし、この場合、inculdeで指せるのは単一フォルダのファイルのみのため、複数フォルダのファイルを対象にする場合は、以下のようにincludeオプションを並べて記述する必要があります。

s3 cp test s3://[バケット名]/ --recursive --exclude "*" --include "test*.html" --include "html\test*.html"

実行例

f:id:cmpokuma:20200508103225p:plain

ポイント4『ファイルの同期はsyncを使う』

ここまで、ファイルの転送にcpコマンドを使いましたが、Linuxのrsyncように、同期のコマンドも用意されています。
cpの部分をsyncにするだけで、ローカルのフォルダとS3のファイルを同期させることができます。

aws s3 sync test s3://[バケット名]/

実行例

f:id:cmpokuma:20200508103328p:plain

syncの時は–recursiveの指定をせずとも、再帰的に同期が行われます。

削除したファイルの情報も同期したい場合、rsyncなどと同様に、–deleteオプションを付けることで、削除情報も同期されます。

aws s3 sync test s3://[バケット名]/ --delete

実行例

f:id:cmpokuma:20200508103417p:plain

おわりに

S3は、ファイルのバックアップなどで利用するのに便利ですが、ファイルの転送でコマンドラインを使う際は、少しコマンドを使う時にオプション指定に特徴があります。
公式ドキュメントにも、コマンドの実行例が示されていますので、こちらも参考に、良きS3ライフを!