第5回:S3コマンドの実践的な応用例とトラブルシューティング
はじめに
このシリーズもいよいよ最終回です。これまでに、S3コマンドの基本から、sync
による効率的なデータ同期、メタデータやアクセス権限の管理、そしてライフサイクル設定まで、幅広い知識を学んできました。
最終回となる今回は、これまでの知識を総動員して、実際の業務で役立つシェルスクリプトの作成例を紹介します。また、S3コマンドを扱う上で避けては通れないトラブルシューティングや、複数のAWS環境を管理するためのプロファイル設定についても解説します。これらの内容を通じて、S3コマンドをより安全かつ効果的に使いこなせるようになりましょう。
実践的なシェルスクリプトの例
1. S3への定期バックアップスクリプト
aws s3 sync
と日付プレフィックスを組み合わせることで、日次でバックアップを作成するスクリプトを作成できます。これにより、特定の時点のデータをいつでも復元できるようになります。
#!/bin/bash
# バックアップ元のローカルディレクトリ
SOURCE_DIR="/path/to/local/data"
# バックアップ先のS3バケット
S3_BUCKET="s3://my-backup-bucket"
# 今日の日付をYYYY/MM/DD形式で取得
DATE_PATH=$(date +%Y/%m/%d)
# バックアップ先のプレフィックス(S3上のディレクトリ)
TARGET_PATH="${S3_BUCKET}/${DATE_PATH}/"
echo "Syncing data from ${SOURCE_DIR} to ${TARGET_PATH}"
# --deleteオプションで、同期元のデータと全く同じ状態にする
aws s3 sync "${SOURCE_DIR}" "${TARGET_PATH}" --delete
echo "Backup complete!"
このスクリプトを cron
などを使って毎日自動実行すれば、日次バックアップがS3上に自動的に蓄積されていきます。--delete
を使っているため、削除されたファイルもS3上で反映されます。
2. 特定の条件に合致するファイルを一括削除するスクリプト
古いログファイルや一時ファイルなど、特定の条件に合致するファイルをS3から一括で削除したい場面はよくあります。ここでは、aws s3 ls
と grep
、xargs
を組み合わせて、一括削除を行う例を紹介します。
例:1年以上前のログファイルを削除する
#!/bin/bash
S3_BUCKET="s3://my-log-bucket"
PREFIX="logs/"
# 1年以上前の日付を取得
ONE_YEAR_AGO=$(date -d "1 year ago" +%Y-%m-%d)
echo "Searching for files older than ${ONE_YEAR_AGO} in ${S3_BUCKET}/${PREFIX}"
# 1. lsでファイルの一覧を取得
# 2. grepで古い日付のファイルを抽出
# 3. awkでS3のキー(ファイルパス)のみを抽出
# 4. xargsで抽出したキーをaws s3 rmコマンドに渡して削除
aws s3 ls "${S3_BUCKET}/${PREFIX}" --recursive | \
grep -E "^[0-9]{4}-[0-9]{2}-[0-9]{2}.* " | \
awk '{ if ($1 < "'$ONE_YEAR_AGO'") print $4 }' | \
xargs -I {} aws s3 rm "${S3_BUCKET}/{}" --dryrun
echo "Deletion script finished."
注意: このスクリプトは、--dryrun
オプションを付けています。実際に削除したい場合は、xargs -I {} aws s3 rm "${S3_BUCKET}/{}"
の部分から --dryrun
を削除してください。
S3コマンドのトラブルシューティング
コマンドがエラーになった場合、落ち着いて原因を切り分けましょう。ここでは、よくあるエラーとその対処法を解説します。
1. 権限エラー(An error occurred (AccessDenied)
)
このエラーは、コマンドを実行しているIAMユーザーまたはIAMロールに、必要なS3操作の権限が付与されていない場合に発生します。
解決方法:
-
IAMポリシーの確認: AWS IAMコンソールで、コマンドを実行しているユーザー(またはロール)にアタッチされているポリシーを確認します。必要なS3アクション(
s3:PutObject
、s3:GetObject
など)が許可されているか、またリソース(バケット、オブジェクト)のARNが正しいか確認しましょう。 - バケットポリシーの確認: ターゲットのバケットに設定されているバケットポリシーが、アクセスを拒否していないか確認します。
-
aws configure
の確認: 意図しないIAMユーザーの認証情報でコマンドを実行していないか確認しましょう。
2. SignatureDoesNotMatch
エラー
認証情報(アクセスキーIDとシークレットアクセスキー)が正しくない、または署名プロセスに問題がある場合に発生します。
解決方法:
-
認証情報の確認:
~/.aws/credentials
ファイルに記載されているアクセスキーとシークレットアクセスキーが正しいか再確認します。 -
リージョンの確認:
aws configure
で設定したリージョン、またはコマンドで指定した--region
オプションが正しいか確認します。リージョンが異なると署名が一致しません。 - 時刻の同期: ローカルPCのシステム時刻が、AWSのサーバー時刻と大きくずれている場合、署名エラーになることがあります。システム時刻を正確に同期させましょう。
3. aws s3api
とaws s3
の違いと使い分け
AWS CLIには、aws s3
と aws s3api
の2つの主要なコマンドグループがあります。
-
aws s3
: 高レベルのコマンド。ls
,cp
,sync
など、ファイルシステムのように直感的にS3を操作するためのコマンド群です。主に日常的なデータ転送や管理に使用します。 -
aws s3api
: 低レベルのコマンド。S3のAPI(CreateBucket
,PutBucketLifecycleConfiguration
など)を直接実行するためのコマンド群です。ライフサイクルルールやバージョニング、パブリックアクセスブロックなど、バケットの設定を変更する際に使用します。
基本的には、aws s3
を使い、s3
コマンドで実現できない高度な設定や管理が必要な場合にのみ aws s3api
を使う、という使い分けを推奨します。
AWS CLIのプロファイルとリージョン
複数のAWSアカウントや環境(開発、ステージング、本番)を使い分ける場合、プロファイルとリージョンの管理が重要になります。
1. 複数のAWSアカウントを使い分けるためのプロファイル設定
~/.aws/credentials
と ~/.aws/config
ファイルを編集することで、複数のプロファイルを定義できます。
~/.aws/credentials
[default]
aws_access_key_id = <default-access-key-id>
aws_secret_access_key = <default-secret-access-key>
[dev]
aws_access_key_id = <dev-access-key-id>
aws_secret_access_key = <dev-secret-access-key>
[prod]
aws_access_key_id = <prod-access-key-id>
aws_secret_access_key = <prod-secret-access-key>
~/.aws/config
[default]
region = ap-northeast-1
output = json
[profile dev]
region = us-east-1
[profile prod]
region = ap-northeast-1
プロファイルを指定してコマンドを実行するには、--profile
オプションを使用します。
# devアカウントのS3バケットを一覧表示
aws s3 ls --profile dev
# prodアカウントのS3バケットにファイルをコピー
aws s3 cp my_data.txt s3://prod-bucket --profile prod
2. --region
オプションの重要性
AWS CLIは、aws configure
で設定されたデフォルトリージョンを使用しますが、コマンドごとに --region
オプションで上書きできます。
# デフォルトリージョンはap-northeast-1だが、us-east-1のバケットを一覧表示
aws s3 ls --region us-east-1
S3バケットはリージョンに紐づいているため、コマンドの実行対象となるバケットのリージョンを正しく指定することが重要です。
さいごに
このシリーズを通じて、S3コマンドの基礎から応用まで、一通りの知識を学ぶことができました。S3コマンドは、シェルスクリプトとの親和性が高く、様々な自動化や業務効率化に役立ちます。
S3は非常に奥が深いサービスです。本シリーズで紹介した内容を土台に、今後は以下の領域にもチャレンジしてみましょう。
- S3とLambda関数を連携させたサーバーレスアーキテクチャの構築
- S3 Select を使ったオブジェクト内のデータ検索
- S3 Glacier Instant Retrieval など、より多様なストレージクラスの活用
S3コマンドを使いこなし、日々の開発や運用に役立てていってください。