こんにちは、サーバエンジニアの池脇です。
今回はS3をAWS CLIを使って操作する際に引っかかったことについてご紹介します。
AWS CLIとは
AWS CLI(AWS Command Line Interface) とは、AWSサービスをコマンドラインから操作・管理するためのツールです。コマンドライン操作を利用してAWSで行う複数の作業の自動化し、作業効率を上げることが可能となります。
詳しい内容は以下のリンクをご覧ください。
またAWS CLIには v1 と v2 が存在します。最近はほとんどなくなっているとは思いますが、古い記事を参照するとv1の可能性があるので新しい記事を参照するようにしましょう。
どんな問題が起きたのか
今携わっているプロジェクトでAWS CLIを利用して複数リージョンにあるS3バケットに対して共通の操作を行なうのですが、とあるバケットへのアクセス時に以下のエラーが発生しました。
An error occurred (IllegalLocationConstraintException) when calling the ListObjectsV2 operation: The af-south-1 location constraint is incompatible for the region specific endpoint this request was sent to.
IllegalLocationConstraintException
はリージョンの指定がされていないという内容のエラーです。すなわち--region af-south-1
をオプションとして設定することでエラーを解消することができます。
しかし問題は複数リージョンに対して同じ操作をしている中、なぜaf-south-1
でのみこのエラーが発生したのかということです。
弊プロジェクトでは
-
aws s3 ls
でバケット一覧を取得 - grepで絞り込みを行い、操作を行うバケットのみ抽出
- 各バケットに共通の操作を行う
という流れで作業を行なっています。
今回はこの3番目の作業時にエラーが発生していました。
いろいろと検証を進めた結果、原因は デフォルトで有効なリージョンでない場合、バケットを指定してS3の操作を行う際にリージョンの指定が必要になる というものでした。
こちらの原因ついては公式の資料を見つけられなかったため、あくまで検証結果からの推測となります。
詳しい情報について知っている方いらっしゃればコメントいただければと思います。
そのため手動で有効化したaf-south-1
でのみエラーが発生したようです。
どう対応したのか
AWS CLIでのS3操作の際、デフォルトで有効なリージョンではリージョン指定の省略が可能ですが、指定をできないわけではありません。
また不要な操作を防ぐ意味でリージョンは指定すべきという意見もあると思います。
そのため今回はバケットへの操作を行う前にaws s3api get-bucket-location
を使ってリージョンを取得し、S3操作の際には必ずリージョンを指定するようにすることで対応しました。
$ aws s3api get-bucket-location --bucket bucket-name
{
"LocationConstraint": "af-south-1"
}
最後に今回作成したShellスクリプトを参考として載せます。
#!/bin/bash
FILE_PATH=$1
FILE_NAME=$(basename "$FILE_PATH")
BUCKETS=$(aws s3 ls | grep 'search-name' | awk '{print $3}')
if [ -z "$BUCKETS" ]; then
echo "No buckets found."
exit 1
fi
for BUCKET in $BUCKETS
do
REGION=$(aws s3api get-bucket-location --bucket "$BUCKET" --query 'LocationConstraint' --output text)
if [ $? -ne 0 ]; then
echo "Error: Could not retrieve region for bucket $BUCKET. Skipping."
continue
fi
if aws s3 ls "s3://$BUCKET/" --region "$REGION" > /dev/null 2>&1; then
# ここで何かしらのS3の操作を行う
# s3 cpの場合の例
DESTINATION="s3://$BUCKET/$FILE_NAME"
aws s3 cp "$FILE_PATH" "$DESTINATION" --region "$REGION"
else
echo "s3://$BUCKET/ does not exist. Skipping."
fi
done
まとめ
AWS CLIで業務効率化を行うスクリプトを作成する際には、不要なバグを防ぐために省略可能でもリージョン指定を行うようにしましょう!