[PYTHON] Die Geschichte des Kopierens von Daten von S3 auf Googles TeamDrive

Hintergrund

Ich glaube nicht, dass es einen großen Bedarf gibt, aber ich habe es einfach gemacht, Dateien freizugeben, während ich die Dateien in S3 im Speicher eines anderen Anbieters gespeichert habe. Es war nicht schwierig, wenn ich GoogleDriveApi verwendete, um der Dokumentation zu folgen, aber es gab Zeiten, in denen die Dateigröße groß war. Ich denke, es gibt wieder eine ähnliche Implementierung, ich werde sie für alle Fälle als Memo belassen.

Was willst du tun

Übertragen Sie S3-Daten automatisch an Google Drive.

Was ich getan habe

Migrierte den Inhalt des S3-Buckets mit Python auf das angegebene Teamlaufwerk.

Implementierungsdetails

  1. Laden Sie die Datei von S3 auf tmp herunter.
  2. Überprüfen Sie, ob die Datei bereits in Gdrive vorhanden ist
  3. Überschreiben, falls vorhanden
  4. Wenn es nicht vorhanden ist, fügen Sie es als neu hinzu

Vorbereitungen

Dies ist die Quelle, die ich tatsächlich implementiert habe.

# Download File from S3 to Local tmp Dir
# Upload a file to Google Drive

import os
import boto3
import json
import requests
import magic



## setting info
CONTENT_BUCKET_NAME = 'MY_S3_BUCKET_NAME'
CONTENT_BACKUP_KEY = 'MY_S3_BUCKET_KEY'
GOOGLE_CLIENT_ID = "XXXXXXXXXXXX.apps.googleusercontent.com"
GOOGLE_CLIENT_SECRET = "XXXXXXXXXXXX"
GOOGLE_REFRESH_TOKEN = "XXXXXXXXXXXX"
GOOGLE_FOLDER_ID = 'GOOGLE_FOLDER_ID'


s3 = boto3.resource('s3')
 
# Get the object from the event and show its content type
bucket = CONTENT_BUCKET_NAME
key = CONTENT_BACKUP_KEY
file_name = key.split("/")[1]
file_path = os.path.join("/tmp/"+ file_name)
s3.Object(bucket, key).download_file(file_path)
filesize = os.path.getsize(file_path)
fname, extension = os.path.splitext(file_name)

# refresh token
access_token_url = 'https://accounts.google.com/o/oauth2/token'
headers = {"Content-Type":"application/json","X-Accept":"application/json"}
refresh_token_request = {"grant_type":"refresh_token", "client_id": GOOGLE_CLIENT_ID, "client_secret": GOOGLE_CLIENT_SECRET, "refresh_token": GOOGLE_REFRESH_TOKEN}
access_token_request = requests.post(access_token_url,headers=headers,data=json.dumps(refresh_token_request))
access_token = access_token_request.json()['access_token']
print(access_token)

# check file already exist 
downloadUrl = "https://www.googleapis.com/drive/v3/files"
headers = {
    'Host':'www.googleapis.com',
    'Authorization': 'Bearer ' + access_token,
    'Content-Type':'application/json; charset=UTF-8',
    "X-Accept":"application/json"
}
qs= { "q": "'" + GOOGLE_FOLDER_ID + "' in parents and name='" + file_name + "' and trashed=false",
      "supportsAllDrives": True,
      "includeItemsFromAllDrives": True
    }

fileExistCheck = requests.get(downloadUrl, params=qs, headers=headers)
responseJsonFiles = fileExistCheck.json()['files']
searchResponseLength = len(responseJsonFiles)

#upload_file()
mime = magic.Magic(mime=True)
mimeType = mime.from_file(file_path) 

#folder_id = GOOGLE_FOLDER_ID
headers = {
    'Host':'www.googleapis.com',
    'Content-Length': str(filesize),
    'Authorization': 'Bearer ' + access_token,
    'Content-Type':'application/json; charset=UTF-8',
    'X-Upload-Content-Type': mimeType,
    'X-Upload-Content-Length': str(filesize)
}

with open(file_path, 'rb') as data:
  file_name= os.path.basename(file_path)
  metadata = {
    "name": file_name,
    "title": file_name,
    "parents": [GOOGLE_FOLDER_ID],
    'kind': 'drive#permission',
    "permissionDetails": [
      {
        "permissionType": "file",
        "role": "organizer"
      }
    ],
  }
 
 # No file exist. Post new one.
  if searchResponseLength < 1:
    postUrl = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&supportsAllDrives=true"
    r = requests.post(postUrl, data=json.dumps(metadata), headers=headers)
    # data upload url
    uploadUrl = r.headers['Location']

    r2 = requests.post(uploadUrl, data=data, headers=headers)
  
  # file exist. Put to override
  else:
    fileId = responseJsonFiles[0]['id']
    metadata = {
      "filename": file_name,
      "name": file_name,
      "title": file_name,
      'kind': 'drive#permission',
      "permissionDetails": [
        {
          "permissionType": "file",
          "role": "organizer"
        }
      ]
    }
    
    putUrl = "https://www.googleapis.com/upload/drive/v3/files/" + fileId + "?uploadType=resumable&supportsAllDrives=true"
    r = requests.patch(putUrl, data=json.dumps(metadata), headers=headers)
    uploadUrl = r.headers['Location']
    r2 = requests.patch(uploadUrl, data=data, headers=headers)

Am Ende

Ich denke, es gibt weitere Verbesserungen, aber wenn es einen einfacheren Weg gibt, dies zu implementieren, kommentieren Sie dies bitte.

Recommended Posts

Die Geschichte des Kopierens von Daten von S3 auf Googles TeamDrive
Die Geschichte vom Umzug von Pipenv zur Poesie
Immerhin die Geschichte der Rückkehr von Linux zu Windows
Die Geschichte des Versuchs, den Client wieder zu verbinden
Die Geschichte, MeCab in Ubuntu 16.04 zu setzen
Die Geschichte von pep8 wechselt zu pycodestyle
Ändern Sie den Dezimalpunkt der Protokollierung von, nach.
Die Geschichte des Lesens von HSPICE-Daten in Python
Von der Einführung von Pyethapp bis zur Vertragsabwicklung
Übergang von Baseball aus Daten gesehen
Die Geschichte des Wechsels des Azure App Service-Websystems von Windows zu Linux
Daten aus S3 extrahieren
Die Geschichte von sys.path.append ()
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
Senden Sie Protokolldaten vom Server an Splunk Cloud
DataNitro, Implementierung einer Funktion zum Lesen von Daten aus dem Blatt
Die Geschichte, ein Ring-Fit-Abenteuer kaufen zu wollen
Die Geschichte der Verwendung von Circleci zum Bau vieler Linux-Räder
Die Geschichte des Wechsels von WoSign zu Let's Encrypt für ein kostenloses SSL-Zertifikat
Die Geschichte der Portierung von Code von C nach Go (und zur Sprachspezifikation)
Die Geschichte des Baus von Zabbix 4.4
SIGNATE Quest ② Von der gezielten Modellerstellung bis zur Erstellung von Übermittlungsdaten
[Einführung in das logarithmische Diagramm] Prognostizieren Sie die Endzeit jedes Landes anhand des logarithmischen Diagramms der Infektionszahldaten ♬
Die Geschichte des Django-Modellfeldes verschwindet aus der Klasse
Berechnen des aus ABC134-D gelernten Rechenaufwands
Die Geschichte eines Rubinisten, der mit Python :: Dict-Daten mit Pycall kämpft
[Einführung in matplotlib] Lesen Sie die Endzeit aus den COVID-19-Daten ♬
Darstellung der Verteilung der Bakterienzusammensetzung aus Qiime2-Analysedaten in einem Box-Whisker-Diagramm
Übergeben Sie die OpenCV-Daten der ursprünglichen C ++ - Bibliothek an Python
Ich habe die Daten von Raspberry Pi an GCP gesendet (kostenlos)
Versuchen Sie, Merkmale von Sensordaten mit CNN zu extrahieren
Lernen Sie Buchhaltungsdaten kennen und versuchen Sie, Konten aus dem Inhalt der Beschreibung vorherzusagen, wenn Sie Journale eingeben
Portiert von der R-Sprache von "Sazae-sans Janken Data Analysis" nach Python
Die Geschichte, dass die Version von Python 3.7.7 nicht an Heroku angepasst wurde
Die Geschichte, dass man mit Pycharm kein Pygame spielen kann
Speichern Sie das Ergebnis des Crawls mit Scrapy im Google Data Store
Lesen Sie den gesamten Inhalt von proc / [pid] ~ Von setgroups bis wchan ~
Studieren von Web Scraping zum Extrahieren von Daten aus Filmarks # 2
So vermeiden Sie doppelte Daten bei der Eingabe von Python in SQLite.
Lesen Sie den gesamten Inhalt von proc / [pid] ~ Von cwd bis loginuid ~
Lesen Sie den gesamten Inhalt von proc / [pid] ~ Von map_files bis numa_maps ~
[Pythonista] Die Geschichte einer Aktion zum Kopieren ausgewählten Textes
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
Lesen Sie den gesamten Inhalt von proc / [pid] ~ Von attr bis cpuset ~
Die Geschichte, dass "calendar.day_abbr" auf dem Admin-Bildschirm von django nicht aktualisiert werden konnte
Von der Installation von Elasticsearch bis zur Dateneingabe
Die Geschichte von Python und die Geschichte von NaN
Existenz aus Sicht von Python
Die Geschichte des "Lochs" in der Akte
Die Geschichte des erneuten Bereitstellens des Anwendungsservers
Ergänzung zur Erklärung von vscode
Die Geschichte des Exportierens eines Programms
Eine Geschichte über das Erstellen eines Programms, mit dem die Anzahl der Instagram-Follower in einer Woche von 0 auf 700 erhöht wird
Laden Sie Daten mit einem Befehl und einer Aktualisierung auf s3 von aws hoch und löschen Sie die verwendeten Daten (unterwegs).
Von der Einführung der GoogleCloudPlatform Natural Language API bis zur Verwendung
Über die Reihenfolge des Lernens von Programmiersprachen (vom Anfänger bis zum Fortgeschrittenen) Teil 2
Vergleich von R, Python, SAS, SPSS aus Sicht europäischer Datenwissenschaftler