web-dev-qa-db-fra.com

S3 déplacer des fichiers entre des compartiments sur différents comptes?

Je fais du travail pour un client qui a 2 comptes AWS distincts. Nous devons déplacer tous les fichiers d'un compartiment sur l'un de leurs comptes S3 vers un nouveau compartiment sur le deuxième compte.

Nous pensions que s3cmd permettrait cela, en utilisant le format:

s3cmd cp s3://bucket1 s3://bucket2 --recursive

Cependant cela ne me permet d'utiliser que les clés d'un compte et je ne peux pas spécifier les comptes du 2ème compte.

Existe-t-il un moyen de le faire sans télécharger les fichiers et les télécharger à nouveau sur le 2ème compte?

24
Geuis

Vous n'êtes pas obligé d'ouvrir des autorisations à tout le monde. Utilisez les stratégies de compartiment ci-dessous sur la source et la destination pour copier d'un compartiment dans un compte vers un autre à l'aide d'un utilisateur IAM

  • Seau à copier à partir de: SourceBucket

  • Seau vers lequel copier: DestinationBucket

  • ID de compte AWS source: XXXX–XXXX-XXXX

  • Utilisateur IAM source: src–iam-user

La politique ci-dessous signifie - l'utilisateur IAM - XXXX–XXXX-XXXX:src–iam-user a s3:ListBucket et s3:GetObject privilèges on SourceBucket/* et s3:ListBucket et s3:PutObject privilèges sur DestinationBucket/*

Sur le SourceBucket, la stratégie doit être comme:

{
  "Id": "Policy1357935677554",
  "Statement": [{
    "Sid": "Stmt1357935647218",
    "Action": ["s3:ListBucket"],
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::SourceBucket",
    "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
  }, {
    "Sid": "Stmt1357935676138",
    "Action": ["s3:GetObject"],
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::SourceBucket/*",
    "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
  }]
}

Sur DestinationBucket, la stratégie doit être:

{
  "Id": "Policy1357935677555",
  "Statement": [{
    "Sid": "Stmt1357935647218",
    "Action": ["s3:ListBucket"],
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::DestinationBucket",
    "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
  }, {
    "Sid": "Stmt1357935676138",
    "Action": ["s3:PutObject"],
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::DestinationBucket/*",
    "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
  }]
}

La commande à exécuter est s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1

43
Robs

La bande passante à l'intérieur d'AWS ne compte pas, vous pouvez donc économiser de l'argent et du temps en faisant tout cela à partir d'une boîte à l'intérieur d'AWS, tant que les compartiments sont dans la même région.

Quant à le faire sans avoir le fichier touché quelque part sur un ordinateur - ne le pense pas.

Sauf: comme ils effectuent des téléchargements en masse à partir des disques durs que vous leur envoyez, ils peuvent faire de même pour vous pour un transfert de compartiment à compartiment.

3
Tom Andersen

Je suggère d'utiliser Cloudberry s3 Explorer, comme une solution simple pour faire bouger les choses rapidement. Il vous permet également d'utiliser des services de transfert sans bande passante interne.

Vous pouvez également utiliser les outils cloudberry sdk pour intégrer dans vos applications.

Bonne chance Jon

0
JonLovett

Même si les rôles et les politiques sont une manière vraiment élégante, j'ai une autre solution:

  1. Obtenez vos informations d'identification AWS pour votre compte source-buckets
  2. Idem pour Destination-Buckets-Account
  3. Sur votre machine locale (bureau ou tout serveur en dehors d'AWS), créez un nouveau profil avec les informations d'identification des comptes source-compartiment.

    aws --profile $ {YOUR_CUSTOM_PROFILE} configurer

  4. remplissez aws_access_key_id et aws_secret_access_key (vous pouvez ignorer Région et Sortie)

  5. Enregistrez vos informations d'identification de destination en tant que variables d'environnement

    export AWS_ACCESS_KEY_ID = AKI ...

    exporter AWS_SECRET_ACCESS_KEY = CN ...

  6. Maintenant, faites la synchronisation, mais ajoutez le paramètre "profil" crucial

    aws --profile $ {YOUR_CUSTOM_PROFILE} synchronisation s3 s3: // $ {SOURCE_BUCKET_NAME} s3: // $ {DESTINATION_BUCKET_NAME}

0
DerKnorr