我正在使用Terraform创建一个VM实例和网络,Compute磁盘,它连接到上述实例,该磁盘的快照和一个KMS密钥环和密钥来加密数据。
我使用自己创建的服务帐户对GCP进行身份验证,使用以下块:
credentials = file("gcp-account.json")
该帐户具有下列权限:
Encrypter/Decrypter
然后,在google_compute_snapshot
和google_compute_disk
块中,我为请求提供了kms_key_self_link
和服务帐户,以使用新创建的KMS密钥和我的自定义服务帐户加密数据:
kms_key_self_link = var.kms_key_selflink
kms_key_service_account = var.service_account
我在google_compute_instance
块中做了同样的事情,并在boot_disk
和attached_disk
中提供了kms_key_self_link
,并指定VM应该为请求使用自定义服务帐户:
service_account {
email = var.service_account
scopes = []
}
然后,在运行terraform apply
时,我会得到以下错误:
错误:错误创建实例: googleapi: error 400:当使用密钥项目/{项目名称}/位置/密钥环/{密钥环名称}/加密键/{密钥名}:资源项目/{项目名称}/位置/{位置}/密钥环/{密钥环}/{密钥名}:‘(或者可能不存在)时,云KMS错误。
当我授予
角色/cloudkms.cryptoKeyEncrypterDecrypter.加密密钥
对Compute Engine Service Agent的权限,则脚本运行良好。
data "google_iam_policy" "kms_key_encrypt_decrypt" {
binding {
role = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
members = ["serviceAccount:service{{PROJECT_NUMBER}}@computesystem.iam.gserviceaccount.com"]
}
}
resource "google_kms_crypto_key_iam_policy" "crypto_key" {
crypto_key_id = google_kms_crypto_key.key.id
policy_data = data.google_iam_policy.kms_key_encrypt_decrypt.policy_data
}
但是,我更喜欢使用我的所有资源,只使用我的自定义服务帐户来处理请求,而不以任何方式涉及默认的Compute服务代理。
我检查了Compute Engine Service Agent分配了哪些角色,只有一个:
计算引擎服务代理
并将完全相同的角色分配给我的自定义服务帐户。这没什么用。后来我注意到,这个问题只发生在VM的boot_disk
中:
boot_disk {
kms_key_self_link = var.kms_key_selflink
initialize_params {
image = var.vm_image
type = var.gce_disk_type
}
}
当我注释掉kms_key_self_link
块中的boot_disk
时,其他资源(快照、计算磁盘、附加磁盘)也可以使用kms_key_self_link
和自定义服务帐户,而不会出现任何问题。如果我将kms_key_self_link
参数留在boot_disk
中,问题仍然存在,我需要指定默认代理来解决这个问题。
是否有一种方法可以让我的所有资源只使用自定义服务帐户而不涉及默认的Compute服务代理,而我只是在脚本中遗漏了一些东西,或者默认代理需要保留一些操作?
发布于 2021-07-30 02:25:41
因此,通过提供的答案,如果没有Compute服务代理的参与,就不可能获得所有的资源。它一定有
角色/cloudkms.cryptoKeyEncrypterDecrypter.加密密钥
角色授予,而不管使用的任何其他自定义服务帐户。下面是我在Terraform代码中使用的策略,用于授予它必要的权限:
data "google_iam_policy" "kms_key_encrypt_decrypt" {
binding {
role = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
members = ["serviceAccount:service{{PROJECT_NUMBER}}@computesystem.iam.gserviceaccount.com"]
}
}
resource "google_kms_crypto_key_iam_policy" "crypto_key" {
crypto_key_id = google_kms_crypto_key.key.id
policy_data = data.google_iam_policy.kms_key_encrypt_decrypt.policy_data
}
感谢大家的回答。
https://stackoverflow.com/questions/68408499
复制相似问题