AWS CLIのs3 cp
コマンドにて、データの出力/入力先に標準入出力を指定する方法の備忘録です。
はじめに
こんにちは、@bioerrorlogです。
AWS CLIのs3 cpコマンドは、s3のオブジェクトをコピーできる便利なコマンドです。 主に以下のようにして使います。
aws s3 cp [コピー元 localパス/S3 URI] [コピー先 localパス/S3 URI]
先日、このコピー元/コピー先のパスとして、標準入出力を指定できることを知りました。
今回は、そのやり方をメモします。
環境
今回の作業環境は以下です:
aws-cli: 2.1.16
OS: Amazon Linux 2
cpコマンドで標準入出力を活用する
標準入出力の指定方法
まず結論から、コピー元/コピー先のパスに標準入出力を指定するには -
を指定します。
例えば、S3上のオブジェクトの中身を標準出力に表示するには以下のようなコマンドを実行します。
aws s3 cp s3://bucket-name/object.txt -
ドキュメントにも、以下のように記載されています。
標準入力:
The following cp command uploads a local file stream from standard input to a specified bucket and key:
aws s3 cp - s3://mybucket/stream.txt
標準出力:
The following cp command downloads an S3 object locally as a stream to standard output. Downloading as a stream is not currently compatible with the --recursive parameter:
aws s3 cp s3://mybucket/stream.txt -
上記にも記載があるように、--recursive
パラメータを指定して標準出力にデータを出力することはできませんので、そこは注意が必要です。
具体例
では、実際にいくつか利用例を示します。
まず、単純にS3オブジェクト内容を標準出力に表示させまてみます。
$ aws s3 cp s3://target-bucket-001/abc.txt -
aaa
bbb
ccc
S3に配置したファイル内容がそのまま標準出力に表示されました。
標準入出力を使えるということは、パイプで別コマンドと自由に処理をつなげることもできます。
$ aws s3 cp s3://target-bucket-001/abc.txt.gz - | gunzip | grep "ccc" ccc
上記コマンド例では、gzip圧縮されたS3ファイルを解凍->検索しています。
パイプでS3オブジェクトの出力->入力を繋げれば、1ラインでS3に再格納することもできます。
$ aws s3 cp s3://target-bucket-001/abc.txt.gz - | gunzip | aws s3 cp - s3://target-bucket-001/gunzip_abc.txt
このように、標準入出力を利用して自由にファイルを処理出来ます。
おわりに
今回は、aws s3 cp
コマンドで標準入出力を利用する方法を簡単にメモしました。
ちょっとしたTipsではありますが、パイプもうまく利用すればなかなか強力な手段になると思います。
どなたかの役に立てば幸いです。
[関連記事]
参考
cp — AWS CLI 1.25.76 Command Reference
AWS Command line: S3 content from stdin or to stdout
amazon web services - How to use AWS S3 CLI to dump files to stdout in BASH? - Stack Overflow