1. 主要ページへ移動
  2. メニューへ移動
  3. ページ下へ移動

QES ブログ

記事公開日

【AWS】バッチファイル×AWS CLIを使用してS3コピーを自動化

  • このエントリーをはてなブックマークに追加

はじめに

こんにちは。DXソリューション営業本部の金森です。
本記事では、AWS CLIを使用したS3コピー操作をバッチファイルで自動化する方法についてご説明したいと思います。

目的

AWS CLIの使い方が分からない方でもS3コピー操作を使用できるようにバッチファイルで自動化すること。

AWS CLIについて

AWS コマンドラインインターフェイス(AWS CLI)はAWSのサービスを管理するための統合ツールです。ダウンロードおよび設定用の単一のツールのみを使用して、コマンドラインから複数のAWSサービスを制御し、スクリプトを使用してこれらを自動化することができます。
引用元:AWSコマンドラインインターフェイス

 

今回やってみたこと

AWS CLIでのS3コピーをバッチファイルに組み込む

以下のパターンごとに分けてバッチファイルを作成してみました。
1. PCからS3バケットにファイルをコピー
2. PCからS3バケットにフォルダをコピー
3. S3バケットからPCにファイルをコピー
4. S3バケットからPCにフォルダをコピー
5. ファイルかフォルダを自動判別しコピー

構成図

前提条件

・PC(Windows)にAWS CLIをインストール済みであること
・インストール後にAWS CLIの設定が完了していること
・S3バケットが作成されていること
・PC(Windows)~S3間で、インターネット経由でのネットワーク導通が取れていること

1. PCからS3バケットにファイルをコピー

①S3バケットに「s3保存用」の名前でフォルダを作成する
②以下の内容でバッチファイルを作成します
※バッチファイルはShift-JIS形式以外で作成すると文字化けするので注意。

@echo off

REM コピーするファイルのパスを入力させる
set /p sourcepath=コピーするファイルのパスを入力後、Enterを押してください。

REM コピー先のS3バケットURIを入力させる
set /p bucketuri=コピー先S3バケットのフォルダURIを入力後、Enterを押してください。

echo.
echo --------------------
echo コピー元: %sourcepath%
echo コピー先: %bucketuri%
echo --------------------
echo この内容でよろしいですか?(Y/N)
set /p confirm=入力してください:

if /I not "%confirm%"=="Y" (
echo キャンセルしました。
pause
goto :EOF
)

REM 入力されたファイルをS3にコピー
aws s3 cp "%sourcepath%" %bucketuri%

REM 終了コードの確認 AWS CLIコマンドエラー確認
if %ERRORLEVEL% neq 0 (
echo エラーが発生しました。コピー処理をキャンセルします。
pause
exit /b %ERRORLEVEL%
)

echo 正常にコピーが完了しました。

REM コピー先S3バケットのフォルダの中身を表示する
echo コピー先S3バケットのフォルダを表示
aws s3 ls %bucketuri% --recursive
pause

③作成したバッチファイルをダブルクリックして実行する
④コピーするファイルのパスを入力する

⑤コピー先のS3バケットのフォルダURIを入力する

⑥コピー元、コピー先を確認後、「y」を入力し、Enterを押す

⑦実行後は下図のように表示されコピーが完了していることが確認できる


※コピー元、コピー先を確認後に「n」を押すとキャンセルされます。

バッチファイルのコード解説

※REMはコメント文なので説明を割愛いたします。
コマンドの実行結果だけを表示し、コマンド自体は表示しないようにする。

@echo off

set /p は入力を受け取るようにして、sourcepath という変数に、コピー元のファイルパスを格納するようにしている。

set /p sourcepath=コピーするファイルのパスを入力後、Enterを押してください。

同じように、コピー先のS3 URI(例: s3://bucket/folder/)を bucketuri という変数に格納する。

set /p bucketuri=コピー先S3バケットのフォルダURIを入力後、Enterを押してください。

入力した情報を確認するために見やすく整形し、confirm変数に「Y」か「N」を格納するようにする。
※echo.で空白行を表示しています。

echo.
echo --------------------
echo コピー元: %sourcepath%
echo コピー先: %bucketuri%
echo --------------------
echo この内容でよろしいですか?(Y/N)
set /p confirm=入力してください:

入力された値が「Y」でない場合、goto :EOFで処理の実行をキャンセル、echoでメッセージを表示して、pauseで画面が自動で閉じないようにする。
※/Iで大文字と小文字の両方で入力可能

if /I not "%confirm%"=="Y" (
echo キャンセルしました。
pause
goto :EOF
)

AWS CLIの aws s3 cp コマンドで、sourcepathとbucketuri変数を使用してファイルをS3にコピーする。
"%sourcepath%" のようにダブルクォートで囲むことで、ファイルパスにスペースが含まれていても正しく処理されるようになります。

aws s3 cp "%sourcepath%" %bucketuri%

%ERRORLEVEL% は直前のコマンドの終了ステータスを表し、neq 0 は終了ステータスが0以外ならエラーと判断し、
メッセージを表示する。exit /b %ERRORLEVEL%で、バッチファイルの実行を終了し、%ERRORLEVEL% をそのまま返すことで、呼び出し元にエラーコードを伝えることができる。

if %ERRORLEVEL% neq 0 (
echo エラーが発生しました。コピー処理をキャンセルします。
pause
exit /b %ERRORLEVEL%
)

コピーが完了したメッセージを表示する

echo 正常にコピーが完了しました。

aws s3 ls コマンドで、コピー先のS3フォルダの中身を表示する。
※--recursiveオプションを付けることで指定したフォルダ内の中身を全て確認可能

echo コピー先S3バケットのフォルダの中身を表示
aws s3 ls %bucketuri% --recursive
pause

2. PCからS3バケットにフォルダをコピー

①以下の内容でバッチファイルを作成します

@echo off

REM コピーするフォルダのパスを入力させる
set /p sourcepath=コピーするフォルダのパスを入力後、Enterを押してください。

REM コピー先のS3バケットURIを入力させる
set /p bucketuri=コピー先S3バケットのフォルダURIを入力後、Enterを押してください。

echo.
echo --------------------
echo コピー元: %sourcepath%
echo コピー先: %bucketuri%
echo --------------------
echo この内容でよろしいですか?(Y/N)
set /p confirm=入力してください:

if /I not "%confirm%"=="Y" (
echo キャンセルしました。
pause
goto :EOF
)

REM 入力されたフォルダをS3にコピー
aws s3 cp "%sourcepath%" %bucketuri% --recursive

REM 終了コードの確認 AWS CLIコマンドエラー確認
if %ERRORLEVEL% neq 0 (
echo エラーが発生しました。コピー処理をキャンセルします。
pause
exit /b %ERRORLEVEL%
)

echo 正常にコピーが完了しました。

REM コピー先S3バケットのフォルダの中身を表示する
echo コピー先S3バケットのフォルダの中身を表示
aws s3 ls %bucketuri% --recursive
pause

②PC側で以下の構成でフォルダを作成する

③作成したバッチファイルを実行する
④コピーするフォルダのパスを入力する

⑤コピー先のS3バケットのフォルダURIを入力する

⑥コピー元、コピー先を確認後、「y」を入力し、Enterを押す

⑦実行後は下図のように表示されコピーが完了していることが確認できる
kanamori6.png

Tips

コピー先を入力する際に、下図のようにコピーするフォルダ名を末尾に追記することで、親フォルダ名ごとコピーが可能です。

コピーが完了すると下図のようにS3バケットの中身が表示されます。

バッチファイルのコード解説

※重複している部分の説明については割愛いたします。

以下のコード部分では「--recursive」オプションを付けて、フォルダごとコピーする。

aws s3 cp "%sourcepath%" %bucketuri% --recursive

3. S3バケットからPCにファイルをコピー

①以下の内容でバッチファイルを作成する

@echo off

REM コピーするファイルのS3URIを入力させる
set /p bucketuri=コピーするファイルのS3URIを入力後、Enterを押してください。

REM コピー先のパスを入力させる
set /p destinationpath=コピー先のパスを入力後、Enterを押してください。

echo.
echo --------------------
echo コピー元: %bucketuri%
echo コピー先: %destinationpath%
echo --------------------
echo この内容でよろしいですか?(Y/N)
set /p confirm=入力してください:

if /I not "%confirm%"=="Y" (
echo キャンセルしました。
pause
goto :EOF
)

REM 入力されたファイルをコピー
aws s3 cp %bucketuri% "%destinationpath%"

REM 終了コードの確認 AWS CLIコマンドエラー確認
if %ERRORLEVEL% neq 0 (
echo エラーが発生しました。コピー処理をキャンセルします。
pause
exit /b %ERRORLEVEL%
)

echo 正常にコピーが完了しました。
pause

②作成したバッチファイルを実行する
③コピーするファイルのS3URIを入力する

④コピー先のパスを入力する

⑤コピー元、コピー先を確認後、「y」を入力し、Enterを押す

⑥実行後は下図のように表示され、PCのフォルダでもコピーが完了していることが確認できました


4. S3バケットからPCにフォルダをコピー

①以下の内容でバッチファイルを作成する

@echo off

REM コピーするフォルダのS3URIを入力させる
set /p bucketuri=コピーするフォルダのS3URIを入力後、Enterを押してください。

REM コピー先のパスを入力させる
set /p destinationpath=コピー先のパスを入力後、Enterを押してください。

echo.
echo --------------------
echo コピー元: %bucketuri%
echo コピー先: %destinationpath%
echo --------------------
echo この内容でよろしいですか?(Y/N)
set /p confirm=入力してください:

if /I not "%confirm%"=="Y" (
echo キャンセルしました。
pause
goto :EOF
)

REM 入力されたフォルダをコピー
aws s3 cp %bucketuri% "%destinationpath%" --recursive

REM 終了コードの確認 AWS CLIコマンドエラー確認
if %ERRORLEVEL% neq 0 (
echo エラーが発生しました。コピー処理をキャンセルします。
pause
exit /b %ERRORLEVEL%
)

echo 正常にコピーが完了しました。
pause

②S3バケットに以下の構成でフォルダを作成する

③作成したバッチファイルを実行する
④コピーするフォルダのS3URIを入力する

⑤コピー先のパスを入力する

⑥コピー元、コピー先を確認後、「y」を入力し、Enterを押す

⑦実行後は下図のように表示され、PCのフォルダでもコピーが完了していることが確認できました


親フォルダ名ごとコピーしたい場合は、「2. PCからS3バケットにフォルダをコピー」でのTipsと同じように、コピー先を入力する際にコピーするフォルダ名を末尾に追記することで可能となります。

5. ファイルかフォルダを自動判別しコピー

PCからS3へコピー

①以下の内容でバッチファイルを作成する

@echo off

REM コピーするフォルダまたはファイルのパスを入力させる
set /p sourcepath=コピーするフォルダのパスまたはファイルのパスを入力後、Enterを押してください。

REM コピー先のS3バケットURIを入力する
set /p bucketuri=コピー先S3バケットのフォルダURIを入力後、Enterを押してください。

echo.
echo --------------------
echo コピー元: %sourcepath%
echo コピー先: %bucketuri%
echo --------------------
echo この内容でよろしいですか?(Y/N)
set /p confirm=入力してください:

if /I not "%confirm%"=="Y" (
echo キャンセルしました。
pause
goto :EOF
)

REM コピー元がフォルダかファイルかを判定
if exist "%sourcepath%\*" (
echo フォルダが指定されました。フォルダ配下全てS3にコピーします。
aws s3 cp "%sourcepath%" %bucketuri% --recursive
) else (
echo ファイルが指定されました。単一ファイルをS3にコピーします。
aws s3 cp "%sourcepath%" %bucketuri%
)

REM 終了コードの確認 AWS CLIコマンドエラー確認
if %ERRORLEVEL% neq 0 (
echo エラーが発生しました。コピー処理をキャンセルします。
pause
exit /b %ERRORLEVEL%
)

echo 正常にコピーが完了しました。

REM コピー先S3バケットのフォルダの中身を表示する
echo コピー先S3バケットのフォルダの中身を表示
aws s3 ls %bucketuri% --recursive
pause

②作成したバッチファイルを実行する
③コピー元がファイルの場合は下図のようになり

④コピー元がフォルダの場合は下図のようになる

バッチファイルのコード解説

※重複している部分の説明については割愛いたします。

"%sourcepath%\*"でフォルダかファイルかを判定し、フォルダがある場合のメッセージ表示とコピーをする。

if exist "%sourcepath%\*"(
echo フォルダが指定されました。フォルダ配下全てS3にコピーします。
aws s3 cp "%sourcepath%" %bucketuri% --recursive

それ以外の場合はファイルと判定し、ファイルがある場合のメッセージ表示とコピーをする。

) else (
echo ファイルが指定されました。単一ファイルをS3にコピーします。
aws s3 cp "%sourcepath%" %bucketuri%
)

S3からPCへコピー

①以下の内容でバッチファイルを作成する

@echo off

REM コピーするフォルダまたはファイルのS3URIを入力させる
set /p bucketuri=コピーするフォルダまたはファイルのS3URIを入力後、Enterを押してください。

REM コピー先のパスを入力させる
set /p destinationpath=コピー先のパスを入力後、Enterを押してください。

echo.
echo --------------------
echo コピー元: %bucketuri%
echo コピー先: %destinationpath%
echo --------------------
echo この内容でよろしいですか?(Y/N)
set /p confirm=入力してください:

if /I not "%confirm%"=="Y" (
echo キャンセルしました。
pause
goto :EOF
)

REM コピー元がフォルダかファイルかを判定
set "lastchar=%bucketuri:~-1%"

if "%lastchar%"--"/" (
echo フォルダが指定されました。フォルダ配下全てコピーします。
aws s3 cp %bucketuri% "%destinationpath%" --recursive
) else (
echo ファイルが指定されました。単一ファイルをコピーします。
aws s3 cp %bucketuri% "%destinationpath%"
)

REM 終了コードの確認 AWS CLIコマンドエラー確認
if %ERRORLEVEL% neq 0 (
echo エラーが発生しました。コピー処理をキャンセルします。
pause
exit /b %ERRORLEVEL%
)

echo 正常にコピーが完了しました。
pause

②作成したバッチファイルを実行する
③コピー元がファイルの場合は下図のようになり

④コピー元がフォルダの場合は下図のようになる

バッチファイルのコード解説

※重複している部分の説明については割愛いたします。

bucketuriの末尾1文字をlastcharという変数に格納している。

set "%lastchar=%bucketuri:~-1%"

lastcharが「/」ならフォルダと判定し、フォルダがある場合のメッセージ表示とコピーをする。

if "%lastchar%"=="/" (
echo フォルダが指定されました。フォルダ配下全てをコピーします。
aws s3 cp %bucketuri% "%destinationpath%" --recursive

それ以外の場合はファイルと判定し、ファイルが場合のメッセージ表示とコピーをする。

) else (
echo ファイルが指定されました。単一ファイルをコピーします。
aws s3 cp %bucketuri% "%destinationpath%"
)

まとめ

今回はAWS CLIを使用したS3コピー操作をバッチファイルで自動化する方法について紹介しました。バッチファイルに組み込むことでAWS CLIコマンドが分からない方でもS3コピー操作が可能になるかと思います。

最後に「このサービスについて知りたい」「AWS環境の構築、移行」などのリクエストがございましたら、弊社
お問合せフォームまでお気軽にご連絡ください! のちほど当ブログにてご紹介させていただくか、複雑な内容に関するお問い合わせの内容の場合には直接営業からご連絡を差し上げます。

※Amazon Web Services、”Powered by Amazon Web Services”ロゴ、およびブログで使用されるその他のAWS商標は、米国その他の諸国における、Amazon.com, Inc.またはその関連会社の商標です。

  • このエントリーをはてなブックマークに追加

お問い合わせ

Contact

ご質問やご相談、サービスに関する詳細など、何でもお気軽にご連絡ください。下記のお問い合わせフォームよりお気軽に送信ください。

お問い合わせ

資料ダウンロード

Download

当社のサービスに関する詳細情報を掲載した資料を、下記のページよりダウンロードいただけます。より深く理解していただける内容となっております。ぜひご活用ください。

資料ダウンロード