BioErrorLog Tech Blog

試行錯誤の記録

aws s3 cpコマンドで標準入出力をデータ出力/入力先に指定する | AWS CLI

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ではありますが、パイプもうまく利用すればなかなか強力な手段になると思います。

どなたかの役に立てば幸いです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

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