{"id":48705,"date":"2023-02-08T13:22:27","date_gmt":"2023-02-17T08:55:58","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/"},"modified":"2024-04-29T13:40:25","modified_gmt":"2024-04-29T05:40:25","slug":"gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/","title":{"rendered":"[GCP\u4e0a\u7684Terraform\u5165\u95e8] \u7b2c\u4e00\u90e8\u5206"},"content":{"rendered":"<p>\u770b\u5230\u4e86&#8221;Infrastructure as Code&#8221;\u53d8\u5f97\u66f4\u52a0\u5bb9\u6613\u7684&#8221;terraformer&#8221;\uff0c\u867d\u7136\u6709\u70b9\u665a\uff0c\u4f46\u662f\u770b\u4e86\u8fd9\u7bc7\u6587\u7ae0\u540e\uff0c\u5f00\u59cb\u60f3\u7740\u662f\u4e0d\u662f\u8be5\u5f00\u59cb\u5c1d\u8bd5\u4e00\u4e0b\u4e86\u3002<\/p>\n<h1>\u73af\u5883<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Terraform v0.12.6<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">provider.google v2.12.0<\/ul>\n<h1>\u51c6\u5907\u73af\u5883<\/h1>\n<h2>\u5b89\u88c5terraform<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>brew <span class=\"nb\">install <\/span>terraform\r\n...\r\n<span class=\"nv\">$ <\/span>terraform <span class=\"nt\">-v<\/span>\r\nTerraform v0.12.6\r\n<\/code><\/pre>\n<h2>\u521b\u5efa\u670d\u52a1\u8d26\u53f7<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">gcloud\u30b3\u30de\u30f3\u30c9\u306f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6e08\u307f<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">terraform\u5b9f\u884c\u7528\u306e\u30b5\u30fc\u30d3\u30b9\u30a2\u30ab\u30a6\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u6a29\u9650\u306f\u300cProject &gt; \u7de8\u96c6\u8005\u300d\u3092\u3064\u3051\u307e\u3057\u305f<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u9375\u3092json\u5f62\u5f0f\u3067\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/ul>\n<\/li>\n<\/ul>\n<p>credentials.json \u3068\u3057\u3066\u7f6e\u3044\u3066\u304a\u304d\u307e\u3059<br \/>\n\u540d\u524d\u306f\u9069\u5f53\u3067\u3059<\/p>\n<p>service accounnt\u3092activate\u3057\u307e\u3059<\/p>\n<pre class=\"post-pre\"><code>  gcloud auth activate-service-account <span class=\"nt\">--key-file<\/span><span class=\"o\">=<\/span>credentials.json\r\n<\/code><\/pre>\n<ul class=\"post-ul\">project\u3092\u30bb\u30c3\u30c8\u3057\u3066\u304a\u304d\u307e\u3059<\/ul>\n<pre class=\"post-pre\"><code>  <span class=\"nv\">$ <\/span>gcloud config <span class=\"nb\">set <\/span>project xxxxx\r\n<\/code><\/pre>\n<h2>\u521b\u5efaGCS\u5b58\u50a8\u6876<\/h2>\n<p>\u4e3a\u4e86\u4fdd\u5b58 xxx.tfstate \u6587\u4ef6\uff0c\u9700\u8981\u5728GCS\u4e0a\u521b\u5efa\u4e00\u4e2a\u5b58\u50a8\u6876\u3002<br \/>\n* \u8be5\u6587\u4ef6\u7528\u4e8e\u4fdd\u5b58\u7ba1\u7406\u57fa\u7840\u8bbe\u65bd\u7684\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>gsutil mb <span class=\"nt\">-c<\/span> multi_regional <span class=\"nt\">-l<\/span> Asia gs:\/\/xxxx-tf-state\r\n<\/code><\/pre>\n<h1>\u5199\u4e0bProvider\u7684\u8bbe\u7f6e<\/h1>\n<pre class=\"post-pre\"><code><span class=\"k\">provider<\/span> <span class=\"s2\">\"google\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">credentials<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">file<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"credentials.json\"<\/span><span class=\"p\">)<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">project<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">project<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">region<\/span>      <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">region<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"project\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"xxx\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"region\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"asia-northeast1\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">project,region\u306fvariables.tf\u306b\u5916\u3060\u3057\u3057\u307e\u3057\u305f<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">credentials.json\u306f\u3055\u3063\u304d\u3064\u304f\u3063\u305fservice account\u306e\u9375\u30d5\u30a1\u30a4\u30eb\u3067\u3059<\/ul>\n<h1>\u5199\u540e\u7aef\u8bbe\u7f6e<\/h1>\n<p>\u5728Google\u4e91\u5b58\u50a8\uff08GCS\uff09\u4e0a\u914d\u7f6e\u4ee5\u7ba1\u7406tfstate\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">backend<\/span> <span class=\"s2\">\"gcs\"<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">bucket<\/span>      <span class=\"p\">=<\/span> <span class=\"s2\">\"xxxx-tf-state\"<\/span>\r\n    <span class=\"nx\">path<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"practice.tfstate\"<\/span>\r\n    <span class=\"nx\">credentials<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"credentials.json\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h1>\u8fdb\u884cTerraform\u7684\u521d\u59cb\u5316\u3002<\/h1>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform init\r\n\r\nInitializing the backend...\r\n\r\nInitializing provider plugins...\r\n\r\nThe following providers <span class=\"k\">do <\/span>not have any version constraints <span class=\"k\">in <\/span>configuration,\r\nso the latest version was installed.\r\n\r\nTo prevent automatic upgrades to new major versions that may contain breaking\r\nchanges, it is recommended to add version <span class=\"o\">=<\/span> <span class=\"s2\">\"...\"<\/span> constraints to the\r\ncorresponding provider blocks <span class=\"k\">in <\/span>configuration, with the constraint strings\r\nsuggested below.\r\n\r\n<span class=\"k\">*<\/span> provider.google: version <span class=\"o\">=<\/span> <span class=\"s2\">\"~&gt; 2.12\"<\/span>\r\n\r\nTerraform has been successfully initialized!\r\n\r\nYou may now begin working with Terraform. Try running <span class=\"s2\">\"terraform plan\"<\/span> to see\r\nany changes that are required <span class=\"k\">for <\/span>your infrastructure. All Terraform commands\r\nshould now work.\r\n\r\nIf you ever <span class=\"nb\">set <\/span>or change modules or backend configuration <span class=\"k\">for <\/span>Terraform,\r\nrerun this <span class=\"nb\">command <\/span>to reinitialize your working directory. If you forget, other\r\ncommands will detect it and remind you to <span class=\"k\">do <\/span>so <span class=\"k\">if <\/span>necessary.\r\n<\/code><\/pre>\n<p>\u55ef\uff0c\u6709\u51fa\u73b0\u4e86\u4ec0\u4e48\u8b66\u544a\u3002<\/p>\n<p>\u4f60\u662f\u5728\u8bf4\u5efa\u8bae\u6211\u7ed9\u63d0\u4f9b\u8005\u6307\u5b9a\u4e00\u4e2a\u7248\u672c\u5417\uff1f\u90a3\u6211\u4f1a\u5c1d\u8bd5\u5b89\u88c5\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gh\">diff --git a\/provider.tf b\/provider.tf\r\nindex 1e8066b..ec409f4 100644\r\n<\/span><span class=\"gd\">--- a\/provider.tf\r\n<\/span><span class=\"gi\">+++ b\/provider.tf\r\n<\/span><span class=\"p\">@@ -2,4 +2,5 @@<\/span> provider \"google\" {\r\n   credentials = \"${file(\"credentials.json\")}\"\r\n   project     = \"${var.project}\"\r\n   region      = \"${var.region}\"\r\n<span class=\"gi\">+  version     = \"~&gt; 2.12\"\r\n<\/span> }\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform init\r\n\r\nInitializing the backend...\r\n\r\nInitializing provider plugins...\r\n\r\nTerraform has been successfully initialized!\r\n\r\nYou may now begin working with Terraform. Try running <span class=\"s2\">\"terraform plan\"<\/span> to see\r\nany changes that are required <span class=\"k\">for <\/span>your infrastructure. All Terraform commands\r\nshould now work.\r\n\r\nIf you ever <span class=\"nb\">set <\/span>or change modules or backend configuration <span class=\"k\">for <\/span>Terraform,\r\nrerun this <span class=\"nb\">command <\/span>to reinitialize your working directory. If you forget, other\r\ncommands will detect it and remind you to <span class=\"k\">do <\/span>so <span class=\"k\">if <\/span>necessary.\r\n<\/code><\/pre>\n<p>\u8b66\u544a\u4e0d\u518d\u5b58\u5728\u4e86\u5462\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>gsutil <span class=\"nb\">ls <\/span>gs:\/\/xxxx-tf-state\r\ngs:\/\/xxxx-tf-state\/practice.tfstate\r\n<\/code><\/pre>\n<p>\u5df2\u7ecf\u751f\u6210\u4e86\u5b8c\u6574\u7684tfstate\u6587\u4ef6\u3002<\/p>\n<h1>\u8bd5\u7740\u521b\u5efa\u4e00\u4e2a\u865a\u62df\u79c1\u6709\u4e91\uff08VPC\uff09\u3002<\/h1>\n<p>\u6211\u60f3\u8bd5\u8bd5\u505a\u70b9\u4ec0\u4e48\uff0c\u6240\u4ee5\u6211\u51b3\u5b9a\u521b\u5efa\u4e00\u4e2aVPC\u3002<\/p>\n<h2>\u8d44\u6e90\u5b9a\u4e49<\/h2>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"google_compute_network\"<\/span> <span class=\"s2\">\"vpc\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-practice-network\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"google_compute_subnetwork\"<\/span> <span class=\"s2\">\"vpc_subnet1\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-practice-network-subnet1\"<\/span>\r\n  <span class=\"nx\">ip_cidr_range<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet_cidr_range<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">network<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">google_compute_network<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">description<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"example.subnet1\"<\/span>\r\n  <span class=\"nx\">region<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">region<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"project\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"xxxx\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"region\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"asia-northeast1\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"subnet_cidr_range\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"192.168.10.0\/24\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u8ba1\u5212<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform plan\r\nterraform plan\r\nRefreshing Terraform state <span class=\"k\">in<\/span><span class=\"nt\">-memory<\/span> prior to plan...\r\nThe refreshed state will be used to calculate this plan, but will not be\r\npersisted to <span class=\"nb\">local <\/span>or remote state storage.\r\n\r\n\r\n<span class=\"nt\">------------------------------------------------------------------------<\/span>\r\n\r\nAn execution plan has been generated and is shown below.\r\nResource actions are indicated with the following symbols:\r\n  + create\r\n\r\nTerraform will perform the following actions:\r\n\r\n  <span class=\"c\"># google_compute_network.vpc will be created<\/span>\r\n  + resource <span class=\"s2\">\"google_compute_network\"<\/span> <span class=\"s2\">\"vpc\"<\/span> <span class=\"o\">{<\/span>\r\n      + auto_create_subnetworks         <span class=\"o\">=<\/span> <span class=\"nb\">true<\/span>\r\n      + delete_default_routes_on_create <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + gateway_ipv4                    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + <span class=\"nb\">id<\/span>                              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + name                            <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network\"<\/span>\r\n      + project                         <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + routing_mode                    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + self_link                       <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"c\"># google_compute_subnetwork.vpc_subnet1 will be created<\/span>\r\n  + resource <span class=\"s2\">\"google_compute_subnetwork\"<\/span> <span class=\"s2\">\"vpc_subnet1\"<\/span> <span class=\"o\">{<\/span>\r\n      + creation_timestamp <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + description        <span class=\"o\">=<\/span> <span class=\"s2\">\"example.subnet1\"<\/span>\r\n      + fingerprint        <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + gateway_address    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + <span class=\"nb\">id<\/span>                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + ip_cidr_range      <span class=\"o\">=<\/span> <span class=\"s2\">\"192.168.10.0\/24\"<\/span>\r\n      + name               <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network-subnet1\"<\/span>\r\n      + network            <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network\"<\/span>\r\n      + project            <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + region             <span class=\"o\">=<\/span> <span class=\"s2\">\"asia-northeast1\"<\/span>\r\n      + secondary_ip_range <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + self_link          <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\nPlan: 2 to add, 0 to change, 0 to destroy.\r\n\r\n<span class=\"nt\">------------------------------------------------------------------------<\/span>\r\n\r\nNote: You didn<span class=\"s1\">'t specify an \"-out\" parameter to save this plan, so Terraform\r\ncan'<\/span>t guarantee that exactly these actions will be performed <span class=\"k\">if<\/span>\r\n<span class=\"s2\">\"terraform apply\"<\/span> is subsequently run.\r\n<\/code><\/pre>\n<h2>\u7533\u8bf7<\/h2>\n<p>\u6682\u65f6\u770b\u8d77\u6765\u53ef\u4ee5\uff0c\u6211\u4f1a\u5c1d\u8bd5\u7533\u8bf7\u4e00\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform apply\r\n\r\nAn execution plan has been generated and is shown below.\r\nResource actions are indicated with the following symbols:\r\n  + create\r\n\r\nTerraform will perform the following actions:\r\n\r\n  <span class=\"c\"># google_compute_network.vpc will be created<\/span>\r\n  + resource <span class=\"s2\">\"google_compute_network\"<\/span> <span class=\"s2\">\"vpc\"<\/span> <span class=\"o\">{<\/span>\r\n      + auto_create_subnetworks         <span class=\"o\">=<\/span> <span class=\"nb\">true<\/span>\r\n      + delete_default_routes_on_create <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + gateway_ipv4                    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + <span class=\"nb\">id<\/span>                              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + name                            <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network\"<\/span>\r\n      + project                         <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + routing_mode                    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + self_link                       <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"c\"># google_compute_subnetwork.vpc_subnet1 will be created<\/span>\r\n  + resource <span class=\"s2\">\"google_compute_subnetwork\"<\/span> <span class=\"s2\">\"vpc_subnet1\"<\/span> <span class=\"o\">{<\/span>\r\n      + creation_timestamp <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + description        <span class=\"o\">=<\/span> <span class=\"s2\">\"example.subnet1\"<\/span>\r\n      + fingerprint        <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + gateway_address    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + <span class=\"nb\">id<\/span>                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + ip_cidr_range      <span class=\"o\">=<\/span> <span class=\"s2\">\"192.168.10.0\/24\"<\/span>\r\n      + name               <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network-subnet1\"<\/span>\r\n      + network            <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network\"<\/span>\r\n      + project            <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + region             <span class=\"o\">=<\/span> <span class=\"s2\">\"asia-northeast1\"<\/span>\r\n      + secondary_ip_range <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + self_link          <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\nPlan: 2 to add, 0 to change, 0 to destroy.\r\n\r\nDo you want to perform these actions?\r\n  Terraform will perform the actions described above.\r\n  Only <span class=\"s1\">'yes'<\/span> will be accepted to approve.\r\n\r\n  Enter a value: <span class=\"nb\">yes\r\n\r\n<\/span>google_compute_network.vpc: Creating...\r\ngoogle_compute_network.vpc: Still creating... <span class=\"o\">[<\/span>10s elapsed]\r\ngoogle_compute_network.vpc: Still creating... <span class=\"o\">[<\/span>20s elapsed]\r\ngoogle_compute_network.vpc: Still creating... <span class=\"o\">[<\/span>30s elapsed]\r\ngoogle_compute_network.vpc: Still creating... <span class=\"o\">[<\/span>40s elapsed]\r\ngoogle_compute_network.vpc: Creation <span class=\"nb\">complete <\/span>after 49s <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-network]\r\ngoogle_compute_subnetwork.vpc_subnet1: Creating...\r\ngoogle_compute_subnetwork.vpc_subnet1: Still creating... <span class=\"o\">[<\/span>10s elapsed]\r\ngoogle_compute_subnetwork.vpc_subnet1: Still creating... <span class=\"o\">[<\/span>20s elapsed]\r\ngoogle_compute_subnetwork.vpc_subnet1: Still creating... <span class=\"o\">[<\/span>30s elapsed]\r\ngoogle_compute_subnetwork.vpc_subnet1: Still creating... <span class=\"o\">[<\/span>40s elapsed]\r\ngoogle_compute_subnetwork.vpc_subnet1: Still creating... <span class=\"o\">[<\/span>50s elapsed]\r\ngoogle_compute_subnetwork.vpc_subnet1: Creation <span class=\"nb\">complete <\/span>after 59s <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>asia-northeast1\/terraform-practice-network-subnet1]\r\n\r\nApply <span class=\"nb\">complete<\/span><span class=\"o\">!<\/span> Resources: 2 added, 0 changed, 0 destroyed.\r\n<\/code><\/pre>\n<p>\u5c3d\u7ba1\u82b1\u8d39\u4e86\u4e00\u4e9b\u65f6\u95f4\uff0c\u4f46\u770b\u8d77\u6765\u5df2\u7ecf\u6210\u529f\u5b8c\u6210\u4e86\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>gcloud compute networks list\r\nNAME                        SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4\r\ndefault                     AUTO         REGIONAL\r\nterraform-practice-network  AUTO         REGIONAL\r\n<span class=\"nv\">$ <\/span>gcloud compute networks subnets list | <span class=\"nb\">grep <\/span>subnet1\r\nterraform-practice-network-subnet1  asia-northeast1          terraform-practice-network  192.168.10.0\/24\r\n<\/code><\/pre>\n<h2>\u5c07&#8221;\u540d\u5b57&#8221;\u547d\u540d\u70ba&#8221;\u8b8a\u6578&#8221;\u4f86\u8a66\u8a66\u770b<\/h2>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"google_compute_network\"<\/span> <span class=\"s2\">\"vpc\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"google_compute_subnetwork\"<\/span> <span class=\"s2\">\"vpc_subnet1\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnetwork_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">ip_cidr_range<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet_cidr_range<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">network<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">google_compute_network<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">description<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"example.subnet1\"<\/span>\r\n  <span class=\"nx\">region<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">region<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"project\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"xxxx\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"region\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"asia-northeast1\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"subnet_cidr_range\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"192.168.10.0\/24\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"vpc_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-practice-network\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"subnetwork_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-practice-network-subnet1\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform plan\r\nRefreshing Terraform state <span class=\"k\">in<\/span><span class=\"nt\">-memory<\/span> prior to plan...\r\nThe refreshed state will be used to calculate this plan, but will not be\r\npersisted to <span class=\"nb\">local <\/span>or remote state storage.\r\n\r\ngoogle_compute_network.vpc: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-network]\r\ngoogle_compute_subnetwork.vpc_subnet1: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>asia-northeast1\/terraform-practice-network-subnet1]\r\n\r\n<span class=\"nt\">------------------------------------------------------------------------<\/span>\r\n\r\nNo changes. Infrastructure is up-to-date.\r\n\r\nThis means that Terraform did not detect any differences between your\r\nconfiguration and real physical resources that exist. As a result, no\r\nactions need to be performed.\r\n<\/code><\/pre>\n<p>\u6ca1\u53d8\u5316\u554a\u3002<\/p>\n<h1>\u8003\u8651\u6bcf\u4e2a\u73af\u5883\u7684\u914d\u7f6e<\/h1>\n<p>\u8003\u8651\u5982\u4f55\u5b9e\u73b0\u4e0d\u540c\u73af\u5883\u7684\u914d\u7f6e\uff0c\u5982\u751f\u4ea7\u3001\u6682\u5b58\u7b49\u3002\u8fd9\u6b21\u53c2\u8003\u4e86\u300aTerraform\u8fd0\u7ef4\u6700\u4f73\u5b9e\u8df52019\uff1a\u5c1d\u8bd5\u653e\u5f03\u5de5\u4f5c\u7a7a\u95f4\u7b49\u7b49\u300b\uff0c\u8fd9\u7bc7\u535a\u5ba2\u6587\u7ae0\u7ed9\u6211\u5f88\u5927\u7684\u542f\u53d1\u3002<\/p>\n<p>\u76ee\u524d\u53ea\u6709\u751f\u4ea7\u8fd9\u4e00\u4e2a\u9009\u9879\uff0c\u4f46\u662f\u6211\u5c1d\u8bd5\u4e86\u8fd9\u79cd\u611f\u89c9\u3002<\/p>\n<pre class=\"post-pre\"><code>$ tree\r\n.\r\n\u251c\u2500\u2500 credentials.json\r\n\u2514\u2500\u2500 environments\r\n    \u2514\u2500\u2500 production\r\n        \u251c\u2500\u2500 backend.tf\r\n        \u251c\u2500\u2500 network.tf\r\n        \u251c\u2500\u2500 provider.tf\r\n        \u2514\u2500\u2500 variables.tf\r\n<\/code><\/pre>\n<h1>\u5c1d\u8bd5\u5c06\u5176\u6a21\u5757\u5316<\/h1>\n<p>\u65e2\u7136\u5df2\u7ecf\u5728variables\u4e2d\u5b9a\u4e49\u4e86\u53d8\u91cf\uff0c\u90a3\u4e48\u6211\u4eec\u5e0c\u671b\u80fd\u591f\u5c06\u6bcf\u4e2a\u8d44\u6e90\u5b9a\u4e49\u5728staging\u4e2d\u8fdb\u884c\u5171\u4eab\u3002\u6211\u60f3\u5c06network\u7684\u8bbe\u7f6e\u5206\u79bb\u5230module\u4e2d\u8bd5\u8bd5\u770b\u3002<\/p>\n<h2>\u76ee\u5f55\u7ed3\u6784<\/h2>\n<pre class=\"post-pre\"><code>$ tree\r\n.\r\n\u251c\u2500\u2500 credentials.json\r\n\u251c\u2500\u2500 environments\r\n\u2502   \u2514\u2500\u2500 production\r\n\u2502       \u251c\u2500\u2500 backend.tf\r\n\u2502       \u251c\u2500\u2500 main.tf\r\n\u2502       \u251c\u2500\u2500 provider.tf\r\n\u2502       \u2514\u2500\u2500 variables.tf\r\n\u2514\u2500\u2500 modules\r\n    \u2514\u2500\u2500 network\r\n        \u2514\u2500\u2500 main.tf\r\n<\/code><\/pre>\n<h2>\u91cd\u65b0\u7f16\u5199\u8d44\u6e90\u5b9a\u4e49<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nx\">ariable<\/span> <span class=\"s2\">\"vpc_name\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"subnetwork_name\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"subnet_cidr_range\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"region\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"google_compute_network\"<\/span> <span class=\"s2\">\"vpc\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">auto_create_subnetworks<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"google_compute_subnetwork\"<\/span> <span class=\"s2\">\"vpc_subnet1\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnetwork_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">ip_cidr_range<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet_cidr_range<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">network<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">google_compute_network<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">description<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"example.subnet1\"<\/span>\r\n  <span class=\"nx\">region<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">region<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">module<\/span> <span class=\"s2\">\"network\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">source<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"..\/..\/modules\/network\"<\/span>\r\n\r\n  <span class=\"nx\">vpc_name<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">subnetwork_name<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnetwork_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">subnet_cidr_range<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet_cidr_range<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">region<\/span>            <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">region<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u8ba1\u5212<\/h2>\n<p>\u6211\u4f1a\u7528Plan\u8fdb\u884c\u786e\u8ba4\u3002<\/p>\n<pre class=\"post-pre\"><code>terraform plan\r\nRefreshing Terraform state <span class=\"k\">in<\/span><span class=\"nt\">-memory<\/span> prior to plan...\r\nThe refreshed state will be used to calculate this plan, but will not be\r\npersisted to <span class=\"nb\">local <\/span>or remote state storage.\r\n\r\ngoogle_compute_network.vpc: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-network]\r\ngoogle_compute_subnetwork.vpc_subnet1: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>asia-northeast1\/terraform-practice-network-subnet1]\r\n\r\n<span class=\"nt\">------------------------------------------------------------------------<\/span>\r\n\r\nAn execution plan has been generated and is shown below.\r\nResource actions are indicated with the following symbols:\r\n  + create\r\n  - destroy\r\n\r\nTerraform will perform the following actions:\r\n\r\n  <span class=\"c\"># google_compute_network.vpc will be destroyed<\/span>\r\n  - resource <span class=\"s2\">\"google_compute_network\"<\/span> <span class=\"s2\">\"vpc\"<\/span> <span class=\"o\">{<\/span>\r\n      - auto_create_subnetworks         <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span> -&gt; null\r\n      - delete_default_routes_on_create <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span> -&gt; null\r\n      - <span class=\"nb\">id<\/span>                              <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network\"<\/span> -&gt; null\r\n      - name                            <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network\"<\/span> -&gt; null\r\n      - project                         <span class=\"o\">=<\/span> <span class=\"s2\">\"xxxx\"<\/span> -&gt; null\r\n      - routing_mode                    <span class=\"o\">=<\/span> <span class=\"s2\">\"REGIONAL\"<\/span> -&gt; null\r\n      - self_link                       <span class=\"o\">=<\/span> <span class=\"s2\">\"https:\/\/www.googleapis.com\/compute\/v1\/projects\/xxxx\/global\/networks\/terraform-practice-network\"<\/span> -&gt; null\r\n    <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"c\"># google_compute_subnetwork.vpc_subnet1 will be destroyed<\/span>\r\n  - resource <span class=\"s2\">\"google_compute_subnetwork\"<\/span> <span class=\"s2\">\"vpc_subnet1\"<\/span> <span class=\"o\">{<\/span>\r\n      - creation_timestamp       <span class=\"o\">=<\/span> <span class=\"s2\">\"2019-08-05T08:17:21.744-07:00\"<\/span> -&gt; null\r\n      - description              <span class=\"o\">=<\/span> <span class=\"s2\">\"example.subnet1\"<\/span> -&gt; null\r\n      - enable_flow_logs         <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span> -&gt; null\r\n      - fingerprint              <span class=\"o\">=<\/span> <span class=\"s2\">\"9zINd1OQU44=\"<\/span> -&gt; null\r\n      - gateway_address          <span class=\"o\">=<\/span> <span class=\"s2\">\"192.168.10.1\"<\/span> -&gt; null\r\n      - <span class=\"nb\">id<\/span>                       <span class=\"o\">=<\/span> <span class=\"s2\">\"asia-northeast1\/terraform-practice-network-subnet1\"<\/span> -&gt; null\r\n      - ip_cidr_range            <span class=\"o\">=<\/span> <span class=\"s2\">\"192.168.10.0\/24\"<\/span> -&gt; null\r\n      - name                     <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network-subnet1\"<\/span> -&gt; null\r\n      - network                  <span class=\"o\">=<\/span> <span class=\"s2\">\"https:\/\/www.googleapis.com\/compute\/v1\/projects\/xxxx\/global\/networks\/terraform-practice-network\"<\/span> -&gt; null\r\n      - private_ip_google_access <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span> -&gt; null\r\n      - project                  <span class=\"o\">=<\/span> <span class=\"s2\">\"xxxx\"<\/span> -&gt; null\r\n      - region                   <span class=\"o\">=<\/span> <span class=\"s2\">\"asia-northeast1\"<\/span> -&gt; null\r\n      - secondary_ip_range       <span class=\"o\">=<\/span> <span class=\"o\">[]<\/span> -&gt; null\r\n      - self_link                <span class=\"o\">=<\/span> <span class=\"s2\">\"https:\/\/www.googleapis.com\/compute\/v1\/projects\/xxxx\/regions\/asia-northeast1\/subnetworks\/terraform-practice-network-subnet1\"<\/span> -&gt; null\r\n    <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"c\"># module.network.google_compute_network.vpc will be created<\/span>\r\n  + resource <span class=\"s2\">\"google_compute_network\"<\/span> <span class=\"s2\">\"vpc\"<\/span> <span class=\"o\">{<\/span>\r\n      + auto_create_subnetworks         <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + delete_default_routes_on_create <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + gateway_ipv4                    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + <span class=\"nb\">id<\/span>                              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + name                            <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network\"<\/span>\r\n      + project                         <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + routing_mode                    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + self_link                       <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"c\"># module.network.google_compute_subnetwork.vpc_subnet1 will be created<\/span>\r\n  + resource <span class=\"s2\">\"google_compute_subnetwork\"<\/span> <span class=\"s2\">\"vpc_subnet1\"<\/span> <span class=\"o\">{<\/span>\r\n      + creation_timestamp <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + description        <span class=\"o\">=<\/span> <span class=\"s2\">\"example.subnet1\"<\/span>\r\n      + fingerprint        <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + gateway_address    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + <span class=\"nb\">id<\/span>                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + ip_cidr_range      <span class=\"o\">=<\/span> <span class=\"s2\">\"192.168.10.0\/24\"<\/span>\r\n      + name               <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network-subnet1\"<\/span>\r\n      + network            <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network\"<\/span>\r\n      + project            <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + region             <span class=\"o\">=<\/span> <span class=\"s2\">\"asia-northeast1\"<\/span>\r\n      + secondary_ip_range <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + self_link          <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\nPlan: 2 to add, 0 to change, 2 to destroy.\r\n\r\n<span class=\"nt\">------------------------------------------------------------------------<\/span>\r\n\r\nNote: You didn<span class=\"s1\">'t specify an \"-out\" parameter to save this plan, so Terraform\r\ncan'<\/span>t guarantee that exactly these actions will be performed <span class=\"k\">if<\/span>\r\n<span class=\"s2\">\"terraform apply\"<\/span> is subsequently run.\r\n<\/code><\/pre>\n<p>\u6467\u6bc1 -&gt; \u521b\u9020 \u306b\u6210\u4e3a\u4e86\u3002<\/p>\n<h2>\u5c06terraform\u72b6\u6001\u79fb\u52a8<\/h2>\n<p>\u4f7f\u7528 Terraform \u7684 state mv \u5c06\u7eaf\u6587\u672c\u8d44\u6e90\u79fb\u52a8\u5230\u6a21\u5757\u4e2d\u7684\u8d34\u58eb | \u547c\u5524\u6708\u7403<\/p>\n<p>\u542c\u8bf4\u5728\u5c06\u8d44\u6e90\u6a21\u5757\u5316\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528 terraform state mv \u6765\u79fb\u52a8\u539f\u672c\u786c\u7f16\u7801\u7684\u8d44\u6e90\u4f4d\u7f6e\u3002\u6211\u4f1a\u5c1d\u8bd5\u4e00\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform state <span class=\"nb\">mv <\/span>google_compute_network.vpc module.network.google_compute_network.vpc\r\n\r\nError: Invalid target address\r\n\r\nCannot move to module.network.google_compute_network.vpc: module.network does\r\nnot exist <span class=\"k\">in <\/span>the current state.\r\n<\/code><\/pre>\n<p>\u51fa\u4e86\u9519\u8bef\u3002<br \/>\n\u6ca1\u6709 module.network \u8fd9\u4e2a\u4e1c\u897f\u3002<\/p>\n<p>\u4e0d\u80fd\u5c06\u8d44\u6e90\u79fb\u52a8\u5230\u65b0\u6a21\u5757 \u00b7 \u95ee\u9898 #21346 \u00b7 hashicorp\/terraform<\/p>\n<p>\u53d1\u73b0\u4e86\u8fd9\u4e2a\u95ee\u9898\u3002<\/p>\n<p>\u5141\u8bb8\u5c06\u8d44\u6e90\u8fc1\u79fb\u5230\u72b6\u6001\u4e2d\u7684\u65b0\u6a21\u5757\uff0c\u7531jbardin\u63d0\u51fa\u7684Pull Request#22299\uff0chashicorp\/terraform\u3002<\/p>\n<p>\u8fd9\u4e2a\u95ee\u9898\u73b0\u5728\u89e3\u51b3\u4e86\u5417\uff1f<br \/>\n\u770b\u8d77\u6765\u57282019\u5e7408\u670802\u65e5\u5df2\u7ecf\u8fdb\u884c\u4e86\u5408\u5e76\u3002<br \/>\n\u4f46\u662f\uff0c\u4f3c\u4e4e\u8fd8\u6ca1\u6709\u53d1\u5e03\u3002\u203b\u622a\u6b62\u52302019\u5e7408\u670806\u65e522:32\u3002<\/p>\n<h2>\u5bfc\u5165\u5e76\u58f0\u660erm<\/h2>\n<p>\u7531\u4e8e\u5728\u89e3\u51b3\u65b9\u6cd5\u4e2d\u63d0\u5230\u4e86&#8221;import&#8221;\u8fd9\u4e2a\u8bcd\uff0c\u7136\u540e\u5220\u9664\u65e7\u7684\uff0c\u6240\u4ee5\u6211\u4f1a\u5c1d\u8bd5\u8fd9\u6837\u505a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform import module.network.google_compute_network.vpc terraform-practice-network\r\nmodule.network.google_compute_network.vpc: Importing from ID <span class=\"s2\">\"terraform-practice-network\"<\/span>...\r\nmodule.network.google_compute_network.vpc: Import prepared!\r\n  Prepared google_compute_network <span class=\"k\">for <\/span>import\r\nmodule.network.google_compute_network.vpc: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-network]\r\n\r\nImport successful!\r\n\r\nThe resources that were imported are shown above. These resources are now <span class=\"k\">in\r\n<\/span>your Terraform state and will henceforth be managed by Terraform.\r\n\r\n<span class=\"nv\">$ <\/span>terraform state <span class=\"nb\">rm <\/span>google_compute_network.vpc\r\nRemoved google_compute_network.vpc\r\nSuccessfully removed 1 resource instance<span class=\"o\">(<\/span>s<span class=\"o\">)<\/span><span class=\"nb\">.<\/span>\r\n<span class=\"nv\">$ <\/span>terraform plan\r\nRefreshing Terraform state <span class=\"k\">in<\/span><span class=\"nt\">-memory<\/span> prior to plan...\r\nThe refreshed state will be used to calculate this plan, but will not be\r\npersisted to <span class=\"nb\">local <\/span>or remote state storage.\r\n\r\nmodule.network.google_compute_network.vpc: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-network]\r\ngoogle_compute_subnetwork.vpc_subnet1: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>asia-northeast1\/terraform-practice-network-subnet1]\r\n\r\n<span class=\"nt\">------------------------------------------------------------------------<\/span>\r\n\r\nAn execution plan has been generated and is shown below.\r\nResource actions are indicated with the following symbols:\r\n  + create\r\n  - destroy\r\n\r\nTerraform will perform the following actions:\r\n\r\n  <span class=\"c\"># google_compute_subnetwork.vpc_subnet1 will be destroyed<\/span>\r\n  - resource <span class=\"s2\">\"google_compute_subnetwork\"<\/span> <span class=\"s2\">\"vpc_subnet1\"<\/span> <span class=\"o\">{<\/span>\r\n      - creation_timestamp       <span class=\"o\">=<\/span> <span class=\"s2\">\"2019-08-05T08:17:21.744-07:00\"<\/span> -&gt; null\r\n      - description              <span class=\"o\">=<\/span> <span class=\"s2\">\"example.subnet1\"<\/span> -&gt; null\r\n      - enable_flow_logs         <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span> -&gt; null\r\n      - fingerprint              <span class=\"o\">=<\/span> <span class=\"s2\">\"9zINd1OQU44=\"<\/span> -&gt; null\r\n      - gateway_address          <span class=\"o\">=<\/span> <span class=\"s2\">\"192.168.10.1\"<\/span> -&gt; null\r\n      - <span class=\"nb\">id<\/span>                       <span class=\"o\">=<\/span> <span class=\"s2\">\"asia-northeast1\/terraform-practice-network-subnet1\"<\/span> -&gt; null\r\n      - ip_cidr_range            <span class=\"o\">=<\/span> <span class=\"s2\">\"192.168.10.0\/24\"<\/span> -&gt; null\r\n      - name                     <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network-subnet1\"<\/span> -&gt; null\r\n      - network                  <span class=\"o\">=<\/span> <span class=\"s2\">\"https:\/\/www.googleapis.com\/compute\/v1\/projects\/xxxx\/global\/networks\/terraform-practice-network\"<\/span> -&gt; null\r\n      - private_ip_google_access <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span> -&gt; null\r\n      - project                  <span class=\"o\">=<\/span> <span class=\"s2\">\"xxxx\"<\/span> -&gt; null\r\n      - region                   <span class=\"o\">=<\/span> <span class=\"s2\">\"asia-northeast1\"<\/span> -&gt; null\r\n      - secondary_ip_range       <span class=\"o\">=<\/span> <span class=\"o\">[]<\/span> -&gt; null\r\n      - self_link                <span class=\"o\">=<\/span> <span class=\"s2\">\"https:\/\/www.googleapis.com\/compute\/v1\/projects\/xxxx\/regions\/asia-northeast1\/subnetworks\/terraform-practice-network-subnet1\"<\/span> -&gt; null\r\n    <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"c\"># module.network.google_compute_subnetwork.vpc_subnet1 will be created<\/span>\r\n  + resource <span class=\"s2\">\"google_compute_subnetwork\"<\/span> <span class=\"s2\">\"vpc_subnet1\"<\/span> <span class=\"o\">{<\/span>\r\n      + creation_timestamp <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + description        <span class=\"o\">=<\/span> <span class=\"s2\">\"example.subnet1\"<\/span>\r\n      + fingerprint        <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + gateway_address    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + <span class=\"nb\">id<\/span>                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + ip_cidr_range      <span class=\"o\">=<\/span> <span class=\"s2\">\"192.168.10.0\/24\"<\/span>\r\n      + name               <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network-subnet1\"<\/span>\r\n      + network            <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-network\"<\/span>\r\n      + project            <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + region             <span class=\"o\">=<\/span> <span class=\"s2\">\"asia-northeast1\"<\/span>\r\n      + secondary_ip_range <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + self_link          <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\nPlan: 1 to add, 0 to change, 1 to destroy.\r\n\r\n<span class=\"nt\">------------------------------------------------------------------------<\/span>\r\n\r\nNote: You didn<span class=\"s1\">'t specify an \"-out\" parameter to save this plan, so Terraform\r\ncan'<\/span>t guarantee that exactly these actions will be performed <span class=\"k\">if<\/span>\r\n<span class=\"s2\">\"terraform apply\"<\/span> is subsequently run.\r\n<\/code><\/pre>\n<p>VPC\u7684\u9500\u6bc1\u548c\u521b\u5efa\u90fd\u4e0d\u89c1\u4e86\uff01<br \/>\n\u660e\u767d\u4e86\u3002<br \/>\n\u4e00\u65e6\u8fd9\u6837\u505a\uff0c\u5b50\u7f51\u7edc\u4e5f\u4f1a\u88ab\u5f71\u54cd\u5230\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform import module.network.google_compute_subnetwork.vpc_subnet1 terraform-practice-network-subnet1\r\nmodule.network.google_compute_subnetwork.vpc_subnet1: Importing from ID <span class=\"s2\">\"terraform-practice-network-subnet1\"<\/span>...\r\nmodule.network.google_compute_subnetwork.vpc_subnet1: Import prepared!\r\n  Prepared google_compute_subnetwork <span class=\"k\">for <\/span>import\r\nmodule.network.google_compute_subnetwork.vpc_subnet1: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>asia-northeast1\/terraform-practice-network-subnet1]\r\n\r\nImport successful!\r\n\r\nThe resources that were imported are shown above. These resources are now <span class=\"k\">in\r\n<\/span>your Terraform state and will henceforth be managed by Terraform.\r\n\r\n<span class=\"nv\">$ <\/span>terraform state <span class=\"nb\">rm <\/span>google_compute_subnetwork.vpc_subnet1\r\nRemoved google_compute_subnetwork.vpc_subnet1\r\nSuccessfully removed 1 resource instance<span class=\"o\">(<\/span>s<span class=\"o\">)<\/span><span class=\"nb\">.<\/span>\r\n<span class=\"nv\">$ <\/span>terraform plan\r\nRefreshing Terraform state <span class=\"k\">in<\/span><span class=\"nt\">-memory<\/span> prior to plan...\r\nThe refreshed state will be used to calculate this plan, but will not be\r\npersisted to <span class=\"nb\">local <\/span>or remote state storage.\r\n\r\nmodule.network.google_compute_network.vpc: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-network]\r\nmodule.network.google_compute_subnetwork.vpc_subnet1: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>asia-northeast1\/terraform-practice-network-subnet1]\r\n\r\n<span class=\"nt\">------------------------------------------------------------------------<\/span>\r\n\r\nNo changes. Infrastructure is up-to-date.\r\n\r\nThis means that Terraform did not detect any differences between your\r\nconfiguration and real physical resources that exist. As a result, no\r\nactions need to be performed.\r\n<\/code><\/pre>\n<p>\u53ef\u4ee5\u53bb\u4e86\u3002<\/p>\n<h1>\u5c06\u5b58\u50a8\u5728GCP\u4e0a\u7684\u73b0\u6709\u8d44\u6e90\u653e\u5165terraform\u4e2d\u3002<\/h1>\n<p>\u5df2\u7ecf\u4f7f\u7528\u4e86\u65e0\u6cd5\u521b\u5efa\u72b6\u6001MV\u7684\u90e8\u5206\uff0c\u4f46\u4f7f\u7528import\u4f3c\u4e4e\u53ef\u4ee5\u5c06\u73b0\u6709\u8d44\u6e90\u653e\u5165tfstate\u4e2d\u3002\u5728\u5c06\u73b0\u6709\u8d44\u6e90\u8f6c\u79fb\u5230Terraform\u8fdb\u884c\u7ba1\u7406\u65f6\uff0c\u53ef\u80fd\u4f1a\u6709\u6240\u9700\uff0c\u6240\u4ee5\u6211\u4f1a\u5c1d\u8bd5\u4e00\u4e0b\u3002<\/p>\n<h2>\u521b\u5efaGCE\u5b9e\u4f8b<\/h2>\n<p>\u9996\u5148\uff0c\u624b\u52a8\u521b\u5efaGCE\u5b9e\u4f8b\u3002<br \/>\nVPC\u5c06\u4f7f\u7528\u521a\u521b\u5efa\u7684\u90a3\u4e2a\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30de\u30b7\u30f3\u30bf\u30a4\u30d7<\/ul>\n<\/li>\n<\/ul>\n<p>f1-micro\uff08vCPU x 1\u3001\u30e1\u30e2\u30ea 0.6 GB\uff09<\/p>\n<p>\u30be\u30fc\u30f3<\/p>\n<p>asia-northeast1-a<\/p>\n<p>network<\/p>\n<p>terraform-practice-network<\/p>\n<p>subnetwork<\/p>\n<p>terraform-practice-network-subnet1<\/p>\n<p>\u5185\u90e8IP<\/p>\n<p>192.168.10.2<\/p>\n<p>boot disk image<\/p>\n<p>ubuntu-1804-bionic-v20190722a<\/p>\n<h2>\u5199\u8d44\u6e90\u5b9a\u4e49<\/h2>\n<p>Google\uff1agoogle_compute_instance &#8211; Terraform by HashiCorp\uff1a\u8c37\u6b4c\uff1a\u8c37\u6b4c\u8ba1\u7b97\u5b9e\u4f8b- Terraform by HashiCorp<\/p>\n<p>\u7531\u4e8e\u662f\u4e00\u79cd\u4e0d\u5bb9\u9519\u8fc7\u7684\u673a\u4f1a\uff0c\u6211\u4f1a\u5c06\u5b83\u5199\u5728\u6a21\u5757\u4e2d\u3002\uff08\u5047\u8bbe\u5728\u751f\u4ea7\u73af\u5883\u548c\u5206\u671f\u73af\u5883\u4e2d\u4f7f\u7528\u76f8\u540c\u7684\u6a21\u5757\uff09<br \/>\n\u8fd9\u6b21\u6211\u60f3\u8981\u521b\u5efa\u4e00\u4e2a\u5047\u8bbe\u4e3a\u8df3\u8f6c\u670d\u52a1\u5668\u7684\u5b9e\u4f8b\uff0c\u6240\u4ee5\u6211\u4f1a\u5c06\u5b83\u547d\u540d\u4e3a\u201cbastion\u201d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"name\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"subnetwork_name\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"machine_type\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"region\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"zone\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"boot_disk_image\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"private_ip\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"service_account\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"google_compute_address\"<\/span> <span class=\"s2\">\"bastion\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">region<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">region<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"google_compute_instance\"<\/span> <span class=\"s2\">\"bastion\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">machine_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">machine_type<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">zone<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">zone<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">tags<\/span>         <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"server\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"bastion\"<\/span><span class=\"p\">]<\/span>\r\n\r\n  <span class=\"nx\">boot_disk<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">initialize_params<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">image<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"https:\/\/www.googleapis.com\/compute\/v1\/projects\/ubuntu-os-cloud\/global\/images\/<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">boot_disk_image<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">network_interface<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">network_ip<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_ip<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">subnetwork<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnetwork_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">access_config<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"c1\"># static external ip<\/span>\r\n      <span class=\"nx\">nat_ip<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">google_compute_address<\/span><span class=\"p\">.<\/span><span class=\"nx\">bastion<\/span><span class=\"p\">.<\/span><span class=\"nx\">address<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">service_account<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">email<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">service_account<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">scopes<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"https:\/\/www.googleapis.com\/auth\/devstorage.read_only\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"https:\/\/www.googleapis.com\/auth\/logging.write\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"https:\/\/www.googleapis.com\/auth\/monitoring.write\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"https:\/\/www.googleapis.com\/auth\/service.management.readonly\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"https:\/\/www.googleapis.com\/auth\/servicecontrol\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"https:\/\/www.googleapis.com\/auth\/trace.append\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">]<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">module<\/span> <span class=\"s2\">\"network\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">source<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"..\/..\/modules\/network\"<\/span>\r\n\r\n  <span class=\"nx\">vpc_name<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">subnetwork_name<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnetwork_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">subnet_cidr_range<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet_cidr_range<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">region<\/span>            <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">region<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">module<\/span> <span class=\"s2\">\"bastion\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">source<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"..\/..\/modules\/bastion\"<\/span>\r\n\r\n  <span class=\"nx\">name<\/span>            <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">bastion_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">subnetwork_name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnetwork_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">machine_type<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"f1-micro\"<\/span>\r\n  <span class=\"nx\">region<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">region<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">zone<\/span>            <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">region_zone<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">boot_disk_image<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ubuntu-1804-bionic-v20190722a\"<\/span>\r\n  <span class=\"nx\">private_ip<\/span>      <span class=\"p\">=<\/span> <span class=\"s2\">\"192.168.10.2\"<\/span>\r\n  <span class=\"nx\">service_account<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"xxx-compute\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"project\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"xxxx\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"region\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"asia-northeast1\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"region_zone\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"asia-northeast1-a\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"subnet_cidr_range\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"192.168.10.0\/24\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"vpc_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-practice-network\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"subnetwork_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-practice-network-subnet1\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"bastion_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-practice-instance-1\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5c06\u53d8\u91cf\u5b8c\u5168\u72ec\u7acb\u51fa\u6765\u5b58\u653e\u5728variables\u6587\u4ef6\u4e2d\uff0c\u8fd8\u662f\u76f4\u63a5\u5199\u5728main.tf\u6587\u4ef6\u4e2d\uff0c\u8fd9\u662f\u4e00\u4e2a\u5fae\u5999\u7684\u95ee\u9898\u3002\u4f46\u662f\uff0c\u6211\u4eec\u901a\u5e38\u5c06\u53ef\u80fd\u5728\u5176\u4ed6\u5730\u65b9\u4f7f\u7528\u7684\u503c\u653e\u5728variables\u6587\u4ef6\u4e2d\u3002<\/p>\n<h2>\u5bfc\u5165<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform import module.bastion.google_compute_instance.bastion xxxx\/asia-northeast1-a\/terraform-practice-instance-1\r\nmodule.bastion.google_compute_instance.bastion: Importing from ID <span class=\"s2\">\"xxxx\/asia-northeast1-a\/terraform-practice-instance-1\"<\/span>...\r\nmodule.bastion.google_compute_instance.bastion: Import prepared!\r\n  Prepared google_compute_instance <span class=\"k\">for <\/span>import\r\nmodule.bastion.google_compute_instance.bastion: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-instance-1]\r\n\r\nImport successful!\r\n\r\nThe resources that were imported are shown above. These resources are now <span class=\"k\">in\r\n<\/span>your Terraform state and will henceforth be managed by Terraform.\r\n<\/code><\/pre>\n<p>\u521b\u5efa\u5b9e\u4f8b\u65f6\u4f1a\u81ea\u52a8\u521b\u5efaGCE\u5b9e\u4f8b\u7684\u9ed8\u8ba4\u670d\u52a1\u8d26\u53f7\uff0c\u6240\u4ee5\u6211\u60f3\u5c06\u670d\u52a1\u8d26\u53f7\u5bfc\u5165\u5e76\u5b9a\u4e49\u4e3a\u8d44\u6e90\u3002\u4f46\u662f\uff0c\u81ea\u52a8\u521b\u5efa\u7684\u670d\u52a1\u8d26\u53f7\u7684\u8d26\u53f7\u540d\u4ee5\u6570\u5b57\u5f00\u5934\uff0c\u800cTerraform\u7684google_service_account\u7684account_id\u9700\u8981\u4ee5[a-z]\u5f00\u5934\uff0c\u6240\u4ee5\u6211\u6682\u65f6\u653e\u5f03\u4e86\u8fd9\u4e2a\u60f3\u6cd5\u3002<\/p>\n<p>\u5982\u679c\u8981\u5bfc\u5165\u7684\u8bdd\uff0c\u9700\u8981\u542f\u7528\u8eab\u4efd\u548c\u8bbf\u95ee\u7ba1\u7406\uff08IAM\uff09API\u3002\u5df2\u901a\u8fc7\u5f00\u53d1\u8005\u63a7\u5236\u53f0\u8fdb\u884c\u4e86\u542f\u7528\u3002<\/p>\n<h2>\u8ba1\u5212<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform plan\r\nRefreshing Terraform state <span class=\"k\">in<\/span><span class=\"nt\">-memory<\/span> prior to plan...\r\nThe refreshed state will be used to calculate this plan, but will not be\r\npersisted to <span class=\"nb\">local <\/span>or remote state storage.\r\n\r\nmodule.network.google_compute_network.vpc: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-network]\r\nmodule.bastion.google_compute_instance.bastion: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-instance-1]\r\nmodule.network.google_compute_subnetwork.vpc_subnet1: Refreshing state... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>asia-northeast1\/terraform-practice-network-subnet1]\r\n\r\n<span class=\"nt\">------------------------------------------------------------------------<\/span>\r\n\r\nAn execution plan has been generated and is shown below.\r\nResource actions are indicated with the following symbols:\r\n  + create\r\n  ~ update <span class=\"k\">in<\/span><span class=\"nt\">-place<\/span>\r\n\r\nTerraform will perform the following actions:\r\n\r\n  <span class=\"c\"># module.bastion.google_compute_address.bastion will be created<\/span>\r\n  + resource <span class=\"s2\">\"google_compute_address\"<\/span> <span class=\"s2\">\"bastion\"<\/span> <span class=\"o\">{<\/span>\r\n      + address            <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + address_type       <span class=\"o\">=<\/span> <span class=\"s2\">\"EXTERNAL\"<\/span>\r\n      + creation_timestamp <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + <span class=\"nb\">id<\/span>                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + name               <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-instance-1\"<\/span>\r\n      + network_tier       <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + project            <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + region             <span class=\"o\">=<\/span> <span class=\"s2\">\"asia-northeast1\"<\/span>\r\n      + self_link          <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + subnetwork         <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + <span class=\"nb\">users<\/span>              <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"c\"># module.bastion.google_compute_instance.bastion will be updated in-place<\/span>\r\n  ~ resource <span class=\"s2\">\"google_compute_instance\"<\/span> <span class=\"s2\">\"bastion\"<\/span> <span class=\"o\">{<\/span>\r\n        can_ip_forward       <span class=\"o\">=<\/span> <span class=\"nb\">false\r\n        <\/span>cpu_platform         <span class=\"o\">=<\/span> <span class=\"s2\">\"Intel Broadwell\"<\/span>\r\n        deletion_protection  <span class=\"o\">=<\/span> <span class=\"nb\">false\r\n        <\/span>guest_accelerator    <span class=\"o\">=<\/span> <span class=\"o\">[]<\/span>\r\n        <span class=\"nb\">id<\/span>                   <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-instance-1\"<\/span>\r\n        instance_id          <span class=\"o\">=<\/span> <span class=\"s2\">\"xxx\"<\/span>\r\n        label_fingerprint    <span class=\"o\">=<\/span> <span class=\"s2\">\"xxx\"<\/span>\r\n        labels               <span class=\"o\">=<\/span> <span class=\"o\">{}<\/span>\r\n        machine_type         <span class=\"o\">=<\/span> <span class=\"s2\">\"f1-micro\"<\/span>\r\n        metadata             <span class=\"o\">=<\/span> <span class=\"o\">{}<\/span>\r\n        metadata_fingerprint <span class=\"o\">=<\/span> <span class=\"s2\">\"xxx\"<\/span>\r\n        name                 <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-instance-1\"<\/span>\r\n        project              <span class=\"o\">=<\/span> <span class=\"s2\">\"xxxx\"<\/span>\r\n        self_link            <span class=\"o\">=<\/span> <span class=\"s2\">\"https:\/\/www.googleapis.com\/compute\/v1\/projects\/xxxx\/zones\/asia-northeast1-a\/instances\/terraform-practice-instance-1\"<\/span>\r\n      ~ tags                 <span class=\"o\">=<\/span> <span class=\"o\">[<\/span>\r\n          + <span class=\"s2\">\"bastion\"<\/span>,\r\n          + <span class=\"s2\">\"server\"<\/span>,\r\n        <span class=\"o\">]<\/span>\r\n        tags_fingerprint     <span class=\"o\">=<\/span> <span class=\"s2\">\"xxx\"<\/span>\r\n        zone                 <span class=\"o\">=<\/span> <span class=\"s2\">\"asia-northeast1-a\"<\/span>\r\n\r\n        boot_disk <span class=\"o\">{<\/span>\r\n            auto_delete <span class=\"o\">=<\/span> <span class=\"nb\">true\r\n            <\/span>device_name <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform-practice-instance-1\"<\/span>\r\n            <span class=\"nb\">source<\/span>      <span class=\"o\">=<\/span> <span class=\"s2\">\"https:\/\/www.googleapis.com\/compute\/v1\/projects\/xxxx\/zones\/asia-northeast1-a\/disks\/terraform-practice-instance-1\"<\/span>\r\n\r\n            initialize_params <span class=\"o\">{<\/span>\r\n                image  <span class=\"o\">=<\/span> <span class=\"s2\">\"https:\/\/www.googleapis.com\/compute\/v1\/projects\/ubuntu-os-cloud\/global\/images\/ubuntu-1804-bionic-v20190722a\"<\/span>\r\n                labels <span class=\"o\">=<\/span> <span class=\"o\">{}<\/span>\r\n                size   <span class=\"o\">=<\/span> 10\r\n                <span class=\"nb\">type<\/span>   <span class=\"o\">=<\/span> <span class=\"s2\">\"pd-standard\"<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span>\r\n\r\n      ~ network_interface <span class=\"o\">{<\/span>\r\n            name               <span class=\"o\">=<\/span> <span class=\"s2\">\"nic0\"<\/span>\r\n            network            <span class=\"o\">=<\/span> <span class=\"s2\">\"https:\/\/www.googleapis.com\/compute\/v1\/projects\/xxxx\/global\/networks\/terraform-practice-network\"<\/span>\r\n            network_ip         <span class=\"o\">=<\/span> <span class=\"s2\">\"192.168.10.2\"<\/span>\r\n            subnetwork         <span class=\"o\">=<\/span> <span class=\"s2\">\"https:\/\/www.googleapis.com\/compute\/v1\/projects\/xxxx\/regions\/asia-northeast1\/subnetworks\/terraform-practice-network-subnet1\"<\/span>\r\n            subnetwork_project <span class=\"o\">=<\/span> <span class=\"s2\">\"xxxx\"<\/span>\r\n\r\n          ~ access_config <span class=\"o\">{<\/span>\r\n              ~ nat_ip       <span class=\"o\">=<\/span> <span class=\"s2\">\"xxx.xxx.xxx.xxx\"<\/span> -&gt; <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n                network_tier <span class=\"o\">=<\/span> <span class=\"s2\">\"PREMIUM\"<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span>\r\n\r\n        scheduling <span class=\"o\">{<\/span>\r\n            automatic_restart   <span class=\"o\">=<\/span> <span class=\"nb\">true\r\n            <\/span>on_host_maintenance <span class=\"o\">=<\/span> <span class=\"s2\">\"MIGRATE\"<\/span>\r\n            preemptible         <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n        <span class=\"o\">}<\/span>\r\n\r\n        service_account <span class=\"o\">{<\/span>\r\n            email  <span class=\"o\">=<\/span> <span class=\"s2\">\"xxxx-compute@developer.gserviceaccount.com\"<\/span>\r\n            scopes <span class=\"o\">=<\/span> <span class=\"o\">[<\/span>\r\n                <span class=\"s2\">\"https:\/\/www.googleapis.com\/auth\/devstorage.read_only\"<\/span>,\r\n                <span class=\"s2\">\"https:\/\/www.googleapis.com\/auth\/logging.write\"<\/span>,\r\n                <span class=\"s2\">\"https:\/\/www.googleapis.com\/auth\/monitoring.write\"<\/span>,\r\n                <span class=\"s2\">\"https:\/\/www.googleapis.com\/auth\/service.management.readonly\"<\/span>,\r\n                <span class=\"s2\">\"https:\/\/www.googleapis.com\/auth\/servicecontrol\"<\/span>,\r\n                <span class=\"s2\">\"https:\/\/www.googleapis.com\/auth\/trace.append\"<\/span>,\r\n            <span class=\"o\">]<\/span>\r\n        <span class=\"o\">}<\/span>\r\n\r\n        timeouts <span class=\"o\">{}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\nPlan: 1 to add, 1 to change, 0 to destroy.\r\n\r\n<span class=\"nt\">------------------------------------------------------------------------<\/span>\r\n\r\nNote: You didn<span class=\"s1\">'t specify an \"-out\" parameter to save this plan, so Terraform\r\ncan'<\/span>t guarantee that exactly these actions will be performed <span class=\"k\">if<\/span>\r\n<span class=\"s2\">\"terraform apply\"<\/span> is subsequently run.\r\n<\/code><\/pre>\n<p>\u611f\u89c9\u597d\u50cf\u53ef\u4ee5\u53bb\u54e6\u3002<\/p>\n<h2>\u7533\u8bf7<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform apply\r\n...\r\nmodule.bastion.google_compute_address.bastion: Creating...\r\nmodule.bastion.google_compute_address.bastion: Creation <span class=\"nb\">complete <\/span>after 4s <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>xxxx\/asia-northeast1\/terraform-practice-instance-1]\r\nmodule.bastion.google_compute_instance.bastion: Modifying... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-instance-1]\r\nmodule.bastion.google_compute_instance.bastion: Still modifying... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-instance-1, 10s elapsed]\r\nmodule.bastion.google_compute_instance.bastion: Still modifying... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-instance-1, 20s elapsed]\r\nmodule.bastion.google_compute_instance.bastion: Still modifying... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-instance-1, 30s elapsed]\r\nmodule.bastion.google_compute_instance.bastion: Modifications <span class=\"nb\">complete <\/span>after 34s <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>terraform-practice-instance-1]\r\n\r\nApply <span class=\"nb\">complete<\/span><span class=\"o\">!<\/span> Resources: 1 added, 1 changed, 0 destroyed.\r\n<\/code><\/pre>\n<h1>\u4e0b\u4e00\u6b21<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u65e2\u5b58\u306e\u624b\u52d5\u3067\u4f5c\u3063\u305f\u30ea\u30bd\u30fc\u30b9\u3092\u3059\u3079\u3066\u624b\u3067\u66f8\u304d\u8d77\u3053\u3057\u3066\u3044\u304f\u306e\u306f\u3057\u3093\u3069\u3044\u306e\u3067\u3001terraformer\u3092\u3064\u304b\u3063\u3066\u307f\u305f\u3044<\/ul>\n<\/li>\n<\/ul>\n<p>GoogleCloudPlatform\/terraformer: CLI tool to generate terraform files from existing infrastructure (reverse Terraform). Infrastructure to Code<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u770b\u5230\u4e86&#8221;Infrastructure as Code&#8221;\u53d8\u5f97\u66f4\u52a0\u5bb9\u6613\u7684&#8221;te [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48705","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>[GCP\u4e0a\u7684Terraform\u5165\u95e8] \u7b2c\u4e00\u90e8\u5206 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/gcp\u4e0a\u7684terraform\u5165\u95e8-\u7b2c\u4e00\u90e8\u5206\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[GCP\u4e0a\u7684Terraform\u5165\u95e8] \u7b2c\u4e00\u90e8\u5206\" \/>\n<meta property=\"og:description\" content=\"\u770b\u5230\u4e86&#8221;Infrastructure as Code&#8221;\u53d8\u5f97\u66f4\u52a0\u5bb9\u6613\u7684&#8221;te [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/gcp\u4e0a\u7684terraform\u5165\u95e8-\u7b2c\u4e00\u90e8\u5206\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-02-17T08:55:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T05:40:25+00:00\" \/>\n<meta name=\"author\" content=\"\u79d1, \u96c5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u96c5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/\",\"name\":\"[GCP\u4e0a\u7684Terraform\u5165\u95e8] \u7b2c\u4e00\u90e8\u5206 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-02-17T08:55:58+00:00\",\"dateModified\":\"2024-04-29T05:40:25+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"[GCP\u4e0a\u7684Terraform\u5165\u95e8] \u7b2c\u4e00\u90e8\u5206\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\",\"name\":\"\u79d1, \u96c5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u96c5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"[GCP\u4e0a\u7684Terraform\u5165\u95e8] \u7b2c\u4e00\u90e8\u5206 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/gcp\u4e0a\u7684terraform\u5165\u95e8-\u7b2c\u4e00\u90e8\u5206\/","og_locale":"zh_CN","og_type":"article","og_title":"[GCP\u4e0a\u7684Terraform\u5165\u95e8] \u7b2c\u4e00\u90e8\u5206","og_description":"\u770b\u5230\u4e86&#8221;Infrastructure as Code&#8221;\u53d8\u5f97\u66f4\u52a0\u5bb9\u6613\u7684&#8221;te [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/gcp\u4e0a\u7684terraform\u5165\u95e8-\u7b2c\u4e00\u90e8\u5206\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-02-17T08:55:58+00:00","article_modified_time":"2024-04-29T05:40:25+00:00","author":"\u79d1, \u96c5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u96c5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"16 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/","name":"[GCP\u4e0a\u7684Terraform\u5165\u95e8] \u7b2c\u4e00\u90e8\u5206 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-02-17T08:55:58+00:00","dateModified":"2024-04-29T05:40:25+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"[GCP\u4e0a\u7684Terraform\u5165\u95e8] \u7b2c\u4e00\u90e8\u5206"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a","name":"\u79d1, \u96c5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","caption":"\u79d1, \u96c5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/gcp%e4%b8%8a%e7%9a%84terraform%e5%85%a5%e9%97%a8-%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48705","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48705"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48705\/revisions"}],"predecessor-version":[{"id":85606,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48705\/revisions\/85606"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48705"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48705"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48705"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}