クロスアカウントでの S3 コピー実行時エラー「An error occurred (AccessDenied) when calling the GetObjectTagging operation: Access Denied」を回避するには

2023.01.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていること

S3 バケット内にあるファイルを、EC2 インスタンスの Linux サーバーより AWS CLI コマンド "aws s3 cp" を実行して、他 S3 バケットへのバケット間コピーを試みたところ、下記エラーが発生しました。

An error occurred (AccessDenied) when calling the GetObjectTagging operation: Access Denied

原因と対処法について教えてください。

どう対応すればいいの?

原因

下記 ドキュメント 記載の通り、AWS CLI バージョン 2 ではマルチパートコピーの際にデフォルトでタグを含めたプロパティをコピーする動作となっています。

デフォルトで、マルチパートコピーを実行する s3 名前空間の AWS CLI バージョン 2 のコマンドは、ソースのすべてのタグと、プロパティのセット (content-type、content-language、content-encoding、content-disposition、cache-control、expires) をコピー先に転送します。

これにより、AWS CLI バージョン 1 を使用する場合には行われなかった追加の AWS API コールが Amazon S3 エンドポイントに対して実行されることになる場合があります。これには、HeadObject、GetObjectTagging、および PutObjectTagging が含まれます。

対処法

利用中の AWS CLI のバージョンが 2 であれば、オプション "--copy-props""none" を指定することで、ソースオブジェクトのプロパティを含めないようにすることが可能です。

AWS CLI バージョン 2 コマンドでこのデフォルト動作を変更する必要がある場合は、--copy-props パラメータを使用して次のオプションのいずれかを指定します。

・default - デフォルト値。コピーに、ソースオブジェクトにアタッチされたすべてのタグと、マルチパートコピー以外に使用される --metadata-directive パラメータの次のプロパティが含まれることを指定します。content-type、content-language、content-encoding、content-disposition、cache-control, expires、metadata。

・metadata-directive - --metadata-directive マルチパートコピー以外に使用されるパラメータによって包含されるプロパティのみがコピーに含まれることを指定します。タグはコピーされません。

・none - コピーにソースオブジェクトのプロパティを含みません。

クロスアカウント S3 コピーの際にこちらのオプションを指定して、エラーが解消するかご確認ください。

コマンド例

$ aws s3 cp s3://source/object-name s3://destination/object-name/ --copy-props none --recursive

参考資料