使用GCP的Terraform:将VM实例复制到其他gcp项目

时间:2019-06-23 11:54:43

标签: terraform terraform-provider-gcp

背景

我有两个Google云项目:[project1]和[project2]。 [project1]有一个名为 uploadImages(req, res, (err) => { if (err) { console.log("Error:", err.message) } else { const imagesArray = req.files.map((image) => { let imageObject = {} imageObject.type = image.mimeType imageObject.path = image.path imageObject.link = image.path.replace("public", "").replace(/\\/g, "/") imageObject.timeUploaded = Date.now() sizeOf("public/" + imageObject.link, (err, sizes) => { if(err) { error(err) } else { success(sizes) } }) const error = (err) => { console.log(err) } const success = (data) => { imageObject.width = data.width imageObject.height = data.height console.log(imageObject) } return imageObject }) db.collection("uploadtest2").insertMany(imagesArray, (err, result) => { if (err) { return console.log(err) } // db.collection("resized-images").insertMany() console.log("something saved to the database") }) } }) res.redirect("/") })``` 的虚拟机实例。我想将my-vm复制到[project2]。

我完成的步骤

因此,我创建了这个terraform文件(my-vm):

main.tf

将其保存到新目录中。现在,运行以下命令:

provider "google" {
  credentials = "${file("service-account.json")}"
  project     = "[project2]"
  region      = "us-central1"
}

这时我发现自己错过了$ terraform init $ terraform import google_compute_instance.my-vm [project1]/us-central1-a/my-vm Error: resource address "google_compute_instance.my-vm" does not exist in the configuration. Before importing this resource, please create its configuration in the root module. For example: resource "google_compute_instance" "my-vm" { # (resource arguments) } 语句。因此,我将其添加到resource "google_compute_instance" "my-vm"。现在看起来像这样:

main.tf

现在,我正在运行相同的provider "google" { credentials = "${file("service-account.json")}" project = "[project2]" region = "us-central1" } resource "google_compute_instance" "my-vm" { } 命令agian,并且成功。一个terraform import文件已创建。但是, terraform.tfstate文件未更改。我原本希望在其中看到vm导入的数据,但是main.tf是空的。奇怪...

现在,我正在运行命令resource "google_compute_instance" "my-vm"并得到了这个信息:

plan

问题:

  1. 为什么导入资源后我不能调用plan方法?
  2. 我看到了一些使用terraform复制和部署的示例。所有这些示例都是根据机器的基本映像来复制机器。因此,如果开发人员在虚拟机实例上添加了一些更改,则它不会出现在重复的资源([project2])中。是否可以复制vm-disk,而不是vm-image?

1 个答案:

答案 0 :(得分:1)

Terraform当前无法为您生成配置,import仅将数据保存到状态文件中。

  

当前Terraform导入的实现只能将资源导入到状态中。它不会生成配置。将来版本的Terraform也将生成配置。

     

因此,在运行terraform导入之前,有必要手动为资源编写资源配置块,导入的对象将被映射到该资源。

     

虽然这看起来很乏味,但它仍然为Terraform用户提供了导入现有资源的途径。 Terraform的未来版本将完全生成配置,从而大大简化此过程。

有一些第三方工具可以为现有资源生成Terrafrom配置:

  

是否可以复制vm-disk,而不是vm-image?

您可以从您的VM创建instance template并将其用于创建新的VM: