Posted on


Saat mengadopsi komputasi awan, salah satu permintaan utama terutama di dalam industri yang diatur (misalnya keuangan, perawatan kesehatan, pemerintah, telekomunikasi, dll.) Adalah kemampuan untuk memiliki kendali penuh atas data. Dalam pengalaman saya dengan tim jasa keuangan, kontrol penuh atas data biasanya diterjemahkan menjadi

  1. Mengontrol lokasi pemrosesan data dan sistem penyimpanan data
  2. Mengontrol kunci untuk mengenkripsi pipa data

Memiliki kontrol penuh pada lokasi dan enkripsi adalah mode operasi yang relatif baik untuk sistem penyimpanan baik di dalam maupun di luar premis. Namun mengelola lokasi dan enkripsi untuk streaming analitik membutuhkan sedikit lebih banyak pertimbangan karena melibatkan banyak komponen dalam pemrosesan dan dalam analisis streaming Anda perlu melindungi data saat istirahat serta selama pemrosesan.

Posting blog ini adalah upaya saya untuk menunjukkan bagaimana pipa analitik streaming di Google Cloud menggunakan Pubsub, Apache Beam (pada Dataflow Runner), Cloud Storage dan BigQuery dapat dieksekusi di satu wilayah dan dilindungi ujung ke ujung menggunakan Kunci Enkripsi yang dikelola pelanggan (CMEK). Pipa ini cukup sederhana seperti yang ditunjukkan di bawah ini.

GCP Pipa Streaming SederhanaUntuk menjalankan pipa ini, saya perlu mengatur cincin dan kunci kunci enkripsi serta sumber, wastafel, dan komponen lainnya.

Tetapkan metadata tingkat proyek

PROJECT_ID=XXXXXXXXXXXXXX
PROJECT_NUMBER=nnnnnnnnnnn
REGION=europe-west2
TOPIC_NAME=str-pl-pubsub-topic
DATASET_NAME=da_streaming_pipeline
TABLE_NAME_1=cc_account_info
STAGING_LOCATION=gs://da_streaming_pipeline/stage
TEMP_LOCATION=gs://da_streaming_pipeline/temp
export PROJECT_ID PROJECT_NUMBER REGION TOPIC_NAME DATASET_NAME TABLE_NAME_1 STAGING_LOCATION TEMP_LOCATION

Kunci Enkripsi Pengaturan

Di sini saya akan membuat dua set kunci enkripsi. Satu kunci regional untuk topik pubsub dan dataset BigQuery dan kunci global untuk DataFlow. Kunci global diperlukan karena DataFlow tidak memiliki titik akhir di Eropa-West2 (London). Untuk memproses data menggunakan node pekerja di Eropa-West2 (London), konfigurasi adalah menggunakan titik akhir Dataflow di Eropa-West1 (Belgia) dan Zone for Worker Node di Eropa-West2 (London). Kunci global tidak diperlukan dalam skenario di mana node pekerja Dataflow berada di wilayah yang sama dengan titik akhir regionalnya.

Create a CMEK key in London which should be used by PubSub and BigQuery.

gcloud kms keyrings create str-pl-london-kr --location ${REGION}
gcloud kms keys create str-pl-london-key01 --location ${REGION} --keyring str-pl-london-kr --purpose encryption

Create a Global CMEK key which should be used by Dataflow.

gcloud kms keyrings create str-pl-global-kr --location global
gcloud kms keys create str-pl-global-key01 --location global --keyring str-pl-global-kr --purpose encryption

Hibah izin yang diperlukan untuk akun layanan

Hibah izin untuk mengenkripsi dan mendekripsi data menggunakan CMEK ke akun layanan untuk pubsub, bigquery dan dataflow

Grant permission to PubSub service account

gcloud projects add-iam-policy-binding ${PROJECT_ID} --member="serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" --role="roles/cloudkms.cryptoKeyEncrypterDecrypter"

Grant permission to BigQuery service accounts

gcloud kms keys add-iam-policy-binding --project=data-analytics-bk --member serviceAccount:bq-${PROJECT_NUMBER}@bigquery-encryption.iam.gserviceaccount.com --role roles/cloudkms.cryptoKeyEncrypterDecrypter --location=${REGION} --keyring=str-pl-london-kr str-pl-london-key01

Grant permission to Dataflow and Compute engine service accounts as required by Dataflow.

gcloud projects add-iam-policy-binding ${PROJECT_ID} --member serviceAccount:service-${PROJECT_NUMBER}@dataflow-service-producer-prod.iam.gserviceaccount.com --role roles/cloudkms.cryptoKeyEncrypterDecrypter
gcloud projects add-iam-policy-binding ${PROJECT_ID} --member serviceAccount:service-${PROJECT_NUMBER}@compute-system.iam.gserviceaccount.com --role roles/cloudkms.cryptoKeyEncrypterDecrypter

Grant permission to Storage Service account to use Cloud KMS key

gsutil kms authorize -p ${PROJECT_ID} -k projects/${PROJECT_ID}/locations/${REGION}/keyRings/str-pl-london kr/cryptoKeys/str-pl-london-key01

Mengatur topik pubsub untuk konsumsi data

Build KEY Resource ID

KEY_ID=projects/${PROJECT_ID}/locations/${REGION}/keyRings/str-pl-london-kr/cryptoKeys/str-pl-london-key01
export KEY_ID

Create PubSub Topic

gcloud pubsub topics create ${TOPIC_NAME} --message-storage-policy-allowed-regions=${REGION} --topic-encryption-key=$KEY_ID

Confirm that the key has been created using

gcloud pubsub topics describe ${TOPIC_NAME}

Mengatur Dataset dan Tabel BigQuery

Create a dataset (da_streaming_pipeline) in London region with default encryption using CMEK key ${KEY_ID}.

bq --location=${REGION} mk --dataset --description "dataset for streaming pipeline sink" --default_kms_key ${KEY_ID} ${PROJECT_ID}:${DATASET_NAME}
Create Sink TABLE for Raw data

bq query --use_legacy_sql=false "
   CREATE TABLE ${DATASET_NAME}.${TABLE_NAME_1}
       (
         name STRING,
         address STRING,
         country_code STRING,
         city STRING,
         bank_iban STRING,
         company STRING,
         credit_card INT64,
         credit_card_provider STRING,
         credit_card_expires STRING,
         date_record_created DATETIME,
         employement STRING,
         emp_id STRING,
         name_prefix STRING,
         phone_number STRING
       )
   OPTIONS(
      description='Sink table to collect data after processing by dataflow for streaming pipeline'
   )
"

Mengatur ember GCS yang dilindungi CMEK

Setup CMEK protected GCS buckets for Staging and Temp locations

gsutil mb -c regional -l europe-west2 gs://da_streaming_pipeline
gsutil kms encryption -k projects/${PROJECT_ID}/locations/${REGION}/keyRings/str-pl-london-kr/cryptoKeys/str-pl-london-key01 gs://da_streaming_pipeline

Menjalankan pipa streaming

Untuk pipa ini saya menggunakan balok Python SDK versi 2.16 dengan Python 2.7. Pipa ini cukup sederhana seperti yang dijelaskan di atas. Skrip generator data yang ditulis dalam Python menghasilkan detail pelanggan bank termasuk alamat dan informasi kartu kredit menggunakan Paket Python Faker dan mendorong ke topik pubsub. Kode untuk generator data ini tersedia dari saya Repositori GitHub.

Menghasilkan data dan konsumsi ke pubsub

./datagen.py -d pubsub -p data-analytics-bk -t str-pl-pubsub-topic -n 100000

Mulai Pipa Pemrosesan Data Menggunakan DataFlow Runner

Kode untuk pipa ini tersedia dari saya Repositori GitHub. Kode pipa inti ditunjukkan di bawah ini. Perlu dicatat bahwa kode pipa balok atau opsi pipa tidak memiliki instruksi khusus untuk menangani enkripsi yang dikelola pelanggan atau pembatasan geo. Itu adalah parameter konfigurasi sumber, wastafel dan dataflow.

with beam.Pipeline(options=pipeline_options) as pipeline:
   (
       pipeline
       | "Read PubSub messages" >> beam.io.ReadFromPubSub(topic=pubsub_topic)
       | "Decode PubSub messages" >> beam.Map(lambda x: x.decode('utf-8'))
       | "Convert to Dictionary" >> beam.ParDo(convertToDict())
       | "Write to BigQuery" >> beam.io.WriteToBigQuery('penyimpanan:da_streaming_pipeline.cc_account_info'.format(project_name), schema=schema, write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND)
   )

Perintah berikut akan memulai pipa streaming menggunakan Google Dataflow Runner.

python -m streaming_simple_pipeline \
 --project_name XXXXXXXXXXXXXX \
 --pubsub_topic projects/XXXXXXXXXXXX/topics/str-pl-pubsub-topic \
 --streaming \
 --runner Dataflow \
 --staging_location gs://da_streaming_pipeline/stage \
 --temp_location gs://da_streaming_pipeline/temp \
 --region europe-west1 --zone=europe-west2-b \
 --dataflow_kms_key projects/XXXXXXXXXXXX/locations/global/keyRings/str-pl-global-kr/cryptoKeys/str-pl-global-key01

Dari Cloud Dataflow Console, Anda dapat melihat bahwa pipa menggunakan kunci yang dikelola pelanggan dan dieksekusi di zona tertentu di wilayah GCP Eropa-West2 (London).

Dataflow dengan CMEK dan geo-restriction

Mencabut kunci

Untuk menghentikan akses ke data, kunci enkripsi dapat dicabut yang akan mengakibatkan kegagalan pipa dataflow. Selain itu, setiap upaya untuk mengakses data dari wastafel akan mengembalikan kesalahan.

Revoke keys

gcloud kms keys versions disable 1 --location europe-west2 --keyring str-pl-london-kr --key str-pl-london-key01

gcloud kms keys versions disable 1 --location global --keyring str-pl-global-kr --key str-pl-global-key01

Kesalahan Pipa Dataflow:

Error_message_df

Kesalahan dikembalikan dari BigQuery:

ERROR_MESSAGE_BQ

Pengamatan lainnya

Biasanya kinerja adalah salah satu kekhawatiran saat mengenkripsi dan mendekripsi data. Dalam tes kecil saya, saya tidak mengamati perbedaan kinerja saat menggunakan CMEK vs Google Managed Key untuk pipa. Namun kinerja, sampai batas tertentu, akan tergantung pada jenis dan volume data dan beban kerja dan karenanya layak menghabiskan beberapa siklus pengujian untuk menguji kinerja pipa saat menggunakan CMEK.

Semoga posting ini bermanfaat bagi orang-orang yang mempertimbangkan untuk mengembangkan dan menggunakan pipa streaming berbasis balok Apache di Google Cloud dengan restriksi geo dan memiliki kebutuhan untuk melindungi menggunakan CMEK. Terima kasih sudah membaca.



Leave a Reply

Your email address will not be published. Required fields are marked *