我正在尝试使用 Google Cloud Function 内的 google-cloud-bigquery Python 客户端库更新与现有 Google BigQuery 数据集的加密配置关联的密钥管理服务 (KMS) 密钥。
以下是云功能的配置。由于某种原因,我无法使用
os.getenv
或 os.environ.get
获取云函数内的环境变量。有没有办法在代码中以字符串形式获取项目名称而不对其进行硬编码?
1st gen
256MB
Env vars:
PROJECT_ID: "project_id"
我根据官方文档、各种示例和ChatGPT建议尝试了以下方法:
from google.cloud import bigquery
import os
def update_kms_key(request):
try:
project_id = os.environ.get("PROJECT_ID", "your-project-id")
key_ring_id = "your-key-ring-id"
key_id = "your-key-id"
location = "your-location"
kms_key_name = f"projects/{project_id}/locations/{location}/keyRings/{key_ring_id}/cryptoKeys/{key_id}"
client = bigquery.Client(project=project_id)
datasets = list(client.list_datasets())
if datasets:
dataset_id = datasets[0].dataset_id
dataset_ref = client.dataset(dataset_id)
dataset = client.get_dataset(dataset_ref)
if not hasattr(dataset, 'encryption_configuration'):
dataset.encryption_configuration = bigquery.EncryptionConfiguration()
dataset.encryption_configuration.kms_key_name = kms_key_name
dataset = client.update_dataset(dataset, ['encryption_configuration'])
return {"Success": [dataset.dataset_id]}
else:
return {"Error": "No datasets found."}
except Exception as e:
return {"ERROR": str(e)}
但是,我遇到了错误:“没有属性‘加密配置’”。 Dataset 对象中似乎不存在 Encryption_configuration 属性。
是否有正确的方法来使用 google-cloud-bigquery Python 客户端库更新与现有 BigQuery 数据集的加密配置关联的 KMS 密钥?如果不是,可以使用哪些替代方法或解决方法来实现这一目标?
任何见解或例子将不胜感激!
谢谢!
我设法让它发挥作用。这是最终的代码供参考:
import logging
from os import getenv
from google.cloud.bigquery import (
Client,
EncryptionConfiguration
)
logging.getLogger().setLevel(logging.INFO)
client = Client()
PROJECT_ID = client.project
TEMP_KMS_KEY = getenv('TEMP_KMS_KEY')
ORIGINAL_KMS_KEY = getenv('ORIGINAL_KMS_KEY')
def rotate_kms(request) -> str:
try:
datasets = client.list_datasets()
for dataset in datasets:
tables = client.list_tables(dataset=dataset)
for table in tables:
id = f'{PROJECT_ID}.{dataset.dataset_id}.{table.table_id}'
table = client.get_table(id)
if table.table_type == 'TABLE':
if table.encryption_configuration is not None:
if table.encryption_configuration.kms_key_name:
logging.info(table)
logging.info(f'Updating KMS key of: {table}')
table.encryption_configuration = EncryptionConfiguration(
kms_key_name=TEMP_KMS_KEY
)
table = client.update_table(table, ['encryption_configuration'])
logging.info(f'Temp KMS key set to table: {table}')
table.encryption_configuration = EncryptionConfiguration(
kms_key_name=ORIGINAL_KMS_KEY
)
table = client.update_table(table, ['encryption_configuration'])
logging.info(f'Original KMS key set to table: {table}')
else:
logging.warning(f'{table} has default encryption and requires a copy job to change from default encryption. Skipping...')
else:
logging.warning(f'{table} is a view. Skipping...')
logging.info('Cloud Function executed successfully!')
return 'Execution Successful!'
except Exception as e:
logging.error(e)
return 'Cloud Function failed!'
从原始 KMS 密钥加密更改为临时密钥,然后返回更新 BigQuery 表 KMS 加密,轮换后更改为原始密钥的新版本,如下所述:https://cloud.google.com/ bigquery/docs/客户管理的加密
Cloud KMS 密钥轮换的影响
当与表关联的 Cloud KMS 密钥轮换时,BigQuery 不会自动轮换表加密密钥。现有表中的所有数据将继续受到创建它们时所用的密钥版本的保护。
任何新创建的表都使用创建时的主键版本。
要更新表以使用最新的密钥版本,请将表更改为不同的 Cloud KMS 密钥,然后再恢复为原始密钥。