J'essaie d'accorder des autorisations à un compte existant dans s3.
Le compartiment appartient au compte, mais les données ont été copiées à partir du compartiment d'un autre compte.
Lorsque j'essaie d'accorder des autorisations avec la commande:
aws s3api put-object-acl --bucket <bucket_name> --key <folder_name> --profile <original_account_profile> --grant-full-control emailaddress=<destination_account_email>
Je reçois l'erreur:
An error occurred (NoSuchKey) when calling the PutObjectAcl operation: The specified key does not exist.
alors que si je le fais sur un seul fichier, la commande réussit.
Comment puis-je le faire fonctionner pour un dossier complet?
Vous devrez exécuter la commande individuellement pour chaque objet.
Vous pourrez peut-être raccourcir le processus en utilisant:
aws s3 cp --acl bucket-owner-full-control --metadata Key=Value --profile <original_account_profile> s3://bucket/path s3://bucket/path
Autrement dit, vous copiez les fichiers sur eux-mêmes, mais avec la liste de contrôle d'accès ajoutée qui accorde des autorisations au propriétaire du compartiment.
Si vous avez des sous-répertoires, ajoutez --recursive
.
Cela ne peut être réalisé qu'avec des tuyaux. Essayez -
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)}'
utilisez python pour configurer les autorisations de manière récursive
#!/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])
C'était ma seule solution powershell
.
aws s3 ls s3://BUCKET/ --recursive | %{ "aws s3api put-object-acl --bucket BUCKET --key "+$_.ToString().substring(30)+" --acl bucket-owner-full-control" }
aws s3api put-object-acl --bucket bucketname_example_3636 --key bigdirectories2_noglacier/bkpy_workspace_sda4.tar --acl bucket-owner-full-control
aws s3 ls s3: // bucketname_example_3636 --recursive> listoffile.txt
sed 's /^(.*)$/ aws s3api put-object-acl --bucket bucketname_example_3636 --key\1 --acl bucket-owner-full-control/g' listoffile.txt> listoffile_v2.txt;
sed '1 i\#!/bin/bash' listoffile_v2.txt> listoffile_v3.txt;
cp listoffile_v3.txt listoffile_v3.sh;
chmod u + x listoffile_v3.sh;
listoffile_v3.sh;