web-dev-qa-db-ja.com

AWS s3またはAWS s3apiを含むフォルダーにアクセス許可を再帰的に変更する方法

S3の既存のアカウントに権限を付与しようとしています。

バケットはアカウントが所有していますが、データは別のアカウントのバケットからコピーされました。

コマンドでアクセス許可を付与しようとすると:

aws s3api put-object-acl --bucket <bucket_name> --key <folder_name> --profile <original_account_profile> --grant-full-control emailaddress=<destination_account_email>

私はエラーを受け取ります:

An error occurred (NoSuchKey) when calling the PutObjectAcl operation: The specified key does not exist.

一方、単一のファイルで実行すると、コマンドは成功します。

フルフォルダーで機能させるにはどうすればよいですか?

9
gc5

すべてのオブジェクトに対して個別にコマンドを実行する必要があります。

以下を使用してプロセスを短縮できる場合があります。

aws s3 cp --acl bucket-owner-full-control --metadata Key=Value --profile <original_account_profile> s3://bucket/path s3://bucket/path

つまり、ファイルを自分自身にコピーしますが、バケット所有者に権限を付与する追加のACLを使用します。

サブディレクトリがある場合は、--recursiveを追加します。

7
John Rotenstein

これは、パイプを使用してのみ達成できます。試してください-

aws s3 ls s3://bucket/path/ --recursive | awk '{cmd="aws s3api put-object-acl --acl bucket-owner-full-control --bucket bucket --key "$4; system(cmd)}'
16

pythonを使用して、権限を再帰的に設定します

#!/usr/bin/env python
import boto3
import sys

client = boto3.client('s3')
BUCKET='enter-bucket-name'

def process_s3_objects(prefix):
    """Get a list of all keys in an S3 bucket."""
    kwargs = {'Bucket': BUCKET, 'Prefix': prefix}
    failures = []
    while_true = True
    while while_true:
      resp = client.list_objects_v2(**kwargs)
      for obj in resp['Contents']:
        try:
            print(obj['Key'])
            set_acl(obj['Key'])
            kwargs['ContinuationToken'] = resp['NextContinuationToken']
        except KeyError:
            while_true = False
        except Exception:
            failures.append(obj["Key"])
            continue

    print "failures :", failures

def set_acl(key):
  client.put_object_acl(     
    GrantFullControl="id=%s" % get_account_canonical_id,
    Bucket=BUCKET,
    Key=key
)

def get_account_canonical_id():
  return client.list_buckets()["Owner"]["ID"]


process_s3_objects(sys.argv[1])
2
Ami Mahloof

これはpowershellのみのソリューションでした。

aws s3 ls s3://BUCKET/ --recursive | %{ "aws s3api put-object-acl --bucket BUCKET --key "+$_.ToString().substring(30)+" --acl bucket-owner-full-control" }

0
Andrew Nelson

主なコマンドISこれ。

WHERE bucketname_example_3636 ISあなたのバケット名。

aws s3api put-object-acl --bucket bucketname_example_3636 --key bigdirectories2_noglacier/bkpy_workspace_sda4.tar --acl bucket-owner-full-control

MY IDEA IS SEDで簡単にスクリプトを作成するには。

1.キーのリストを取得します。

aws s3 ls s3:// bucketname_example_3636 --recursive> listoffile.txt

2. 1000個のファイルがあるとしましょうSO 1000キー;

SEDで自動的に1000個のコマンドを作成します。

ストリング\ 1 ISあなたの鍵;

sed 's /^(.*)$/ aws s3api put-object-acl --bucket bucketname_example_3636 --key\1 --acl bucket-owner-full-control/g' listoffile.txt> listoffile_v2.txt;

3.必要なシバン行を追加して、テキストファイルをBASHスクリプトに変換します。

sed '1 i \#!/ bin/bash' listoffile_v2.txt> listoffile_v3.txt;

4.ファイルの拡張子を変更するだけです。

cp listoffile_v3.txt listoffile_v3.sh;

今あなたはスクリプトを持っています。

スクリプトを実行可能にします。

chmod u + x listoffile_v3.sh;

スクリプトを実行する

listoffile_v3.sh;

0
quine9997