あるAWSバケットから別のアカウントのアカウントに自分のバケットの自分のアカウントにコピーされたビデオファイルのセットがあります。
すべてのファイルを公開しようとすると、アクセス拒否エラーが表示されるすべてのファイルで問題が発生しています。
具体的には、AWSアカウントにログインし、S3に移動して、フォルダー構造をドリルダウンしてビデオファイルの1つを見つけます。
この特定のファイルを見ると、ファイルの権限タブに誰にも割り当てられている権限が表示されません。ユーザー、グループ、またはシステムのアクセス許可が割り当てられていません。
[アクセス許可]タブの下部に、「エラー:アクセスが拒否されました」という小さなボックスが表示されます。ファイルについては何も変更できません。メタデータを追加できません。ユーザーをファイルに追加できません。ファイルを公開できません。
これらのファイルを制御して、公開できるようにする方法はありますか? 15,000以上のファイル/約60GBのファイルがあります。すべてのファイルのダウンロードと再アップロードを避けたい。
ここの人々からいくつかの支援と提案を受けて、私は次のことを試しました。バケットに「media」という新しいフォルダーを作成しました。
私はこのコマンドを試しました:
aws s3 cp s3://mybucket/2014/09/17/thumb.jpg s3://mybucket/media --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers full=emailaddress=my_aws_account_email_address
HeadObject操作を禁止すると、致命的なエラー403が表示されます。
非常に興味深い難問!幸いなことに、解決策があります。
まず、要約:
私はこれを何とか再現し、アカウントBのユーザーがファイルにアクセスできないことを確認できました。アカウントBのrootユーザーでさえもできません。
幸いなことに、物事を修正することができます。 AWSコマンドラインインターフェイス(CLI) のaws s3 cp
コマンドは、同じ名前にコピーされたときにファイルのアクセス許可を更新できます。ただし、これをトリガーするには、他の何かを更新する必要があります。そうしないと、このエラーが発生します。
このコピーリクエストは、オブジェクトのメタデータ、ストレージクラス、Webサイトリダイレクトの場所、または暗号化属性を変更せずにオブジェクトを自分自身にコピーしようとするため、違法です。
したがって、権限は次のコマンドで更新できます。
aws s3 cp s3://my-bucket/ s3://my-bucket/ --recursive --acl bucket-owner-full-control --metadata "One=Two"
--acl bucket-owner-full-control
はアカウントBに許可を与えるので、通常どおりオブジェクトを使用できます最終結果:使用できるバケット!
aws s3 cp s3://account1/ s3://accountb/ --recursive --acl bucket-owner-full-control
AWS CLIの代わりにHadoop/Sparkジョブを使用して同じことを試みている場合。
ステップ2:Hadoop構成を使用してfs.s3a.acl.default構成オプションを設定します。これは、confファイルまたはプログラムで設定できます。
構成ファイル:
_<property> <name>fs.s3a.acl.default</name> <description>Set a canned ACL for newly created and copied objects. Value may be Private, PublicRead, PublicReadWrite, AuthenticatedRead, LogDeliveryWrite, BucketOwnerRead, or BucketOwnerFullControl.</description> <value>$chooseOneFromDescription</value> </property>
_
プログラムで:
spark.sparkContext.hadoopConfiguration.set("fs.s3a.acl.default", "BucketOwnerFullControl")
新しく追加されたファイルに適切なアクセス許可を正しく設定するには、このバケットポリシーを追加します。
[...]
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012::user/their-user"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
そして、コードで新しく作成されたファイルのACLを設定します。 Python例:
import boto3
client = boto3.client('s3')
local_file_path = '/home/me/data.csv'
bucket_name = 'my-bucket'
bucket_file_path = 'exports/data.csv'
client.upload_file(
local_file_path,
bucket_name,
bucket_file_path,
ExtraArgs={'ACL':'bucket-owner-full-control'}
)
ソース: https://medium.com/artificial-industry/how-to-download-files-that-others-put-in-your-aws-s3-bucket-2269e20ed041 (免責事項:書面私によって)
所有権を希望どおりに譲渡することはできません。あなたがしたことは次のとおりです。
古いアカウントはオブジェクトを新しいアカウントにコピーします。
それを行う「正しい」方法(新しいアカウントの所有権を引き受けたいと仮定した場合)は次のようになります。
新しいアカウントは古いアカウントからオブジェクトをコピーします。
小さいながらも重要な違いをご覧ください。 S3 docs 説明の種類。
同じバケット内のすべてのファイルをコピーし、古いファイルを削除するだけで、すべてをダウンロードする必要なく、それで十分だと思います。コピーを行った後、許可を変更できることを確認してください。これにより、すべてをダウンロードするためのデータ転送コストを支払う必要がなくなるので、お金も節約できます。
置くことによって
--acl bucket-owner-full-controlが機能しました。