import base64 import os from datetime import datetime import boto3 from google.oauth2 import service_account from googleapiclient import discovery from googleapiclient.errors import HttpError from googleapiclient.http import MediaFileUpload S3_BUCKET = os.environ["S3_BUCKET"] def get_service_account_credentials(): private_key = base64.b64decode(os.environ["PRIVATE_KEY"]) # private_key = private_key.replace('\\n','\n') creds_dict = { "type": "service_account", "project_id": os.environ["PROJECT_ID"], "private_key_id": os.environ["PRIVATE_KEY_ID"], "private_key": private_key, "client_email": os.environ["CLIENT_EMAIL"], "client_id": str(os.environ["CLIENT_ID"]), "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/upload-report%40drive-and-docs.iam.gserviceaccount.com", } scope_list = [ "https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", ] try: credentials = service_account.Credentials.from_service_account_info( creds_dict, scopes=scope_list ) except HttpError as error: # TODO(developer) - Handle errors from drive API. print(f"An error occurred when get credentials: {error}") raise return credentials def upload_file( service, orig_file_with_path, dest_filename, description, dest_folder, mime_type, ): resp = {} print(os.stat(orig_file_with_path).st_size) _date = datetime.now().date() dest_filename = f"{'.'.join(dest_filename.split('.')[:-1])}-{_date}.docx" media_body = MediaFileUpload(orig_file_with_path, mimetype=None) body = { "name": dest_filename, "title": dest_filename, "description": description, #'mimeType': mime_type, #'mimeType': 'application/vnd.google-apps.unknown', "parents": [dest_folder], } try: # comments will not remain after updating file file = ( service.files() .create(supportsAllDrives=True, body=body, media_body=media_body) .execute() ) resp[orig_file_with_path] = file["id"] except HttpError as error: # TODO(developer) - Handle errors from drive API. print(f"An error occurred when upload: {error}") resp[orig_file_with_path] = error # backup upload by trunk # media = MediaFileUpload(orig_file_with_path, mimetype=mime_type, chunksize=262144, resumable=True) # 256*1024 # body = { # 'name': dest_filename, # 'title': dest_filename, # 'description': dest_filename, # #'mimeType': mime_type, # #'mimeType': 'application/vnd.google-apps.file', # 'parents': [dest_folder] # } # request = service.files().create(media_body=media, body=body) # response = None # while response is None: # status, response = request.next_chunk() # if status: # #print("Uploaded %d%%." % int(status.progress() * 100)) # #print(status) # a = 1 # print("Upload Complete!") # resp = status.progress() return resp def upload_files(files, dest_folder): credentials = get_service_account_credentials() service = discovery.build("drive", "v3", credentials=credentials, cache_discovery=False) file_type = "application/vnd.google-apps.document" for file in files: file_path = "/tmp/" + file description = file upload_file(service, file_path, file, description, dest_folder, file_type) def lambda_handler(event, context): s3 = boto3.client("s3") report_name = "feature_evaluation_report_v1.1" # report_name = 'sales_report_na' if event.get("kwargs") is not None: report_name = event["kwargs"]["report_name"] s3_obj = f"docx/{report_name}.docx" filename = f"{report_name}.docx" tmp_doc = "/tmp/" + filename with open(tmp_doc, "wb") as f: s3.download_fileobj(S3_BUCKET, s3_obj, f) folder_id = os.environ["FOLDER_ID"] resp = upload_files([filename], folder_id) return {"statusCode": 200, "body": resp}