カテゴリー
【AWS-CLI】s3 syncコマンドのexclude/includeオプションを使って上手くサブフォルダーの中身をアップロードする
※ 当ページには【広告/PR】を含む場合があります。
2020/10/03
2024/01/05
AWS S3のファイルの中身を
特に、更新のあったファイルだけを自動で更新してくれる
s3 sync
ユーザー側できめ細かいファイル管理を利用する際に使う
「aws s3 sync」コマンドでS3バケットへ出し入れするファイルを細かく制御する
この記事も執筆したての時点では
なお、「aws s3 sync」コマンドに関しては、v1からv2への移行で用法の目立った違いはありません。
特に意識することなく、そのまま利用可能です。
以降では、「aws sync」コマンドの使いこなしのキモとなる「--exclude/--include」オプションの使い方を詳しくみていきます。
シェルコマンドを文字列から実行するテクニック
本題に入る前に頭に入れておいたほうが良い予備知識からお話しておきましょう。
特に
文字列を実行可能なコマンドとして扱うテクニックは以下の記事に移しましたので、不明な点はそちらでご確認ください。
結論だけいうと、
「aws s3 sync」コマンドのテストにはドライランを使おう
通常、「aws sync」コマンドは、変更のあったファイルを根こそぎ書き換えてしまう破壊的な操作になります。
迂闊に叩いてしまったがために、S3バケットのデータを意図せず消してしまったり、ローカルの編集途中であったファイルが失われたりと、場合によっては取り返しのつかない自体になるかもしれません。
ローカルのフォルダとS3バケットを最初に同期させるときに、どのような結果になるのか、事前にシミュレートするコマンドオプションが、
同期結果に少しでも不安を感じたら、本番実行前にこのオプションで実際に問題ないか確認することが可能です。
「aws s3 sync」コマンドの--exclude/--includeのフィルター制御
aws-cliのいくつかのコマンドのうち、操作の対象となるファイルをフィルタリングするための簡素な書式が用意されています。
見てのように、正規表現などの強力なツールなどとは比べ物にならないくらいの貧弱な機能しかありません。--exclude/--includeのフィルター制御やフォルダを粒度細かくフィルター制御する場合には、
--exclude
--include
$ aws sync --exclude "*" --include "*.png" --include "hoge/*.txt" --include "piyo/*.txt"
上記のコマンドが推奨される使い方の一例です。
一旦全てのファイルを
--exclude "*"
--include
--exclude
--include
場合によっては引数が長くなるので、一旦コマンドを文字列に落とし込んでから、その文字列をコマンドを実行するような場合に、上の節で説明したような
eval
たとえば以下の例では、ルートフォルダにある
index.html
#!/bin/bash
#👇アップロード対象となるローカルのフォルダ
DIST_FOLDER_PATH=/path/to/dist/folder
#👇アップロード先のS3バケットのアドレス
S3_BUCKET_PATH=s3://your-bucket.online/
subfolders=(${1//,/ })
for subfolder in "${subfolders[@]}"; do
include_option="${include_option} --include '${subfolder}/*'"
done
include_option="aws s3 sync ${DIST_FOLDER_PATH} ${S3_BUCKET_PATH} --exclude '*' --include 'index.html' ${include_option}"
eval ${include_option}
サブフォルダの指定には、フォルダの名前をコンマ刻みの文字列で与え、引数で渡しています。
この引数を元に
aws sync
eval
試しに、ルート直下にある
hoge
piyo
fuga
$ ./aws_sync.sh hoge,piyo,fuga
aws s3 sync /path/to/dist/folder s3://your-bucket.online/ --exclude '*' --include 'index.html' --include 'hoge/*' --include 'piyo/*' --include 'fuga/*'
#...同期アップロードが始まる
今回は簡単なスクリプトの例を示しました。
もっと複雑なアップロードが行いたければ、テキストファイルでホワイトリストを作成しておいて、
grep
色々と応用の幅が広がりますが、今回はあまり深入りしないでおこうと思います。
まとめ
以上、「aws s3 sync」の細かいファイル選択のフィルター制御のネタを詳しく説明していきました。
個人的には鳴り物入りで出てきた「aws cli v2」だったので、「rsync」コマンド並みにパワーアップして利用できるのかと思ってましたが、表面上はv1時代のものをほぼ引き継いた形になっているようです。。。
ここらへんは、機能性よりも扱いやすさを重視されていると思い、良しとしましょう。
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー