はじめに
前回の内容
前回の記事ではAWS CLIの導入から、基本的な使い方を記載しました。
また、実際にAWS CLIをスクリプトでどのように使用できるかサンプルとともに説明しました。
今回の内容
今回は前回の基本の部分から少し踏み込んで、より詳細なS3の操作を可能にするオプション、APIレベルコマンドについて説明します。
オプションに関しては前回の記事のサンプルでしれっと登場しています。
高レベルコマンドを使用するにあたって基本的には必要不可欠なものである一方で、使い慣れると便利なものでもあります。APIレベルコマンドは高レベルコマンドだけではアクセスできない、もしくは扱いづらいデータ形式のときに役に立ちます。
AWS CLI コマンドラインオプションとは
なぜAWS CLI コマンドラインオプション・APIレベルコマンドを使うのか
上記のオプションやAPIレベルコマンドを使う理由はずばり「便利だから」です。しかし、それだけでは「どう便利なのか?」の実感が持てないと思うので、ここから具体例を用いて例を挙げて説明します。
例えばS3に複数のファイルオブジェクトが下記の様に配置されていたとします。
- バケット名:my-bucket
- 操作対象ファイル:my-prefix/no1/の配下にあるファイル群
my-bucket
└─my-prefix
├─no1
│ ├─bin
│ │ ├─text_1.tsv
│ │ └─picture_1.png
│ └─text_2.txt
│ └─text_3.csv
│ └─picture_2.png
└─no2
操作対象のファイルの情報を取得する際場合、ls
コマンドを使用すれば格納ファイルの情報を取得できることは前回記事で言及した通りです。実際には下記の様なコマンド記述でデータを取得できます。
aws s3 ls s3://my-bucket/my-prefix/no1/
上記で取得できる情報は以下の情報がファイルごとに文字列形式で記述されたリストです。
- 最終更新日:ファイルが作成、上書きされた最新の日時
- サイズ:byte単位のファイルサイズ
- パス:指定したプレフィックス以降のファイル名を含むパス
上記のコマンドの結果は以下のようになります。
PRE bin/
2024-01-10 10:00:00 100 text_2.txt
2024-01-10 10:00:00 110 text_3.csv
2024-01-10 10:00:00 1120 picture_2.png
プレフィックスmy-bucket/my-prefix/no1/ 直下のオブジェクト情報を取得できていますね。
ここからが本題ですが、上記のファイル配置においてテキストファイル(.txt, .csv, .tsv)の情報だけがほしい場合はどうしたらよいでしょうか?
また、最終更新日が~月~日以降などでファイルを取得したい場合はどうしたらよいでしょうか?
これに対する回答がオプションやAPIレベルコマンドを使用する理由となります。
逆に言うと、これらの詳細な条件指定などができるのがオプションやAPIレベルコマンドの持つ機能的役割です。
AWS CLI コマンドラインオプションについて
AWS CLIコマンドラインオプションについては公式から下記の様に説明されています。
AWS CLI で、コマンドラインオプションはグローバルパラメータであり、デフォルトの設定、対応するプロファイル設定、単一のコマンドの環境変数設定を上書きできます。
上記だと少しわかりづらいですが、コマンドの操作の詳細設定・詳細指定をできるもの、くらいの認識で大丈夫かと思います。
実際のオプション指定の方法ですが、コマンドの後にそのコマンドで使用できるオプションを--
のあとに記載するだけです。 前回のおさらいですが、AWS CLIコマンドの文法は以下のようになっています。
aws <s3|s3api> <サブコマンド> [オプション] [引数]
実際の例は下記の様な感じになります。
aws s3 cp --exclude "*.txt"
上記例だと--exclude
がオプションで、“*.txt” が引数に当たります。
よく使うコマンドラインオプション
個人的によく使うコマンドラインオプションを上げてみました。s3コマンド(aws s3 <サブコマンド>
)を使用する前提で、前回の記事で紹介した下記のサブコマンドがどのオプションで使用できるかをまとめています(グローバルオプションと個別のコマンドのオプションを区別せずに列挙していますが平にご容赦を)。 S3コマンドの詳細情報は下記公式ページにまとまっています。
cf. AWS CLI Command Reference S3
対象となるサブコマンド
ls, cp, mv, rm, sync
–recursive
このオプションを使用できるコマンド:
ls, cp, mv, rm
説明:
指定したプレフィックスのフォルダの配下も含めて再帰的に走査するオプション
サンプル:
aws s3 ls s3://my-bucket/my-prefix/no1/ --recursive
サンプルの実行結果:
2024-01-20 15:00:00 0 bin/
2024-01-20 15:30:00 80 bin/text_1.tsv
2024-01-20 15:30:00 820 bin/picture_1.png
2024-01-10 10:00:00 100 text_2.txt
2024-01-10 10:00:00 110 text_3.csv
2024-01-10 10:00:00 1120 picture_2.png
–dryrun
このオプションを使用できるコマンド:
cp, mv, rm, sync
説明:
実際の実行前にコマンドが実行された際の結果を表示する
サンプル:
aws s3 rm s3://my-bucket/my-prefix/no1/text_2.txt --dryrun
サンプルの実行結果:
(dryrun) delete: s3://my-bucket/my-prefix/no1/text_2.txt
–exclude / –include
このオプションを使用できるコマンド:
ls, cp, mv, rm
説明:
プレフィックス、ファイル名を文字列のパターンマッチで指定する。
正規表現一致ではないため、限定的な機能であることに注意。
1つのコマンドで複数回記述することができ、後に指定した条件が優先される仕様。--include
はデフォルト設定ですべて(”*”)になっているため、 --exclude
とともに指定しないと、機能しないことに注意。詳細は下記リンクを参照。
cf. AWS CLI Command Reference S3 – Use of Exclude and Include Filters
サンプル:
aws s3 ls s3://my-bucket/my-prefix/no1/ --exclude "*" --include "text*"
サンプルの実行結果:
2024-01-10 10:00:00 100 text_2.txt
2024-01-10 10:00:00 110 text_3.csv
–exact-timestamps
このオプションを使用できるコマンド:
sync
説明:
syncコマンドで同期する際、同期元と同期先のファイルがtimestampで一致したときに同期をしないという条件を加える。
このコマンドがない場合は、同期元と同期先でファイルサイズが同じであれば同期されない。sync処理でファイル内のデータが変更されたが、ファイルサイズは変わらない場合は最終更新日が同期先と異なるはずなので、そのようなケースの場合には必須。
サンプル:
aws s3 rm s3://my-bucket/my-prefix/no1/text_2.txt --dryrun
–output
このオプションを使用できるコマンド:
ls, cp, mv, rm, sync
説明:
コマンド実行結果のフォーマット(text, json, yaml etc..)を変更・指定する。取得したデータのアウトプットを整形しやすいようにフォーマットを変更できる。
–query
このオプションを使用できるコマンド:
ls, cp, mv, rm, sync
説明:
クライアント側でJSONベースのフィルター処理ができる。JMESPathというクエリ方式を採用している。
下記を参照。
cf. JMESPath Specification
APIレベルコマンドとは
APIレベルコマンドについて
前述では高レベルコマンドについて言及してきましたが、高レベルコマンドでは痒いところに手が届かないときがあります。そういう場合はAPIレベルコマンドを使用します。
例えばaws s3 ls
コマンドの出力は各ファイルのメタ情報(最終更新日、ファイルサイズ、ファイル名)が連なった文字列となっています。このとき「最終更新日」に情報が格納されているキーバリューペアのような構造を持っていないため、連なった文字列から条件部を抽出して指定することになります。APIレベルコマンドを使用しない方法もありますが少しやりづらく、やや不確実性があります。
そういう時にAPIレベルのコマンドを使用すると、yamlやjson形式でデータを取り出すことができ、処理をスムーズに記述することができます。
S3のAPIレベルコマンド
S3のAPIレベルコマンド自体はいくつもありますが、今回業務内で使用したAPIレベルコマンドは下記のみです。詳細については公式のドキュメントを参照してみてください。
組み合わせによってはバケットライフサイクルの管理なども可能だそうです。
cf. AWS CLI Command Reference S3api
cf. Amazon S3 バケットライフサイクルオペレーションのスクリプト例
list-objects
サンプル:
aws s3api list-objects --bucket my-bucket --prefix my-prefix/no1/
説明:
各ファイルに紐づくメタ情報が構造化された状態で取得できる。--output
の形式をJSONなどにしておくと、JSONとして構造化された情報にアクセスできる。
下記の様なメタ情報を取得できる
取得できるメタ情報
Key:プレフィックスを含むファイル名
LastModified:最終更新日時
Etag:??
StorageClass:ストレージクラス
Size:ファイルサイズ
Owner:オーナー情報
具体的なユースケース
上記のコマンドラインオプションとAPIレベルコマンドで実際どのような処理ができるかのユースケースを記載しました。今回の内容と前回の内容を合わせるとより詳細なS3の操作を元にシステムの制御を行うことが可能になるかと思います。
- プレフィックス
my-bucket/my-prefix/no1/
から.pngファイルのみを削除
aws s3 rm s3://my-bucket/my-prefix/no1/ --recursive --exclude "*" --include "*.png"
- プレフィックスmy-bucket/my-prefix/no1/ からpictureから始まるファイルのみを削除(ソースディレクトリを基準に評価されることに注意)
aws s3 rm s3://my-bucket/my-prefix/no1/ --recursive --exclude "*" --include "picture*" --include "*/picture*"
- 最終更新日時が2024年以降のファイル情報だけ取得して、後続の処理のためにJSON形式で出力する
aws s3api list-objects `
--bucket my-bucket `
--prefix my-prefix/no1/ `
--query 'Contents[?LastModified >= `2024-01-01T00:00:00`]' `
--output "json"
おわりに
今回は前回に比べると蛇足的な内容でしたが、AWS CLIを組み込む際にできることを考える上では知っておいた方が良い内容かと思います。
また個人的に手を動かしてなんとなくわかった部分であり、調べるのに結構時間がかかった部分でもあります。
何かの参考になれば幸いです。
参考リンク
include / excludeオプションについて
s3api list-objectsについて
データ活用でお困りの方へ
私たちDX-Accelerator事業では、データ活用についての様々なスキルを持った人材が常駐でデータ活用支援を行うサービスを提供しています。
当事業はローンチから約3年(24年9月時点)ですが、これまでに様々な業界・業種のお客さまのお手伝いをさせていただいております。
少しでも興味を持ってくださったり、すでにご相談をしたいことがある方はお気軽にご相談ください。現在あなたの組織のフェーズがどこにあるかは関係ありません。まずはお話をしましょう。
もう少しサービスについて知りたい方はサービス紹介資料もご用意しています。
お役立ち資料をご活用ください!
データプロフェッショナルであるDXAメンバーが、業務経験をもとにお役立ち資料を作成しています!
おすすめ3選はこちら!
1.GA4 サンプルレポート|Looker Studio 無料プレゼント
GA4の基本KPIが網羅されたテンプレートです!データを差し替えればすぐにご活用いただけます。
2.サンプル経営ダッシュボード | Tableau無料プレゼント
実際にご提供しているダッシュボードをテンプレート化したものです!是非構成やグラフ選択の参考にしてください。
3.データ活用の部長さん必見!データ活用 内製化の正しい進め方
これまでご支援してきた実績をもとに、データ活用の内製化の進め方を解説しています!組織のDXを担われている方、必読です!
以上、おすすめ3選でした!
すべて無料でダウンロードできますので、お気軽にご利用ください。