web-dev-qa-db-fra.com

Comment ajouter un chiffrement à boto3.s3.transfer.TransferConfig pour le téléchargement de fichiers s3

J'essaie de télécharger un fichier vers s3 en utilisant la méthode boto3 file_upload. C'est assez simple jusqu'à ce que le chiffrement côté serveur soit nécessaire. Dans le passé, j'ai utilisé put_object pour y parvenir.

Ainsi:

import boto3
s3 = boto3.resource('s3')
s3.Bucket(bucket).put_object(Key=object_name,
                             Body=data,
                             ServerSideEncryption='aws:kms',
                             SSEKMSKeyId='alias/aws/s3')

Je veux maintenant télécharger des fichiers directement sur s3 en utilisant la méthode file_upload. Je ne trouve pas comment ajouter le chiffrement côté serveur à la méthode file_upload. La méthode file_upload peut prendre un TransferConfig mais je ne vois aucun argument qui définit le chiffrement mais je les vois dans S3Transfer .

Je cherche quelque chose comme ça:

import boto3
s3 = boto3.resource('s3')
tc = boto3.s3.transfer.TransferConfig(ServerSideEncryption='aws:kms',
                                      SEKMSKeyId='alias/aws/s3')
s3.upload_file(file_name, 
               bucket, 
               object_name,
               Config=tc)

documentation de boto3

8
ajputnam

J'ai pu trouver deux solutions avec l'aide de Jarmod.

en utilisant boto3.s3.transfer.S3Transfer

import boto3
client = boto3.client('s3', 'us-west-2')
transfer = boto3.s3.transfer.S3Transfer(client=client)
transfer.upload_file(file_name,
                     bucket, 
                     key_name,
                     extra_args={'ServerSideEncryption':'aws:kms', 
                                 'SSEKMSKeyId':'alias/aws/s3'}
)

en utilisant s3.meta.client

import boto3
s3 = boto3.resource('s3')
s3.meta.client.upload_file(file_name, 
                           bucket, key_name, 
                           ExtraArgs={'ServerSideEncryption':'aws:kms',
                                      'SSEKMSKeyId':'alias/aws/s3'})
7
ajputnam