0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS S3コマンドの基本から応用までの使い方を全5回で整理してみる - 第5回:S3コマンドの実践的な応用例とトラブルシューティング

Last updated at Posted at 2025-08-02

第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 lsgrepxargs を組み合わせて、一括削除を行う例を紹介します。

例: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:PutObjects3:GetObjectなど)が許可されているか、またリソース(バケット、オブジェクト)のARNが正しいか確認しましょう。
  • バケットポリシーの確認: ターゲットのバケットに設定されているバケットポリシーが、アクセスを拒否していないか確認します。
  • aws configureの確認: 意図しないIAMユーザーの認証情報でコマンドを実行していないか確認しましょう。

2. SignatureDoesNotMatchエラー

認証情報(アクセスキーIDとシークレットアクセスキー)が正しくない、または署名プロセスに問題がある場合に発生します。

解決方法:

  • 認証情報の確認: ~/.aws/credentials ファイルに記載されているアクセスキーとシークレットアクセスキーが正しいか再確認します。
  • リージョンの確認: aws configure で設定したリージョン、またはコマンドで指定した --region オプションが正しいか確認します。リージョンが異なると署名が一致しません。
  • 時刻の同期: ローカルPCのシステム時刻が、AWSのサーバー時刻と大きくずれている場合、署名エラーになることがあります。システム時刻を正確に同期させましょう。

3. aws s3apiaws s3の違いと使い分け

AWS CLIには、aws s3aws 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コマンドを使いこなし、日々の開発や運用に役立てていってください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?