Amazon Simple Storage Service (Amazon S3) バケットには、パブリックに (匿名で) 所有されているオブジェクトがあります。オブジェクトの所有権を変更して、私の AWS アカウントがそのオブジェクトを所有できるようにしたいです。
簡単な説明
デフォルトでは、Amazon S3 オブジェクトをアップロードする ID がそのオブジェクトを所有します。つまり、バケットへのパブリック書き込みアクセスを許可する場合、パブリック (匿名) ユーザーがアップロードしたオブジェクトの所有者はパブリックということになります。セキュリティの問題を防ぐには、バケットへのパブリックアクセスを許可しないのがベストプラクティスです。
匿名ユーザーがバケットにオブジェクトをアップロードしたが、あなたがオブジェクトの所有権を変更したくなった場合は、オブジェクトのアクセスコントロールリスト (ACL) を変更します。オブジェクトの ACL を変更して、バケット所有者 (あなたの AWS アカウント) にオブジェクトのフルコントロールを許可します。
注: Amazon S3 オブジェクト所有権を使用して、あなた以外の AWS アカウントがアップロードしたオブジェクトの所有権を制御することもできます。
解決策
オブジェクトの所有権をバケットを所有する AWS アカウントに変更するには、次の手順に従います。
-
オブジェクト ACL を追加するには、AWS コマンドラインインターフェイス (AWS CLI) で put-object-acl コマンドを実行します。バケット所有者にオブジェクトの制御を付与する ACL を追加するには、--acl オプションに bucket-owner-full-control という値を指定します。次に、--no-sign-request オプションを追加して、リクエストに匿名の認証情報を使用します。put-object-acl コマンドと必要なオプションをすべて指定すると、次の例のようになります。
aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key awsexampleobject --acl bucket-owner-full-control --no-sign-request
注: AWS CLI コマンドの実行中にエラーが発生した場合は、必ず最新バージョンの AWS CLI を使用してください。
-
所有権の変更を適用するには、オブジェクトを上書きコピーする必要があります。これを行うには、cp コマンドを実行します。
aws s3 cp s3://DOC-EXAMPLE-BUCKET/awsexampleobject s3://DOC-EXAMPLE-BUCKET/awsexampleobject --storage-class STANDARD
注: サンプルコマンド内の --storage-class の値を、ユースケースに適したストレージクラスに必ず変更してください。また、オブジェクトに必要な他の cp コマンドオプションも必ず含めてください。
-
所有権の変更を確認するには、get-object-acl コマンドを実行します。
aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key awsexampleobject
このコマンドは、次のようなオブジェクトの所有者を示す出力を返します。
{
"Owner": {
"DisplayName": "jane",
"ID": "75050348ef85628a0977bexamplebdbc3062ce76f35cb463345ae65c2608d099"
},
"Grants": [
{
"Grantee": {
"DisplayName": "jane",
"ID": "75050348ef85628a0977bexamplebdbc3062ce76f35cb463345ae65c2608d099",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
}
]
}
-
バケットにバージョニングが設定されている場合は、ステップ 2 で cp コマンドから生成されたオブジェクトの以前のバージョンも削除する必要があります。以前のオブジェクトバージョンには、パブリック (匿名) 所有権が設定されていました。このオブジェクトバージョンを削除するには、まずバケットに対して list-object-versions コマンドを実行します。結果をフィルタリングしてパブリック所有権を持つオブジェクトを表示するには、コマンドに --prefix オプションを含めます。
aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix example.txt
パブリック所有権が設定されたオブジェクトバージョンのバージョン ID が上記コマンドの出力に含まれているので、それをコピーします。次に、削除するバージョン ID に対して delete-object コマンドを実行します。
aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id 'example.d6tjAKF1iObKbEnNQkIMPjj'
警告: バージョン ID がパブリック所有権が設定されたオブジェクトバージョンのバージョン ID であることを確認してください。オブジェクトバージョンは一度削除すると、再び取得できなくなります。
関連情報
別の AWS アカウントにより自分の Amazon S3 バケットにアップロードされたオブジェクトにアクセスできないのはなぜですか?