Java中如何创建配置客户管理加密密钥(CMEK)的Pub/Sub主题
Java配置Pub/Sub主题CMEK的实现方案
你只需要在构建Topic实例时通过setKmsKeyName方法传入CMEK的完整密钥路径即可,对应Python示例中的kms_key_name参数,完整实现代码如下:
import com.google.cloud.pubsub.v1.TopicAdminClient; import com.google.pubsub.v1.Topic; import com.google.pubsub.v1.TopicName; import com.google.pubsub.v1.MessageStoragePolicy; public class CreateTopicWithCmek { public static void main(String... args) throws Exception { // 替换为实际的项目ID、主题ID、CMEK完整路径 String projectId = "your-project-id"; String topicId = "your-topic-id"; String cmekKeyFullPath = "projects/[kms-project-id]/locations/[region]/keyRings/[key-ring-name]/cryptoKeys/[key-name]"; // 构造主题名称 TopicName topicName = TopicName.of(projectId, topicId); // 构建带CMEK配置和存储策略的Topic对象 Topic topic = Topic.newBuilder() .setName(topicName.toString()) .setKmsKeyName(cmekKeyFullPath) // 传入CMEK路径完成加密配置 .setMessageStoragePolicy(MessageStoragePolicy.newBuilder() // 替换为实际允许的消息存储区域,和Python中get_allowed_region()返回值对应 .addAllowedPersistenceRegions("us-central1") .addAllowedPersistenceRegions("us-east1") .build()) .build(); // 创建主题,逻辑和你原有代码保持一致 try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) { Topic createdTopic = topicAdminClient.createTopic(topic); System.out.printf("主题创建成功,CMEK配置为:%s%n", createdTopic.getKmsKeyName()); } } }
注意事项
- 确保使用的Google Cloud Pub/Sub Java客户端为最新稳定版,避免旧版本不支持
setKmsKeyName方法 - 调用API的服务账号需要被授予对应KMS密钥的
roles/cloudkms.cryptoKeyEncrypterDecrypter权限,否则会触发权限报错 - CMEK密钥的所属区域需要和Pub/Sub主题允许存储的区域匹配,或使用全局级别的KMS密钥
内容的提问来源于stack exchange,提问作者Krishna0696
相关产品推荐
相关产品推荐

