web-dev-qa-db-ja.com

Amazon S3ファイルのアクセス許可、別のアカウントからコピーするとアクセスが拒否される

ある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が表示されます。

16
Robbiegod

非常に興味深い難問!幸いなことに、解決策があります。

まず、要約:

  • アカウントAのバケットA
  • アカウントBのバケットB
  • アカウントAのユーザーは、オブジェクトをバケットBにコピーします(適切な権限が付与されています)
  • バケットBのオブジェクトはまだアカウントAに属しており、アカウントBはアクセスできません

私はこれを何とか再現し、アカウント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"
  • オブジェクトへのアクセス許可を持つアカウントAユーザー(たとえば、最初にオブジェクトをバケットBにコピーしたユーザー)が実行する必要があります。
  • メタデータコンテンツは重要ではありませんが、更新を強制するために必要です
  • --acl bucket-owner-full-controlはアカウントBに許可を与えるので、通常どおりオブジェクトを使用できます

最終結果:使用できるバケット!

24
John Rotenstein
aws s3 cp s3://account1/ s3://accountb/ --recursive --acl bucket-owner-full-control 
2
Achyuth

AWS CLIの代わりにHadoop/Sparkジョブを使用して同じことを試みている場合。

  • ステップ1:アカウントAのユーザーに、バケットBにオブジェクトをコピーするための適切なアクセス許可を付与します(上記の回答で説明)。
  • ステップ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")

1
Durga P. Kapa

新しく追加されたファイルに適切なアクセス許可を正しく設定するには、このバケットポリシーを追加します。

[...]
{
    "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 (免責事項:書面私によって)

1
Nino van Hooff

所有権を希望どおりに譲渡することはできません。あなたがしたことは次のとおりです。

古いアカウントはオブジェクトを新しいアカウントにコピーします。

それを行う「正しい」方法(新しいアカウントの所有権を引き受けたいと仮定した場合)は次のようになります。

新しいアカウントは古いアカウントからオブジェクトをコピーします。

小さいながらも重要な違いをご覧ください。 S3 docs 説明の種類。

同じバケット内のすべてのファイルをコピーし、古いファイルを削除するだけで、すべてをダウンロードする必要なく、それで十分だと思います。コピーを行った後、許可を変更できることを確認してください。これにより、すべてをダウンロードするためのデータ転送コストを支払う必要がなくなるので、お金も節約できます。

0
Viccari

置くことによって

--acl bucket-owner-full-controlが機能しました。

0