Cómo cargar un archivo csv.gpg desde GCS a Bigquery utilizando airflow o python.
Tenemos un requisito para descifrar y cargar archivos .gpg desde GCS a BigQuery en Airflow. ¿Existe alguna manera más fácil y rápida de descifrar y cargar al mismo tiempo desde GCS a BQ?
El proceso que he utilizado:
1. Descargar el archivo al servidor local.
2. Descifrar y cargar el mismo en GCS.
3. Cargar desde GCS a BQ.
import pgpy
import os
from google.cloud import secretmanager
from google.cloud import storage
from io import BytesIO
def upload_to_bucket(blob_name, output, bucket_name):
storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)
blob = bucket.blob(blob_name)
blob.upload_from_string(data=output.read())
output.close()
return blob.public_url
def get_secret(project, key_id, version):
client = secretmanager.SecretManagerServiceClient()
name=f"projects/{project}/secrets/{key_id}/versions/{version}"
response = client.access_secret_version(request={"name": name})
return response.payload.data.decode('ascii')
fetch_key = get_secret('project', 'secret_key', version)
key, _ = pgpy.PGPKey.from_blob(fetch_key)
storage_client = storage.Client()
bucket = storage_client.get_bucket('bucket_name')
blob = bucket.blob('test.csv.gpg')
local_path=os.path.join(os.getcwd(),'teest.csv.gpg')
blob.download_to_filename(os.path.join(os.getcwd(),'test.csv.gpg'))
print(local_path)
msg_encrypted = pgpy.PGPMessage.from_file(local_path)
msg_plaintext = BytesIO((key.decrypt(msg_encrypted).message))
print(msg_plaintext)
g=upload_to_bucket('test.csv', msg_plaintext, 'buckeet')
print(g)
os.remove(local_path)
¿Tenemos alguna opción para leer directamente desde GCS y cargar en BQ?
davy.ai
Sí, puede utilizar Google Cloud Storage para cargar directamente los datos descifrados en BigQuery utilizando el método
load
de la APIbigquery
. Puede leer el archivo .gpg desde GCS utilizando la bibliotecagoogle-cloud-storage
, y luego descifrarlo utilizandopgpy
. Una vez que tenga el archivo descifrado como una cadena, puede pasarlo al métodoload
para cargarlo en BigQuery.Aquí hay una posible implementación:
Este código lee la clave secreta de Google Cloud Secret Manager, luego descarga el archivo .gpg desde GCS y lo descifra utilizando
pgpy
. Los datos descifrados se cargan en BigQuery utilizando el métodoload_table_from_file
, que acepta un objeto similar a un archivo que contiene datos CSV. El objetoconfiguracion_trabajo
especifica el formato de entrada y algunas configuraciones opcionales. Una vez que se lanza el trabajo, esperamos hasta que se complete utilizando el métodoresult
.Este método debería ser más rápido y eficiente que descargar el archivo a un servidor local y volver a cargarlo en GCS.