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

AWS運用自動化サービス「Cloud Automator」

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

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

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

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

実行例

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

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

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

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

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

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

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

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

実行例

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

実行例

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

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

実行例

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

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

実行例

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

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

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

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

実行例

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

実行例

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

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

実行例

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

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

実行例

おわりに

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

AWS運用自動化サービス「Cloud Automator」