১. ভূমিকা
আধুনিক এন্টারপ্রাইজ ডেটা ক্লাউডে, যেখানে ডেটা বিভিন্ন ফিজিক্যাল স্টোরেজ সিস্টেমে থাকে, সেখানে খণ্ডিত নিরাপত্তার একটি বিশাল স্থাপত্যগত চ্যালেঞ্জ রয়েছে।
যখন ডেটা গুগল ক্লাউড স্টোরেজে Parquet-এর মতো ওপেন-সোর্স ফরম্যাটে ভৌতভাবে সংরক্ষিত থাকে এবং BigQuery SQL বা Apache Spark-এর মতো একাধিক ভিন্ন ইঞ্জিন দ্বারা কোয়েরি করা হয়, তখন আপনি কীভাবে নিশ্চিত করেন যে সংবেদনশীল ডেটা (যেমন আর্থিক লেনদেনের পরিমাণ) ধারাবাহিকভাবে সুরক্ষিত থাকে?
এই কোডল্যাবে, আপনি অ্যাপাচি আইসবার্গ টেবিল , বিগকোয়েরি এবং ডেটাপ্লেক্স ইউনিভার্সাল ক্যাটালগ ব্যবহার করে একটি গভর্নড ডেটা লেকহাউস আর্কিটেকচার তৈরি করবেন যা এই সমস্যাগুলো সমাধান করে। আপনি জিরো-ট্রাস্ট নিরাপত্তা নীতি নির্ধারণ করতে এবং কীভাবে সেগুলো বিভিন্ন কম্পিউট ইঞ্জিনে গতিশীলভাবে প্রয়োগ করা হয় তা জানতে ইনফ্রাস্ট্রাকচার অ্যাজ কোড (IaC) ব্যবহার করবেন।
পূর্বশর্ত
- বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট।
- SQL, IAM, এবং ক্লাউড স্টোরেজ ধারণা সম্পর্কে প্রাথমিক জ্ঞান।
আপনি যা শিখবেন
- BigQuery-তে Apache Iceberg-এর জন্য কীভাবে BigLake টেবিল তৈরি করবেন, যেখানে ডেটা স্বাভাবিকভাবেই ক্লাউড স্টোরেজে সংরক্ষিত থাকে।
- কলাম-স্তরের নিরাপত্তা এবং ডেটা মাস্কিংয়ের জন্য পলিসি ট্যাগ ব্যবহার করে কীভাবে কেন্দ্রীভূত ডেটা নীতি প্রয়োগ করা যায়।
- ক্লাউড রিসোর্স সংযোগ ব্যবহার করে কীভাবে ফিজিক্যাল স্টোরেজ অ্যাক্সেসকে লজিক্যাল ডেটা অ্যাক্সেস থেকে বিচ্ছিন্ন করা যায়।
- ওপেন-সোর্স ইঞ্জিনগুলো যাতে গভর্নেন্স এড়িয়ে যেতে না পারে, তা নিশ্চিত করতে অ্যাপাচি স্পার্কের জন্য গুগল ক্লাউড সার্ভারলেস ব্যবহার করে কীভাবে জিরো-ট্রাস্ট কম্পিউট ডেলিগেশন প্রয়োগ করা যায়।
- স্বয়ংক্রিয় ডেটা লিনিয়েজ কীভাবে ভিজ্যুয়ালাইজ করা যায়।
স্থাপত্যের সংক্ষিপ্ত বিবরণ: আইসবার্গে সার্বজনীন শাসনব্যবস্থা

ওপেন-সোর্স ডেটা ফরম্যাটে সূক্ষ্ম অ্যাক্সেস নিয়ন্ত্রণ (যেমন কলাম-স্তরের নিরাপত্তা এবং ডেটা মাস্কিং) অর্জন করতে হলে, আপনাকে একটি কঠোর এবং সমন্বিত নিরাপত্তা কাঠামো প্রতিষ্ঠা করতে হবে।
চিত্রে যেমন দেখানো হয়েছে, এই নিয়ন্ত্রিত লেকহাউস নকশাটি খণ্ডিত নিরাপত্তা সমস্যা সমাধানের জন্য দুটি প্রধান স্তম্ভের উপর নির্ভর করে:
🛡️ সুরক্ষিত স্থাপত্য স্তরসমূহ (বাম)
ব্যবহারকারী বা বাহ্যিক ইঞ্জিনকে সরাসরি ক্লাউড স্টোরেজ অ্যাক্সেস করার অনুমতি দেওয়ার পরিবর্তে—যা কেবল বিস্তৃত বাকেট-স্তরের নিরাপত্তা সমর্থন করে—আপনি একটি সুরক্ষিত ভিত্তি তৈরি করেন।
- উন্মুক্ত ফরম্যাট, পরিচালিত মেটাডেটা: ডেটা ভৌতভাবে উন্মুক্ত অ্যাপাচি আইসবার্গ (পার্কেট) ফরম্যাট ব্যবহার করে ক্লাউড স্টোরেজে থাকে, এবং বিগলেক নির্বিঘ্নে এর নিয়ন্ত্রক মেটাডেটা পরিচালনা করে।
- যৌক্তিক নিরাপত্তা সীমানা: আপনি একটি সুরক্ষিত ক্লাউড রিসোর্স সংযোগ ব্যবহার করে ভৌত স্টোরেজ অ্যাক্সেসকে যৌক্তিক ডেটা অ্যাক্সেস থেকে পৃথক করেন। শেষ ব্যবহারকারীদের কখনোই মূল GCS ফাইলগুলিতে সরাসরি ভৌত IAM অ্যাক্সেস দেওয়া হয় না।
- জিরো-ট্রাস্ট কম্পিউট ডেলিগেশন: কোনো এক্সিকিউশন ইঞ্জিন যাতে গভর্নেন্সের নিয়মগুলো এড়িয়ে যেতে না পারে, তা নিশ্চিত করার জন্য সমস্ত ডেটা রিড রিকোয়েস্ট কঠোরভাবে BigQuery স্টোরেজ API-এর মাধ্যমে রাউট করা হয়। কোয়েরিটি নেটিভ BigQuery SQL বা ওপেন-সোর্স Apache Spark থেকে আসুক না কেন, এই নিয়মটি প্রযোজ্য।
🎯 কেন্দ্রীভূত নীতি প্রয়োগ (সঠিক)
সুরক্ষিত ভিত্তি স্থাপিত হওয়ায়, ডেটাপ্লেক্স শাসনব্যবস্থার সমন্বিত মস্তিষ্ক হিসেবে কাজ করে:
- একবার নির্ধারণ করুন, সর্বত্র প্রয়োগ করুন: আপনি ডেটাপ্লেক্সে আপনার পলিসি ট্যাগগুলি কেবল একবারই নির্ধারণ করেন, এবং এর আর্কিটেকচারটি সমস্ত সমর্থিত এক্সিকিউশন রানটাইম জুড়ে সার্বজনীনভাবে সামঞ্জস্যপূর্ণ মাস্কিং নিয়ম প্রয়োগ করে।
- ডাইনামিক ডেটা মাস্কিং: যখন ডেটা কোয়েরি করা হয়, তখন সিস্টেম তাৎক্ষণিকভাবে ব্যবহারকারীর পরিচয় যাচাই করে। অনুমোদিত ব্যবহারকারীরা SQL এবং Spark উভয় ক্ষেত্রেই মূল, মাস্কবিহীন মান (যেমন, 100.0) দেখতে পেলেও, সীমাবদ্ধ ব্যবহারকারীরা উভয় ইঞ্জিনেই সীমাবদ্ধ কলামগুলোর জন্য স্বয়ংক্রিয়ভাবে মাস্ক করা NULL মান পাবেন।
- স্বয়ংক্রিয় ডেটা লিনিয়েজ: ডেটা প্রবাহিত ও রূপান্তরিত হওয়ার সাথে সাথে, ডেটাপ্লেক্স স্বয়ংক্রিয়ভাবে রূপান্তরের মেটাডেটা সংগ্রহ করে, যার ফলে কোনো কাস্টম লগিং কোডের প্রয়োজন ছাড়াই অন্তর্নির্মিত এন্ড-টু-এন্ড নিরীক্ষাযোগ্যতা এবং সন্ধানযোগ্যতার সুবিধা পাওয়া যায়।
২. সেটআপ এবং প্রয়োজনীয়তা
ক্লাউড শেল শুরু করুন
যদিও গুগল ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যায়, এই কোডল্যাবে আপনি গুগল ক্লাউড শেল ব্যবহার করবেন, যা ক্লাউডে চলমান একটি কমান্ড লাইন পরিবেশ।
গুগল ক্লাউড কনসোল থেকে, উপরের ডানদিকের টুলবারে থাকা ক্লাউড শেল আইকনটিতে ক্লিক করুন:

পরিবেশটি প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগবে। এটি শেষ হলে, আপনি এইরকম কিছু দেখতে পাবেন:

এই ভার্চুয়াল মেশিনটিতে আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার সমস্ত কাজ একটি ব্রাউজারের মধ্যেই করা যাবে। আপনাকে কিছুই ইনস্টল করতে হবে না।
পরিবেশ প্রারম্ভিক করুন
ক্লাউড শেল খুলুন এবং আপনার প্রোজেক্ট ভেরিয়েবলগুলো সেট করুন, যাতে সমস্ত কমান্ড সঠিক ইনফ্রাস্ট্রাকচারকে টার্গেট করে।
export PROJECT_ID=$(gcloud config get-value project)
export REGION="us-central1"
export ICEBERG_BUCKET="iceberg-retail-demo-${PROJECT_ID}"
export DATASET_ID="lakehouse_retail_demo"
export CONN_NAME="iceberg-bq-conn-demo"
এরপর আমাদের দুটি ব্যক্তিত্বকে সংজ্ঞায়িত করুন।
export USER_ANALYST="retail-analyst-demo"
export EMAIL_ANALYST="${USER_ANALYST}@${PROJECT_ID}.iam.gserviceaccount.com"
export USER_MANAGER="retail-manager-demo"
export EMAIL_MANAGER="${USER_MANAGER}@${PROJECT_ID}.iam.gserviceaccount.com"
export CURRENT_USER=$(gcloud config get-value account)
এপিআই সক্ষম করুন
প্রয়োজনীয় গুগল ক্লাউড পরিষেবাগুলো সক্রিয় করুন।
gcloud services enable \
bigquery.googleapis.com \
bigqueryconnection.googleapis.com \
datacatalog.googleapis.com \
bigquerydatapolicy.googleapis.com \
datalineage.googleapis.com \
dataplex.googleapis.com \
dataproc.googleapis.com \
storage-component.googleapis.com
কোডল্যাব সোর্স কোড ডাউনলোড করুন
আপনার ক্লাউড শেলকে অতিরিক্ত ফাইল দিয়ে ভর্তি হওয়া থেকে বাঁচাতে, আপনি গুগল ক্লাউড ডেভরেল রিপোজিটরি থেকে এই কোডল্যাবের জন্য শুধুমাত্র প্রয়োজনীয় পাইথন স্ক্রিপ্টগুলো ডাউনলোড করতে একটি স্পার্স চেকআউট করবেন।
# Shallow clone without full history
git clone --depth 1 --filter=blob:none --sparse https://github.com/GoogleCloudPlatform/devrel-demos.git
cd devrel-demos
# Download only the specific folder
git sparse-checkout set data-analytics/governed-lakehouse
cd data-analytics/governed-lakehouse
স্টোরেজ তৈরি করুন
অত্যন্ত সুরক্ষিত ও নিয়ন্ত্রিত আইসবার্গ ডেটা সংরক্ষণের জন্য বাকেটটি তৈরি করুন।
gcloud storage buckets create gs://${ICEBERG_BUCKET} --location=${REGION}
পরিচয় ও নিরাপত্তা প্রস্তুত করুন
ক্লাউড রিসোর্স সংযোগটি কনফিগার করুন। এটিই একমাত্র সত্তা যার কাছে আইসবার্গ ফাইলগুলি পড়ার জন্য স্থায়ী ফিজিক্যাল IAM কী থাকে।
# Create the BigQuery connection
bq mk --connection \
--connection_type=CLOUD_RESOURCE \
--location=${REGION} \
${CONN_NAME}
# Retrieve the connection's automatically generated Service Account
export BQ_CONN_SVC_ACCT=$(bq show --format=json --connection ${REGION}.${CONN_NAME} \
| jq -r '.cloudResource.serviceAccountId')
# Grant Storage Object Admin to the connection for the Iceberg bucket
gcloud storage buckets add-iam-policy-binding gs://${ICEBERG_BUCKET} \
--member="serviceAccount:${BQ_CONN_SVC_ACCT}" \
--role="roles/storage.objectAdmin" \
--quiet
এরপর, ইউজার পারসোনাগুলো সেট আপ করুন। ব্যবহারকারীদের লজিক্যাল অ্যাক্সেস দেওয়া হয়, ফিজিক্যাল স্টোরেজ অ্যাক্সেস নয়। IAM প্রোপাগেশন বিলম্বের কারণে সৃষ্ট ত্রুটি এড়াতে, আপনি প্রথমে অ্যাকাউন্টগুলো তৈরি করবেন, কয়েক সেকেন্ড অপেক্ষা করবেন এবং তারপরে তাদের ভূমিকা নির্ধারণ করবেন।
echo "Creating Service Accounts..."
for USER in "${USER_ANALYST}" "${USER_MANAGER}"; do
gcloud iam service-accounts create ${USER} --display-name="Lakehouse ${USER}"
done
echo "⏳ Waiting 15 seconds for IAM propagation..."
sleep 15
echo "Granting IAM Roles to Service Accounts..."
for USER in "${USER_ANALYST}" "${USER_MANAGER}"; do
EMAIL="${USER}@${PROJECT_ID}.iam.gserviceaccount.com"
# Allow Cloud Shell to impersonate them for testing
gcloud iam service-accounts add-iam-policy-binding ${EMAIL} \
--member="user:${CURRENT_USER}" \
--role="roles/iam.serviceAccountTokenCreator" \
--quiet
# Allow logical viewing of the catalog, querying, and running Dataproc jobs
for ROLE in "roles/datacatalog.viewer" "roles/bigquery.dataViewer" "roles/bigquery.user" "roles/bigquery.connectionUser" "roles/serviceusage.serviceUsageConsumer" "roles/dataproc.worker"; do
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${EMAIL}" \
--role="${ROLE}" \
--quiet
done
done
# Grant the Manager data creation rights
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${EMAIL_MANAGER}" \
--role="roles/bigquery.dataEditor" \
--quiet
echo "✅ Identity and Security setup completed!"
৩. BigLake-এর মাধ্যমে নেটিভ Iceberg টেবিল তৈরি করুন
আপনি বিগলেকের নিজস্ব সক্ষমতা ব্যবহার করে ম্যানেজড আইসবার্গ টেবিলগুলো তৈরি করবেন।
BigQuery ডেটাসেট তৈরি করুন
প্রথমে, আমাদের আইসবার্গ টেবিলগুলোকে যৌক্তিকভাবে গ্রুপ করার জন্য একটি BigQuery ডেটাসেট তৈরি করুন।
echo "Creating BigQuery Dataset..."
bq mk --location=${REGION} --dataset ${PROJECT_ID}:${DATASET_ID}
আইসবার্গ টেবিলগুলো তৈরি করুন
এরপর, টেবিলগুলো তৈরি করতে নিচের কমান্ডগুলো চালান। OPTIONS ব্লকটি লক্ষ্য করুন, যেখানে আমরা table_format = 'ICEBERG' নির্দিষ্ট করেছি এবং এটিকে সরাসরি আমাদের ক্লাউড স্টোরেজ বাকেট ও কানেকশনের সাথে ম্যাপ করেছি।
echo "Creating Iceberg tables..."
# Inventory table
bq query --use_legacy_sql=false \
"CREATE OR REPLACE TABLE \`${PROJECT_ID}.${DATASET_ID}.inventory\` (
product_id INT64,
product_name STRING,
stock_count INT64
)
WITH CONNECTION \`${REGION}.${CONN_NAME}\`
OPTIONS (
file_format = 'PARQUET',
table_format = 'ICEBERG',
storage_uri = 'gs://${ICEBERG_BUCKET}/inventory/'
);"
# Transactions table
bq query --use_legacy_sql=false \
"CREATE OR REPLACE TABLE \`${PROJECT_ID}.${DATASET_ID}.transactions\` (
id INT64,
item STRING,
amount FLOAT64,
transaction_date DATE
)
WITH CONNECTION \`${REGION}.${CONN_NAME}\`
OPTIONS (
file_format = 'PARQUET',
table_format = 'ICEBERG',
storage_uri = 'gs://${ICEBERG_BUCKET}/transactions/'
);"
টেবিলগুলো ডেটা দিয়ে পূরণ করুন।
অবশেষে, নতুন তৈরি করা আইসবার্গ টেবিলগুলোতে নমুনা ডেটা সন্নিবেশ করুন।
echo "Inserting data into Iceberg tables..."
# Insert into Inventory table
bq query --use_legacy_sql=false \
"INSERT INTO \`${PROJECT_ID}.${DATASET_ID}.inventory\` (product_id, product_name, stock_count)
VALUES (101, 'Widget A', 500), (102, 'Widget B', 250), (103, 'Widget C', 800);"
# Insert into Transactions table
bq query --use_legacy_sql=false \
"INSERT INTO \`${PROJECT_ID}.${DATASET_ID}.transactions\` (id, item, amount, transaction_date)
VALUES
(1, 'Widget A', 100.0, DATE '2024-01-01'),
(2, 'Widget B', 150.0, DATE '2024-01-02'),
(3, 'Widget C', 50.0, DATE '2024-01-03');"
এখন আপনার কাছে দুটি সম্পূর্ণ কার্যকরী আইসবার্গ টেবিল আছে। বিগলেক মেটাডেটা পরিচালনা করে, কিন্তু ফিজিক্যাল পার্কেট ফাইলগুলো আপনার GCS বাকেটে নিরাপদে থাকে!
একটি ETL পাইপলাইন অনুকরণ করুন
বাস্তব ক্ষেত্রে, ব্যবসায়িক রিপোর্টিংয়ের জন্য প্রায়শই কাঁচা ডেটা একত্রিত করে সারসংক্ষেপ টেবিল তৈরি করা হয়। চলুন, একজন ডেটা ইঞ্জিনিয়ারের ভূমিকা পালন করে আমাদের কাঁচা লেনদেনের ডেটা থেকে একটি দৈনিক বিক্রয় সারসংক্ষেপ টেবিল তৈরি করি।
(দ্রষ্টব্য: এই ধাপটি এখনই চালান, যাতে গুগল ক্লাউড ব্যাকগ্রাউন্ড মেটাডেটা প্রসেস করার জন্য যথেষ্ট সময় পায়। কোডল্যাবের পরবর্তী অংশে আপনি জানতে পারবেন কেন এটি গুরুত্বপূর্ণ!)
echo "Creating transactions summary table..."
bq query --use_legacy_sql=false \
"CREATE TABLE \`${PROJECT_ID}.${DATASET_ID}.transactions_summary\` AS
SELECT transaction_date, SUM(amount) as total_sales, COUNT(id) as transaction_count
FROM \`${PROJECT_ID}.${DATASET_ID}.transactions\`
GROUP BY transaction_date;"
৪. কেন্দ্রীভূত শাসনব্যবস্থা: পাইথন ব্যবহার করে নীতিমালা নির্ধারণ করুন
প্রোডাকশন এনভায়রনমেন্টে, UI-এর মাধ্যমে গভর্নেন্স পলিসি কনফিগার করা স্কেল করা এবং রক্ষণাবেক্ষণ করা কঠিন। এর পরিবর্তে, Infrastructure as Code (IaC) ব্যবহার করার জন্য জোরালোভাবে সুপারিশ করা হয়।
এই অংশে, আপনি গুগল ক্লাউড পাইথন এসডিকে ব্যবহার করে ধাপে ধাপে প্রোগ্রাম্যাটিকভাবে আপনার জিরো-ট্রাস্ট গভর্নেন্স নিয়মগুলো তৈরি ও প্রয়োগ করবেন।
পাইথন পরিবেশ সেট আপ করুন
প্রথমে, লাইব্রেরির দ্বন্দ্ব এড়াতে একটি বিচ্ছিন্ন পাইথন পরিবেশ ( venv ) তৈরি করে নিই এবং প্রয়োজনীয় গুগল ক্লাউড এসডিকেগুলো ইনস্টল করে নিই।
ক্লাউড শেলে নিম্নলিখিত কমান্ডগুলি চালান:
# Create and activate a virtual environment
python3 -m venv lakehouse_env
source lakehouse_env/bin/activate
# Install required Dataplex and BigQuery governance libraries
pip install google-cloud-datacatalog google-cloud-bigquery-datapolicies google-cloud-bigquery --quiet
echo "✅ Python environment is ready!"
ট্যাক্সোনমি এবং পলিসি ট্যাগ তৈরি করুন
ট্যাক্সোনমি হলো একটি যৌক্তিক ধারক, এবং পলিসি ট্যাগ হলো সেই নির্দিষ্ট লেবেল যা আপনি আমাদের সংবেদনশীল কলামে সংযুক্ত করবেন। কলাম-স্তরের নিরাপত্তা প্রয়োগ করতে, আপনার প্রথমে একটি যৌক্তিক ধারক (ট্যাক্সোনমি) এবং একটি নির্দিষ্ট লেবেল (পলিসি ট্যাগ) প্রয়োজন।
আপনি যদি 1_create_taxonomy.py ফাইলের ভেতরে দেখেন, তাহলে নিম্নলিখিত মূল লজিকটি দেখতে পাবেন:
# Create Taxonomy with Fine-Grained Access Control enabled
taxonomy = datacatalog_v1.Taxonomy(
display_name="BusinessCritical",
activated_policy_types=[datacatalog_v1.Taxonomy.PolicyType.FINE_GRAINED_ACCESS_CONTROL]
)
created_taxonomy = client.create_taxonomy(parent=parent, taxonomy=taxonomy)
# Create Policy Tag inside the Taxonomy
policy_tag = datacatalog_v1.PolicyTag(display_name="RestrictedFinancial")
created_policy_tag = client.create_policy_tag(parent=created_taxonomy.name, policy_tag=policy_tag)
FINE_GRAINED_ACCESS_CONTROL পলিসি টাইপটি স্পষ্টভাবে সেট করার মাধ্যমে, আপনি একটি সাধারণ মেটাডেটা ট্যাগকে একটি কঠোর জিরো-ট্রাস্ট নিরাপত্তা সীমানায় রূপান্তরিত করেন। এই ট্যাগযুক্ত যেকোনো কলাম ডিফল্টরূপে সকল ব্যবহারকারীর অ্যাক্সেস অস্বীকার করবে।
রিসোর্সগুলো তৈরি করতে স্ক্রিপ্টটি চালান:
python 1_create_taxonomy.py
মাস্কিং নিয়ম (ডেটা নীতি) কনফিগার করুন
এখন, বিশেষাধিকারবিহীন কেউ ট্যাগ করা কলামটি কোয়েরি করলে কী ঘটবে তা আপনি নির্ধারণ করবেন। আপনি একটি ডেটা পলিসি তৈরি করবেন যা মানটিকে NULL হিসেবে ফেরত দিতে বাধ্য করবে এবং এই নিয়মটি অ্যানালিস্ট পার্সোনার সাথে সংযুক্ত করবেন।
2_create_masking.py ভিতরে, স্ক্রিপ্টটি আপনার সদ্য তৈরি করা পলিসি ট্যাগ আইডিটি ডায়নামিকভাবে খুঁজে বের করে এবং একটি ডেটা পলিসি প্রয়োগ করে:
# Define a Masking Policy that always returns NULL
data_policy = bigquery_datapolicies_v1.DataPolicy(
data_policy_id="mask_financial_null",
policy_tag=policy_tag_id,
data_policy_type=bigquery_datapolicies_v1.DataPolicy.DataPolicyType.DATA_MASKING_POLICY,
data_masking_policy=bigquery_datapolicies_v1.DataMaskingPolicy(
predefined_expression=bigquery_datapolicies_v1.DataMaskingPolicy.PredefinedExpression.ALWAYS_NULL
)
)
# ... (Policy creation code) ...
# Bind the Masked Reader role to the Analyst
iam_policy.bindings.add(
role="roles/bigquerydatapolicy.maskedReader",
members=[f"serviceAccount:{analyst_email}"]
)
এই কোডটি প্রোগ্রাম্যাটিকভাবে এমন একটি নিয়ম তৈরি করে যা অন্তর্নিহিত মানগুলোকে NULL হিসেবে ফেরত দিতে বাধ্য করে। এরপর এটি বিশেষভাবে Analyst পার্সোনাকে maskedReader IAM রোলটি অ্যাসাইন করে, যা নিশ্চিত করে যে তারা শুধুমাত্র ডেটার মাস্ক করা সংস্করণটিই দেখতে পাবে।
মাস্কিং নিয়মটি কনফিগার করতে স্ক্রিপ্টটি চালান:
python 2_create_masking.py
সূক্ষ্ম প্রবেশাধিকার প্রদান করুন
আমাদের জিরো-ট্রাস্ট সেটআপের কারণে, এই মুহূর্তে কেউ ট্যাগ করা কলামটি পড়তে পারবে না। আপনাকে অবশ্যই ম্যানেজার এবং আপনার ব্যক্তিগত অ্যাকাউন্টে সুস্পষ্টভাবে অ্যাক্সেসের অনুমতি দিতে হবে।
3_grant_access.py ভিতরে, আপনি সরাসরি পলিসি ট্যাগটির IAM পলিসি পরিবর্তন করেন:
# Grant original data read access
iam_policy.bindings.add(
role="roles/datacatalog.categoryFineGrainedReader",
members=[f"serviceAccount:{manager_email}", f"user:{current_user}"]
)
client.set_iam_policy(request=iam_policy_pb2.SetIamPolicyRequest(resource=policy_tag_id, policy=iam_policy))
categoryFineGrainedReader রোলটি যোগ করার ফলে এই নির্দিষ্ট প্রিন্সিপালগুলো মাস্কিং নিয়মগুলো এড়িয়ে গিয়ে সরাসরি, মাস্কিং-বিহীন ডেটা পড়তে পারে।
অ্যাক্সেস মঞ্জুর করতে স্ক্রিপ্টটি চালান:
python 3_grant_access.py
BigQuery টেবিলে পলিসি ট্যাগটি সংযুক্ত করুন
অবশেষে, আপনাকে এই লজিক্যাল পলিসি ট্যাগটি আমাদের ফিজিক্যাল আইসবার্গ টেবিল স্কিমার সাথে সংযুক্ত করতে হবে।
4_attach_tag.py স্ক্রিপ্টটি দেখুন। এই স্ক্রিপ্টটি BigQuery টেবিলের স্কিমা সংগ্রহ করে, ফিল্ডগুলোর মধ্যে দিয়ে যায় এবং বিশেষভাবে amount কলামে ট্যাগটি সংযুক্ত করে:
new_schema =[]
for field in table.schema:
if field.name == 'amount':
# Wrap the Policy Tag ID and attach it to the column
policy_tags_list = bigquery.PolicyTagList(names=[policy_tag_id])
new_field = bigquery.SchemaField(
name=field.name, field_type=field.field_type, mode=field.mode,
description=field.description, policy_tags=policy_tags_list
)
new_schema.append(new_field)
else:
new_schema.append(field)
# Update the table schema in BigQuery
table.schema = new_schema
client.update_table(table, ["schema"])
এই স্কিমা আপডেটটি প্রয়োগ করা হলে, BigLake তাৎক্ষণিকভাবে আমাদের Dataplex লজিক্যাল ট্যাগগুলিকে আপনার ক্লাউড স্টোরেজ বাকেটে সংরক্ষিত ফিজিক্যাল Parquet ফাইলগুলির সাথে সংযুক্ত করে দেয়।
টেবিলের স্কিমা আপডেট করতে স্ক্রিপ্টটি চালান:
python 4_attach_tag.py
৫. ডেটাপ্লেক্স পলিসি যাচাই করুন
আমাদের কেন্দ্রীভূত শাসনব্যবস্থা কার্যকর কিনা তা পরীক্ষা করার সময় এসেছে। ডেটাপ্লেক্সের নীতিমালা যে সর্বজনীনভাবে প্রয়োগ করা হয়, তা প্রমাণ করার জন্য আপনি দুটি ভিন্ন ইঞ্জিনে এটি পরীক্ষা করবেন।
BigQuery নেটিভ SQL ব্যবহার করে যাচাই করুন
প্রথমে, আপনি ক্লাউড শেল ব্যবহার করে আমাদের দুটি পার্সোনার পরিচয় ধারণ করবেন এবং বিগকোয়েরির নেটিভ এসকিউএল ইঞ্জিন ব্যবহার করে টেবিলটি কোয়েরি করবেন।
ম্যানেজার হিসেবে পরীক্ষা করুন (বিশেষাধিকারপ্রাপ্ত ব্যবহারকারী):
# Impersonate the manager
gcloud config set auth/impersonate_service_account ${EMAIL_MANAGER}
# Query the transactions table
bq query --use_legacy_sql=false "SELECT * FROM \`${PROJECT_ID}.${DATASET_ID}.transactions\`"
যেহেতু ম্যানেজারের ফাইন-গ্রেইনড রিডার রোল রয়েছে, তাই এটি প্রকৃত পরিমাণের মানগুলো দেখাবে।
+----+----------+--------+------------------+
| id | item | amount | transaction_date |
+----+----------+--------+------------------+
| 1 | Widget A | 100.0 | 2024-01-01 |
| 3 | Widget C | 50.0 | 2024-01-03 |
| 2 | Widget B | 150.0 | 2024-01-02 |
+----+----------+--------+------------------+
বিশ্লেষক হিসেবে পরীক্ষা করুন (সীমাবদ্ধ ব্যবহারকারী):
gcloud config set auth/impersonate_service_account ${EMAIL_ANALYST}
bq query --use_legacy_sql=false "SELECT * FROM \`${PROJECT_ID}.${DATASET_ID}.transactions\`"
ডেটাপ্লেক্স মাস্কিং নিয়মের কারণে, প্রতিটি সারির জন্য অ্যামাউন্ট কলামটি NULL হিসেবে ফেরত আসে।
+----+----------+--------+------------------+
| id | item | amount | transaction_date |
+----+----------+--------+------------------+
| 1 | Widget A | NULL | 2024-01-01 |
| 3 | Widget C | NULL | 2024-01-03 |
| 2 | Widget B | NULL | 2024-01-02 |
+----+----------+--------+------------------+
আপনার পরিচয় পুনরুদ্ধার করুন
আপনার অ্যাডমিন ব্যবহারকারী হিসেবে ফিরে আসতে ক্লাউড শেল প্রমাণীকরণ অবস্থা পরিষ্কার করুন।
# Unset impersonation
gcloud config unset auth/impersonate_service_account
অ্যাপাচি স্পার্ক (কম্পিউট ডেলিগেশন) ব্যবহার করে যাচাই করুন
যদি কোনো ডেটা সায়েন্টিস্ট এই টেবিলটি পড়ার জন্য অ্যাপাচি স্পার্ক ব্যবহার করেন, তাহলে কী হবে? যদি স্পার্ক সরাসরি ফিজিক্যাল GCS Parquet ফাইলগুলো পড়ে, তাহলে ডেটাপ্লেক্স মাস্কিং নিয়মগুলো সম্পূর্ণরূপে বাইপাস হয়ে যায়, কারণ ক্লাউড স্টোরেজ শুধুমাত্র বাকেট-লেভেল পারমিশন বোঝে।
এটি প্রতিরোধ করতে, আপনি Spark-BigQuery Connector ব্যবহার করে কম্পিউট ডেলিগেশন প্রয়োগ করেন। এই কানেক্টরটি একটি সুরক্ষিত সেতু হিসেবে কাজ করে, যা Spark রিড রিকোয়েস্টগুলোকে BigQuery Storage API-এর মাধ্যমে রাউট করে, যাতে Spark ক্লাস্টারে কোনো ডেটা পাঠানোর আগে Dataplex গভর্নেন্স নিয়মগুলো গতিশীলভাবে মূল্যায়ন করা হয়।
আপনার ডাউনলোড করা read_transactions.py স্ক্রিপ্টটির ভেতরের মূল লজিকটি দেখুন:
# Reading data via Compute Delegation (Dataplex policies are applied dynamically here)
df = spark.read \
.format("bigquery") \
.option("table", f"{project_id}.{dataset_id}.{table_name}") \
.load()
print("\n=== 📊 Data Preview ===")
df.show(truncate=False)
লক্ষ্য করুন যে আমরা Spark-কে Iceberg ফাইলগুলির gs:// পাথে নির্দেশ করছি না। .format("bigquery") উল্লেখ করার মাধ্যমে, BigQuery Storage API রিড রিকোয়েস্টটি ইন্টারসেপ্ট করে, Spark জবটি চালানো ইউজারের পরিচয় যাচাই করে, Dataplex মাস্কিং নিয়মগুলি প্রয়োগ করে এবং শুধুমাত্র অনুমোদিত ডেটা Spark DataFrame-এ ফেরত পাঠায়।
এই PySpark স্ক্রিপ্টটি আপনার ক্লাউড স্টোরেজ বাকেটে আপলোড করুন যাতে Dataproc এটি অ্যাক্সেস করতে পারে:
# Upload script to GCS
gsutil cp read_transactions.py gs://${ICEBERG_BUCKET}/scripts/read_transactions.py
ম্যানেজার হিসেবে স্পার্ক চালান:
আপনি অ্যাপাচি স্পার্কের জন্য গুগল ক্লাউড সার্ভারলেস ব্যবহার করবেন। এই পরিচালিত পরিষেবাটি আপনাকে ডেডিকেটেড ক্লাস্টার প্রোভিশন, কনফিগার বা পরিচালনা করার প্রয়োজন ছাড়াই সরাসরি স্পার্ক ওয়ার্কলোড চালানোর সুযোগ দেয়।
echo "🚀 Submitting Dataproc Serverless Job as [MANAGER]..."
gcloud dataproc batches submit pyspark gs://${ICEBERG_BUCKET}/scripts/read_transactions.py \
--project=${PROJECT_ID} \
--region=${REGION} \
--service-account=${EMAIL_MANAGER} \
--version=2.3 \
-- ${PROJECT_ID} ${DATASET_ID} \
--format="value(name)"
টার্মিনালে জব আউটপুট লগগুলো দেখুন। যেহেতু ম্যানেজারের কাছে ফাইন-গ্রেইনড রিডার রোলটি রয়েছে, স্পার্ক সফলভাবে র, আনমাস্কড অ্যামাউন্টগুলো পুনরুদ্ধার করে।
=== 📊 Data Preview ===
+---+--------+------+-------------------+
|id |item |amount|transaction_date |
+---+--------+------+-------------------+
|1 |Widget A|100.0 |2024-01-01 |
|2 |Widget B|150.0 |2024-01-02 |
|3 |Widget C|50.0 |2024-01-03 |
+---+--------+------+-------------------+
বিশ্লেষক হিসেবে স্পার্ক চালান:
এখন, হুবহু একই স্পার্ক জবটি সাবমিট করুন, কিন্তু এবার অ্যানালিস্টের ছদ্মবেশ ধারণ করুন।
echo "🚀 Submitting Dataproc Serverless Job as [ANALYST]..."
gcloud dataproc batches submit pyspark gs://${ICEBERG_BUCKET}/scripts/read_transactions.py \
--project=${PROJECT_ID} \
--region=${REGION} \
--service-account=${EMAIL_ANALYST} \
--version=2.3 \
-- ${PROJECT_ID} ${DATASET_ID} \
--format="value(name)"
লগগুলো আবার পরীক্ষা করুন। যদিও বিশ্লেষক হুবহু একই স্পার্ক কোড চালিয়েছিলেন, BigQuery স্টোরেজ এপিআই অনুরোধটি আটকে দিয়ে ডেটাপ্লেক্স পলিসি প্রয়োগ করেছে। বিশ্লেষকের স্পার্ক ডেটাফ্রেমে টাকার পরিমাণগুলো null দেখাচ্ছে!
=== 📊 Data Preview ===
+---+--------+------+-------------------+
|id |item |amount|transaction_date |
+---+--------+------+-------------------+
|1 |Widget A|null |2024-01-01 |
|2 |Widget B|null |2024-01-02 |
|3 |Widget C|null |2024-01-03 |
+---+--------+------+-------------------+
স্থাপত্যগত সুবিধা-অসুবিধা: BigQuery SQL বনাম Spark
আপনি এইমাত্র প্রমাণ করলেন যে ইঞ্জিন নির্বিশেষে ফলাফল একই! ডেটাপ্লেক্স পলিসি সফলভাবে প্রয়োগ করা হয়েছে। কিন্তু প্রোডাকশনে কোনটি ব্যবহার করা উচিত?
- BigQuery SQL: এমন ওয়ার্কফ্লোর জন্য এটি দুর্দান্ত, যেখানে SQL-ই কাঙ্ক্ষিত ইঞ্জিন এবং যা সরাসরি গণনা সম্পাদন করে। দ্রুত অ্যানালিটিক্স এবং বিজনেস ইন্টেলিজেন্সের জন্য এটি আদর্শ।
- অ্যাপাচি স্পার্ক: পাইথন ব্যবহারের ফলে এটি আরও জটিল ওয়ার্কলোড পরিচালনা করতে পারে, যা এটিকে উন্নত মেশিন লার্নিং পাইপলাইন বা লিগ্যাসি হ্যাডুপ কোডের জন্য বিশেষভাবে উপযুক্ত করে তোলে।
মূল কথা হলো: যে ইঞ্জিনই ব্যবহার করা হোক না কেন, কম্পিউট ডেলিগেশন প্রয়োগের মাধ্যমে কেন্দ্রীভূত জিরো-ট্রাস্ট গভর্নেন্স স্তরকে কখনোই বাইপাস করা যায় না!
৬. স্বয়ংক্রিয় ডেটা বংশধারা
যেকোনো এন্টারপ্রাইজ ডেটা আর্কিটেকচারে, আপনার ডেটা ঠিক কোথা থেকে আসছে এবং কীভাবে তা পরিবর্তন করা হয়েছে, তা জানা কমপ্লায়েন্স, ডিবাগিং এবং আস্থা স্থাপনের জন্য অত্যন্ত গুরুত্বপূর্ণ। এই ধারণাটি ডেটা লিনিয়েজ (Data Lineage) নামে পরিচিত। এটি এই ধরনের মৌলিক প্রশ্নের উত্তর দেয়: "যদি একজন ম্যানেজার একটি দৈনিক বিক্রয় প্রতিবেদন দেখেন, তাহলে সেই সংখ্যাগুলো গণনা করতে কোন র টেবিলগুলো (raw tables) ব্যবহার করা হয়েছিল?"
ঐতিহ্যগতভাবে, এই লাইফসাইকেল ট্র্যাক করার জন্য ডেটা ইঞ্জিনিয়ারদের ম্যানুয়ালি কাস্টম লগিং কোড লিখতে হয় অথবা SQL স্ক্রিপ্ট পার্স করার জন্য জটিল থার্ড-পার্টি টুল ব্যবহার করতে হয়। তবে, একটি নিয়ন্ত্রিত গুগল ক্লাউড লেকহাউসে এই ট্র্যাকিং অন্তর্নির্মিত থাকে এবং এতে কোনো হস্তক্ষেপের প্রয়োজন হয় না।
কোডল্যাবের শুরুতে আপনি যে 'raw transactions' টেবিলটি থেকে transactions_summary টেবিলটি তৈরি করেছিলেন, সেটি মনে আছে? BigQuery যখন সেই ' CREATE TABLE AS SELECT স্টেটমেন্টটি এক্সিকিউট করেছিল, তখন কম্পিউট ইঞ্জিন স্বয়ংক্রিয়ভাবে ট্রান্সফরমেশন মেটাডেটা ক্যাপচার করে Dataplex-এ পাঠিয়ে দিয়েছিল। চলুন ফলাফলটি দেখি।
বংশধারা কল্পনা করুন
- গুগল ক্লাউড কনসোলে, ডেটাপ্লেক্স ইউনিভার্সাল ক্যাটালগ > সার্চ- এ যান।
- সার্চ বারে
lakehouse_retail_demo.transactionsটাইপ করুন এবং টেবিলটিতে ক্লিক করুন। - বংশতালিকা ট্যাবে ক্লিক করুন।

আপনি ডেটাপ্লেক্স নলেজ ইঞ্জিন দ্বারা তৈরি একটি ইন্টারেক্টিভ গ্রাফ দেখতে পাবেন, যা প্রমাণ করে যে টার্গেট টেবিলটি ( transactions_summary ) র' গভর্নড আইসবার্গ টেবিল ( transactions ) থেকে উদ্ভূত হয়েছে। আপনি ডেটা অডিটিংয়ের জন্য অপরিহার্য এন্ড-টু-এন্ড ট্রেসেবিলিটি অর্জন করেছেন।
৭. পরিষ্কার করুন
এই কোডল্যাবে ব্যবহৃত রিসোর্সগুলোর জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, এই ধাপগুলো অনুসরণ করুন।
ডেটাপ্লেক্স গভর্নেন্স রিসোর্সগুলি সরান
BigQuery ডেটাসেট বা ক্লাউড স্টোরেজ বাকেট ডিলিট করার আগে, আপনাকে অবশ্যই লজিক্যাল গভর্নেন্স রুলগুলো রিমুভ করতে হবে। আপনি যদি রিপোজিটরি থেকে cleanup_governance.py স্ক্রিপ্টটি দেখেন, তাহলে নিম্নলিখিত টিয়ারডাউন সিকোয়েন্সটি দেখতে পাবেন:
# 1. Delete Data Policy
data_policy_name = f"{parent_loc}/dataPolicies/mask_financial_null"
dp_client.delete_data_policy(name=data_policy_name)
# 2. Find and Delete Taxonomy (This auto-deletes child Policy Tags)
taxonomies = catalog_client.list_taxonomies(parent=parent_loc)
taxonomy_id = next((t.name for t in taxonomies if t.display_name == "BusinessCritical"), None)
catalog_client.delete_taxonomy(name=taxonomy_id)
এখানে ক্রমটি অত্যন্ত গুরুত্বপূর্ণ। স্ক্রিপ্টটি প্রথমে ডেটা পলিসি (মাস্কিং রুল) মুছে ফেলে, কারণ এটি পলিসি ট্যাগের উপর নির্ভরশীল। পলিসিটি সরিয়ে ফেলার পর, প্যারেন্ট ট্যাক্সোনমি মুছে ফেলার কাজটি স্বয়ংক্রিয়ভাবে এর অধীনস্থ সমস্ত পলিসি ট্যাগ মুছে ফেলবে এবং কোনো রিসোর্স ডিপেন্ডেন্সি ত্রুটি তৈরি করবে না।
পাইথন ক্লিনআপ স্ক্রিপ্টটি চালান:
python cleanup_governance.py
পরিচয়, স্টোরেজ এবং কম্পিউট সম্পদ অপসারণ করুন
এখন যেহেতু গভর্নেন্স লেয়ারটি বিচ্ছিন্ন করা হয়েছে, আপনি নিরাপদে BigQuery টেবিল, ক্লাউড স্টোরেজ বাকেট, সার্ভিস অ্যাকাউন্ট এবং স্থানীয় পাইথন এনভায়রনমেন্ট মুছে ফেলতে পারেন।
নিম্নলিখিত ব্যাপক পরিষ্করণ ব্লকটি আপনার ক্লাউড শেলে কপি করে চালান:
echo "Deleting Service Accounts and Impersonation Bindings..."
export CURRENT_USER=$(gcloud config get-value account)
for USER in "${USER_ANALYST}" "${USER_MANAGER}"; do
EMAIL="${USER}@${PROJECT_ID}.iam.gserviceaccount.com"
# Remove impersonation binding
gcloud iam service-accounts remove-iam-policy-binding ${EMAIL} \
--member="user:${CURRENT_USER}" \
--role="roles/iam.serviceAccountTokenCreator" \
--quiet > /dev/null 2>&1
# Delete the Service Account
gcloud iam service-accounts delete ${EMAIL} --quiet
done
echo "Removing BigQuery Dataset and Tables..."
bq rm -f ${DATASET_ID}.transactions_summary
bq rm -f ${DATASET_ID}.transactions
bq rm -f ${DATASET_ID}.inventory
bq rm -f -d ${DATASET_ID}
echo "Removing BigQuery Cloud Resource Connection..."
bq rm --connection --location=${REGION} ${CONN_NAME}
echo "Removing Iceberg Cloud Storage Bucket..."
gcloud storage rm --recursive gs://${ICEBERG_BUCKET} --quiet
echo "Removing Auto-generated Dataproc Staging & Temp Buckets..."
for BUCKET in $(gcloud storage ls | grep -E "gs://dataproc-(staging|temp)-${REGION}"); do
gcloud storage rm --recursive $BUCKET --quiet
done
echo "Deactivating and removing the local Python environment..."
deactivate
cd ../..
rm -rf devrel-demos
echo "✅ Clean up completed successfully!"
এই ধাপগুলো সম্পন্ন করার মাধ্যমে আপনি নিশ্চিত করেছেন যে আপনার প্রোজেক্টে কোনো অনাথ রিসোর্স বা লুকানো পলিসি অবশিষ্ট নেই।
৮. অভিনন্দন!
আপনি সফলভাবে একটি সম্পূর্ণরূপে নিয়ন্ত্রিত ও অনুসন্ধানযোগ্য ডেটা লেকহাউস বাস্তবায়ন করেছেন।
আপনি জানতে পেরেছেন যে:
- নেটিভ আইসবার্গ ইন্টিগ্রেশন: বিগলেক ফিজিক্যাল ফাইলগুলোকে ক্লাউড স্টোরেজে নিরাপদে সংরক্ষণ করার পাশাপাশি ওপেন-সোর্স আইসবার্গ টেবিলগুলো নেটিভভাবে পরিচালনা করতে পারে।
- নিরাপত্তার জন্য কম্পিউট ডেলিগেশন: BigQuery স্টোরেজ API-এর মাধ্যমে কোয়েরি রাউটিং করে, আপনি ফিজিক্যাল ফাইলগুলির উপর সূক্ষ্ম ডাইনামিক মাস্কিং প্রয়োগ করেছেন, যেগুলি স্বাভাবিকভাবে আংশিক অ্যাক্সেস সীমাবদ্ধ করতে পারে না।
- ইঞ্জিন-অজ্ঞেয় শাসনব্যবস্থা: পলিসি ট্যাগ আপনাকে একবার নিয়ম নির্ধারণ করার সুযোগ দেয় এবং নেটিভ SQL বা অ্যাপাচি স্পার্ক রানটাইম, যেভাবেই কোয়েরি করা হোক না কেন, সেগুলোকে সর্বজনীনভাবে প্রয়োগ করে।
- ডেটা আবিষ্কারযোগ্যতা: ডেটাপ্লেক্স নলেজ ইঞ্জিন স্বয়ংক্রিয়ভাবে ডেটার উৎস ট্র্যাক করে, যা এন্টারপ্রাইজের জন্য অপরিহার্য নিরীক্ষাযোগ্যতা প্রদান করে।
এরপর কী?
- উন্নত অ্যাক্সেস কন্ট্রোল অন্বেষণ করুন: আরও জটিল নিরাপত্তা পরিস্থিতি বাস্তবায়ন করতে, অতিরিক্ত বৈশিষ্ট্য সহ বিগলেক কাস্টমাইজ করার বিষয়ে অফিসিয়াল ডকুমেন্টেশন পর্যালোচনা করুন।
- GenAI-এর জন্য অসংগঠিত ডেটা পরিচালনা করুন: BigLake অবজেক্ট টেবিল আবিষ্কার করুন। ক্লাউড স্টোরেজে থাকা অসংগঠিত ফাইলগুলিতে (পিডিএফ, ছবি) এই সুনির্দিষ্ট সিকিওর ব্রিজ প্যাটার্নটি প্রসারিত করুন, যা Vertex AI এবং RAG পাইপলাইনগুলির জন্য একটি সুরক্ষিত ও নিয়ন্ত্রিত ডেটা ভিত্তি স্থাপন করবে।