使用基础设施管理器在Google Cloud中创建项目
首先
2023年9月,Google Cloud推出了能够在其托管服务上运行的Terraform基础设施管理器!
以前我在Terraform Cloud上写了一篇关于如何创建Google Cloud项目的文章,现在我尝试使用Infrastructure Manager做同样的事情。
建构过程
我根据公式文档的快速入门进行了构建。
我制定了验证要求如下:
-
- Terraform テンプレートは CloudStorage に置く
- 作成するのは Google Cloud プロジェクトのみ、請求先アカウントの紐づけはしない
激活API
从命令或控制台激活基础设施管理器 API。
设置服务帐户
准备一个用于Infrastructure Manager的服务账号。然后给该账号分配Cloud Infrastructure Manager代理角色(roles/config.agent),以及创建所需资源的角色(本例中是roles/resourcemanager.projectCreator),该角色由Terraform模板指定。关于如何分配roles/resourcemanager.projectCreator角色的方法,请参考上一篇文章。
准备CloudStorage存储桶。
准备一个 CloudStorage 存储桶来放置 Terraform 模板。
为了对模板文件进行版本控制,创建一个启用对象版本控制的存储桶。
准备Terraform模板。
由于模板样本已经公开,因此我参考了这个。
我根据上次的模板文件创建了3个文件。
与上次相比,有一个不同之处是
-
- Terraform Cloud ワークスペースの指定の削除
-
- 認証情報の指定の削除
- 変数宣言とデフォルト値の設定を variable.tf 内で実施
resource "google_project" "new_project" {
name = "<Project Name>"
project_id = "<Priject ID>"
org_id = var.org_id
}
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "4.51.0"
}
}
}
variable "org_id" {
type = string
default = "<Organization ID>"
}
在之前创建的桶中创建一个任意的文件夹(本例中为 src 文件夹),并将这三个文件放在那里。
基础设施经理的实施
从Cloud Shell执行以下命令。
gcloud infra-manager deployments apply projects/<Project Name>/locations/asia-east1/deployments/my-depolyment \
--service-account projects/<Project Name>/serviceAccounts/<Service Account Name> \
--gcs-source gs://<Bucket>/src
目前可在指令中选择的区域有三个,分别是亚太东部1(asia-east1),欧洲西部1(europe-west1)和美国中部1(us-central1)。因此,我们选择了亚太东部1(asia-east1)作为本次的指定区域。
确认部署完成后的状态。
要查看部署执行的状态和创建的资源,需要运行命令。
顺便提一下,基础设施管理器的元数据被放置在名为 gs://PROJECT_ID-LOCATION-blueprint-config 的存储桶中,但是即使是部署执行用户也没有访问权限,无法确认有哪些文件。
确认部署执行状态
指令
gcloud infra-manager deployments describe projects/<Project Name>/locations/asia-east1/deployments/my-depolyment
结果
createTime: '2023-12-04T06:07:43.895650003Z'
latestRevision: projects/<Project Name>locations/asia-east1/deployments/my-depolyment/revisions/r-0
lockState: UNLOCKED
name: projects/<Project Name>/locations/asia-east1/deployments/my-depolyment
serviceAccount: projects/<Project Name>/serviceAccounts/<Service Account Name>
state: ACTIVE
stateDetail: revision "projects/<Project Name>/locations/asia-east1/deployments/my-depolyment/revisions/r-0"
applied
terraformBlueprint:
gcsSource: gs://<Bucket>/src
updateTime: '2023-12-04T06:08:45.675848249Z'
确认已创建的资源
命令
gcloud infra-manager resources list --revision=projects/<Project Name>/locations/asia-east1/deployments/my-depolyment/revisions/r-0
结果 (jié guǒ)
NAME: project-<任意の文字列>
STATE: RECONCILED
结果的 NAME 与 Terraform 模板中指定的名称不同。通过 Infrastructure Manager 创建 BigQuery 数据集并确认 NAME,结果不是在 Terraform 模板中指定的名称,而是 bigquery-dataset-<任意的字符串>。因此,这里显示的应该是用于内部管理的名称。
对比一下Terraform Cloud(给出感想)
如果是个人开发或者临时使用,Infrastructure Manager似乎是不错的选择;如果是团队开发或长期运营,Terraform Cloud似乎更加合适。这就是我的感想。
我认为选择基础设施经理更好的原因。
不再需要管理服务账户的密钥!
在上一篇文章中,我们讨论了发放服务帐户密钥并将其用于Terraform模板和变量。但是,如果使用基础设施管理器,只需要授予服务帐户所需的角色即可。这样可以避免信息泄露的风险和密钥轮换的烦恼。
由于Google Cloud是专属的,所以模板和协作变得简单易用。
由於基礎設施經理在Google Cloud中是封閉的,因此模板更傾向於以提供者為中心的簡單形式。
此外,由於不再需要進行高負載服務之間的協同設定,所以從使用開始到部署完成都更加順暢。
我认为Terraform Cloud的优点是
可以使用GitHub的私有存储库
基础设施经理的模板配置选项包括云存储、Github的公共代码库和本地机器共三种。
就我个人而言,我希望使用Github来管理模板,因为我想通过团队来管理模板。然而,我不能将包含公司数据的模板文件放在公共代码库中。
因此,相对于能使用Github私有代码库的Terraform Cloud,更适合我的使用场景。
可以以隐密的方式进行变量管理。
项目创建的提供者会指定组织ID,但直接在模板文件中写入ID可能会引起安全隐患,因此希望能以类似Terraform Cloud的方式进行保密,确保信息不会轻易被看到。(当然,有关将需要保密的信息放置在Terraform中的利弊也存在争议。)
希望以上的内容。如果能对某人有所帮助,我将感到幸运。