見出し画像

標準出入力を用いた aws s3 実践コマンド集

こんにちは、くるふとです。
ナビタイムジャパンでは時刻表 API ・地図描画 API の CI/CD 改善を主に担当しています。

今回は AWS CLI の s3 コマンドと標準入出力を組み合わせたコマンド例をいくつか紹介したいと思っております。

aws s3 コマンドを利用する際によくあること

aws s3 コマンドを利用する際、下記のようなコマンドを書くことがあると思います。

# ローカルのファイル群を圧縮し、 s3 バケットにアップロードする
$ ls sample/
a.txt  b.txt  c.txt
$ tar -zcvf ./sample.tgz sample/
a sample
a sample/c.txt
a sample/b.txt
a sample/a.txt
$ aws s3 cp ./sample.tgz s3://sample-bucket/sample.tgz

# s3 バケット内のシェルスクリプトを取得し、ローカル上で実行する
$ aws s3 cp s3://sample-bucket/sample.sh ./sample.sh
$ chmod 755 ./sample.sh
$ ./sample.sh

上記のようなコマンドを書く際に、以下のような点がネックとなります。

  • コマンドが複数行にわたりやや複雑になってしまう

  • ローカルに不要なファイルが残ってしまう

実は、これらのコマンドは標準入出力を用いて下記のように書き換えることが可能になります。

# ローカルのファイル群を圧縮し、 s3 バケットにアップロードする
$ ls sample/
a.txt  b.txt  c.txt
$ tar -zcvf - sample/ | aws s3 cp - s3://sample-bucket/sample.tgz

# s3 バケット内のシェルスクリプトを取得し、ローカル上で実行する
$ aws s3 cp s3://sample-bucket/sample.sh - | bash

実装がシンプル且つローカルに不要なファイルが残らないようになっています。
今回はこのような標準入出力を用いた AWS CLI のコマンド集を紹介させていただきます。

bash の標準入出力について

紹介の前にまず、 bash における標準入出力の使い方について簡単に紹介したいと思います。
bash では「-」(ハイフン)を用いることによって標準入力、あるいは標準出力として扱うことができます。
以下は「-」(ハイフン)を用いた bash コマンドの例となります。

# --output-document オプションに - を指定してレスポンスの中身を標準出力に渡す
$ wget --quiet --output-document - https://httpstat.us/200
200 OK

# 標準出力を diff コマンドに渡して比較する
$ echo "Hello W0rld!" | diff -u ./hello.txt -
--- ./hello.txt 2023-06-15 19:00:14.000000000 +0900
+++ -   2023-06-21 17:57:41.000000000 +0900
@@ -1 +1 @@
-Hello World!
+Hello W0rld!

上記のような「-」(ハイフン)を用いた方法は AWS CLI でも利用することができます。今回はそちらの Tips をいくつか紹介していきたいと思います。

aws s3 実践コマンド集

AWS CLI s3 コマンドでも、「-」(ハイフン)を用いた機能が提供されています。
AWS CLI 公式ドキュメント(cp コマンド)

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

Amazon Web Services
cp — AWS CLI 2.12.1 コマンドリファレンス
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/cp.html

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 -

Amazon Web Services
cp — AWS CLI 2.12.1 コマンドリファレンス
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/cp.html

この機能を利用したコマンド例をいくつか紹介いたします。

s3 バケット上のオブジェクトの中身を出力する

$ aws s3 cp <s3_path> -

例)バケット内のテキストファイルを出力
$ aws s3 cp s3://sample-bucket/sample.txt -
sample text.

標準出力を s3 バケット内にオブジェクトとして保存する

$ echo "hogehoge" | aws s3 cp - <s3_path>

例1)標準出力を s3 バケット内に保存する
$ echo "sample text." | aws s3 cp - s3://sample-bucket/sample.txt

例2)シェルスクリプトの標準出力を s3 バケット内に保存する
$ ./hoge.sh | aws s3 cp - s3://sample-bucket/hoge.log

ローカルディレクトリ内のファイル群を tgz 形式に圧縮した状態で s3 バケット内に保存する

$ tar -zcvf - <target_path> | aws s3 cp - <s3_path>

例)sample ディレクトリ配下のテキストファイルを tgz 形式に圧縮し s3 バケット内に保存する
$ ls sample/
a.txt  b.txt  c.txt
$ tar -zcvf - sample/ | aws s3 cp - s3://sample-bucket/sample.tgz

s3 バケット内の tgz 圧縮ファイルを解凍した状態でローカルに配置する

$ aws s3 cp <s3_path> - | tar -zxf -

例)s3 バケット内の tgz 形式ファイルを解凍してローカルに配置する
$ aws s3 cp s3://sample-bucket/sample.tgz - | tar -zxf -

s3 バケット内のオブジェクトの MD5 ハッシュ値を取得する

$ aws s3 cp <s3_path> - | md5sum

例)s3 バケット内のテキストファイルの MD5 ハッシュ値を取得する
$ aws s3 cp s3://sample-bucket/sample.txt - | md5sum
41d0489a1fbd69eb6071daed5c622496  -

s3 バケット内のシェルスクリプトを実行する

$ aws s3 cp <s3_path> - | bash # 引数なし
$ aws s3 cp <s3_path> - | bash -s -- <arg> #引数あり

例)バケット内のシェルスクリプトを標準出力を介して実行する
$ cat sample.sh
#!/bin/bash
set -euo pipefail

function main() {
    local arg="$1"
    echo "This is ${arg}."
}

main "$@"

$ aws s3 cp s3://sample-bucket/sample.sh - | bash -s -- "bash script"
This is bash script.

まとめ

今回紹介したコマンド例を利用することによって以下のメリットを享受することができます。

  • コマンドの実装をシンプルにできる

    • 複数行にわたるコマンドを1~2行で実装できる

  • tmp ファイル用を作成する必要がなくなる

    • 実行環境をクリーンな状態に保てる

s3 を AWS CLI 経由で操作する際は、是非今回の内容を活用してみてください。