AWS Загрузка объекта s3 в облачное хранилище Google - PullRequest
0 голосов
/ 24 марта 2020

мы пытаемся перенести данные из aws s3 в gcp хранилище. мы попытались перенести работу в gcp и она работает нормально. Поэтому мы хотели достичь этого программно с aws лямбда, поскольку у нас есть зависимости от aws. Когда я пытался импортировать модуль google.cloud, я получаю эту ошибку lambda cloudwatch logs Вот мой код:

import os
import logging
import boto3
#from StringIO import StringIO
from google.cloud import storage
#import google-cloud-storage

# Setup logging
LOG = logging.getLogger(__name__)
LOG.setLevel(os.environ.get('LOG_LEVEL', 'INFO'))

GCS_BUCKET_NAME=os.environ['GCS_BUCKET_NAME']
S3 = boto3.client('s3')


def lambda_handler(event, context):
    try:
        l_t_bucketKey = _getKeys(event)

        # Create google client
        storage_client = storage.Client()
        gcs_bucket = storage_client.get_bucket(os.environ['GCS_BUCKET_NAME'])

        LOG.debug('About to copy %d files', len(l_t_bucketKey))
        for bucket, key in l_t_bucketKey:
            try:
                inFileObj = StringIO()
                S3.download_fileobj(
                    Bucket=bucket,
                    Key=key,
                    Fileobj=inFileObj
                )
                blob = gcs_bucket.blob(key)
                blob.upload_from_file(inFileObj, rewind=True)  # seek(0) before reading file obj

                LOG.info('Copied s3://%s/%s to gcs://%s/%s', bucket, key, GCS_BUCKET_NAME, key)
            except:
                LOG.exception('Error copying file: {k}'.format(k=key))
        return 'SUCCESS'
    except Exception as e:
        LOG.exception("Lambda function failed:")
        return 'ERROR'


def _getKeys(d_event):
    """
    Extracts (bucket, key) from event
    :param d_event: Event dict
    :return: List of tuples (bucket, key)
    """
    l_t_bucketKey = []
    if d_event:
        if 'Records' in d_event and d_event['Records']:
            for d_record in d_event['Records']:
                try:
                    bucket = d_record['s3']['bucket']['name']
                    key = d_record['s3']['object']['key']
                    l_t_bucketKey.append((bucket, key))
                except:
                    LOG.warn('Error extracting bucket and key from event')
    return l_t_bucketKey

И я скачал модуль google-cloud-storage с сайта pypi и импортировал что в aws лямбда-слое. Пожалуйста, помогите предоставить мне лучшую ссылку для скачивания этого модуля.

1 Ответ

0 голосов
/ 24 марта 2020

Google Storage Bucket можно использовать с API-интерфейсами S3, поэтому вы можете просто использовать его в своих функциях Lambda без каких-либо дополнительных библиотек GCP.

    source_client = boto3.client(
        's3',
        endpoint_url='https://storage.googleapis.com',
        aws_access_key_id=os.environ['GCP_KEY'],
        aws_secret_access_key=os.environ['GCP_SECRET']

Чтобы получить access_key и secret - go для GS Настройки корзины -> Взаимодействие -> Ключи доступа для вашей учетной записи пользователя -> Создать ключ

...