{"id":48806,"date":"2023-08-04T03:32:16","date_gmt":"2023-02-13T17:50:53","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/"},"modified":"2024-04-30T16:52:18","modified_gmt":"2024-04-30T08:52:18","slug":"%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/","title":{"rendered":"\u4f7f\u7528 Terraform\uff08v0.12.25\uff09\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u4ee5\u6784\u5efa GCP \u73af\u5883"},"content":{"rendered":"<h1>\u4e2d\u56fd\u4eba\u4e13\u4e3a\u4f60\u89e3\u7b54\uff01<\/h1>\n<p>&#8220;\u304a\u984c&#8221; \u7684\u672c\u5730\u5316\u4e2d\u6587\u89e3\u91ca\u5982\u4e0b\uff1a<\/p>\n<p>&#8211; \u8bdd\u9898 (hu\u00e0 t\u00ed)<br \/>\n&#8211; \u9898\u76ee (t\u00ed m\u00f9)<br \/>\n&#8211; \u63d0\u95ee (t\u00ed<br \/>\n&#8211; \u4e3b\u9898 (zh\u01d4 t\u00ed)<br \/>\n&#8211; \u7b54\u9898 (d\u00e1 t\u00ed)<br \/>\n&#8211; \u8bfe\u9898 (k\u00e8 t\u00ed)<br \/>\n&#8211; \u4f5c\u6587\u9898 (zu\u00f2 t\u00ed)<br \/>\n&#8211; \u8ba8\u8bba\u8bae\u9898 y\u00ec t\u00ed)<br \/>\n&#8211; \u8003\u9898 t\u00ed)<br \/>\n&#8211; \u547d\u9898 t\u00ed)<\/p>\n<p>\u5982\u6807\u9898\u6240\u8ff0\u3002<\/p>\n<h1>\u7684\u4e00\u4e2a\u524d\u63d0\u662f<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">GCP\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210\u6e08\u307f<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30ed\u30fc\u30ab\u30eb\u958b\u767a\u30de\u30b7\u30f3\u306b gcloud \u30b3\u30de\u30f3\u30c9\u5b9f\u884c\u74b0\u5883\u304c\u65e2\u306b\u3042\u308b\u3002<\/ul>\n<h1>\u5f00\u53d1\u73af\u5883<\/h1>\n<h2>\u64cd\u4f5c\u7cfb\u7edf &#8211; Linux\uff08Ubuntu\uff09<\/h2>\n<pre class=\"post-pre\"><code>$ cat \/etc\/os-release \r\nNAME=\"Ubuntu\"\r\nVERSION=\"18.04.4 LTS (Bionic Beaver)\"\r\n<\/code><\/pre>\n<h2>\u4e91\u539f\u751f\u67b6\u6784\u5e73\u53f0<\/h2>\n<pre class=\"post-pre\"><code>$ terraform version\r\nTerraform v0.12.25\r\n<\/code><\/pre>\n<h2># \u8c37\u6b4c\u4e91<\/h2>\n<pre class=\"post-pre\"><code>$ gcloud version\r\nGoogle Cloud SDK 294.0.0\r\n<\/code><\/pre>\n<h1>\u5b9e\u8df5<\/h1>\n<h2>\u8ba9\u60a8\u80fd\u591f\u4f7f\u7528Terraform\u3002<\/h2>\n<p>\u8bf7\u4ece\u4ee5\u4e0b\u94fe\u63a5\u4e0b\u8f7d\u5e76\u9009\u62e9\u201cLinux 64\u4f4d\u201d\u7684Terraform\u8f6f\u4ef6\u3002<br \/>\nhttps:\/\/www.terraform.io\/downloads.html<\/p>\n<p>\u5c06zip\u89e3\u538b\u5e76\u79fb\u52a8\u5230\/bin\u76ee\u5f55\u4e0b\u3002<\/p>\n<p>\u67e5\u770b\u7248\u672c<\/p>\n<pre class=\"post-pre\"><code>$ terraform version\r\nTerraform v0.12.25\r\n<\/code><\/pre>\n<h2>\u8fdb\u884c\u4f7f\u7528Terraform\u8fdb\u884cGCP\u73af\u5883\u64cd\u4f5c\u4e4b\u524d\u7684\u8bbe\u7f6e\u3002<\/h2>\n<p>\u6211\u4ee5\u6b64\u4e3a\u53c2\u8003\u3002<\/p>\n<h3>\u5c06GCP\u9879\u76eeID\u8bbe\u7f6e\u4e3a\u73af\u5883\u53d8\u91cf\u3002<\/h3>\n<p>\u5047\u8bbe\u672c\u6b21\u4f7f\u7528Terraform\u8fdb\u884c\u73af\u5883\u6784\u5efa\u7684GCP\u9879\u76eeID\u4e3a&#8221;my-gcp-prj-01&#8243;\u3002<\/p>\n<p>\u8bf7\u786e\u8ba4\u60a8\u5df2\u5728\u672c\u5730\u5f00\u53d1\u673a\u4e0a\u8fdb\u884c\u4e86\u4e0e\u76ee\u6807GCP\u9879\u76ee\u7684\u8fde\u63a5\u914d\u7f6e\uff0c<br \/>\n\u524d\u63d0\u662f\u5df2\u5b8c\u6210\u4e86\u901a\u8fc7gcloud auth login\u8fdb\u884c\u7684\u8eab\u4efd\u9a8c\u8bc1\u3002<\/p>\n<pre class=\"post-pre\"><code>$ gcloud config list \r\n\u3000\u3000\u301c\u301c\u301c\r\nproject = my-gcp-prj-01\r\n<\/code><\/pre>\n<p>\u5c06\u4e0a\u8ff0\u7684\u9879\u76eeID\u8bbe\u7f6e\u4e3a\u73af\u5883\u53d8\u91cf\u3002<\/p>\n<pre class=\"post-pre\"><code>$ export GCP_PROJECT_ID=$(gcloud config get-value project)\r\nYour active configuration is: [my-gcp-prj-01]\r\n$\r\n$ env | grep GCP_PROJECT_ID\r\nGCP_PROJECT_ID=my-gcp-prj-01\r\n<\/code><\/pre>\n<h3>\u521b\u5efa\u4e00\u4e2a\u4e13\u95e8\u7528\u4e8eTerraform\u7684\u670d\u52a1\u8d26\u53f7\u3002<\/h3>\n<p>\u7531\u4e8e\u6d89\u53caIAM\uff0c\u6240\u4ee5\u6211\u8981\u67e5\u627e\u547d\u4ee4\u83dc\u5355\u3002<\/p>\n<pre class=\"post-pre\"><code>$ gcloud iam\r\nERROR: (gcloud.iam) Command name argument expected.\r\n\r\nAvailable groups for gcloud iam:\r\n\r\n      roles                   Create and manipulate roles.\r\n      service-accounts        Create and manipulate service accounts.\r\n\r\nAvailable commands for gcloud iam:\r\n\r\n      list-grantable-roles       List IAM grantable roles for a resource.\r\n      list-testable-permissions  List IAM testable permissions for a resource.\r\n\r\nFor detailed information on this command and its flags, run:\r\n  gcloud iam --help\r\n<\/code><\/pre>\n<p>\u4f7f\u7528service-accounts\u5b50\u547d\u4ee4\u5e94\u8be5\u53ef\u4ee5\u505a\u5230\u3002\u6700\u7ec8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5b9e\u73b0\u3002<\/p>\n<pre class=\"post-pre\"><code>$ gcloud iam service-accounts create terraform\r\nCreated service account [terraform].\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d879c913a08637a6c05ad\/30-0.png\" alt=\"screenshot-console.cloud.google.com-2020.05.28-02_09_07.png\" \/><\/div>\n<h3>\u7ed9Terraform\u4e13\u7528\u7684\u670d\u52a1\u8d26\u53f7\u5206\u914d\u7f16\u8f91\u5668\u89d2\u8272\u3002<\/h3>\n<p>\u7531\u4e8e\u8fd9\u4e2a\u670d\u52a1\u8d26\u53f7\u76ee\u524d\u65e0\u6cd5\u505a\u4efb\u4f55\u4e8b\uff0c\u6211\u4eec\u9700\u8981\u7ed9\u4e88\u6743\u9650\u3002<br \/>\n\u6839\u636e\u6559\u7a0b\u6587\u7ae0\u63d0\u5230\uff0c\u5e94\u9009\u62e9\u201cProject -&gt; Editor\u201d\u4f5c\u4e3a\u89d2\u8272\u3002<br \/>\n\u5982\u679c\u4ece\u57fa\u672c\u89d2\u8272\u4e2d\u9009\u62e9\u201croles\/editor\u201d\u5c31\u53ef\u4ee5\u4e86\u3002<br \/>\n\u53c2\u8003\u94fe\u63a5\uff1ahttps:\/\/cloud.google.com\/iam\/docs\/understanding-roles?hl=ja#primitive_roles<\/p>\n<p>\u5b66\u4e60\u547d\u4ee4\u7684\u4f7f\u7528\u65b9\u6cd5\uff0c\u8bf7\u53c2\u8003\u4ee5\u4e0b\u94fe\u63a5\uff1a<br \/>\nhttps:\/\/cloud.google.com\/iam\/docs\/granting-changing-revoking-access?hl=ja#granting-gcloud-manual<\/p>\n<pre class=\"post-pre\"><code>$ gcloud projects add-iam-policy-binding ${GCP_PROJECT_ID} --member serviceAccount:terraform@${GCP_PROJECT_ID}.iam.gserviceaccount.com --role roles\/editor\r\nUpdated IAM policy for project [my-gcp-prj-01].\r\nbindings:\r\n- members:\r\n  - serviceAccount:terraform@my-gcp-prj-01.iam.gserviceaccount.com\r\n  role: roles\/editor\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d879c913a08637a6c05ad\/35-0.png\" alt=\"screenshot-console.cloud.google.com-2020.05.28-09_47_09.png\" \/><\/div>\n<h3>\u83b7\u53d6\u5177\u6709\u7f16\u8f91\u5668\u89d2\u8272\u7684\u670d\u52a1\u5e10\u6237\u7684\u51ed\u636eJSON\u3002<\/h3>\n<p>\u65e2\u7136\u6d89\u53ca\u5230\u670d\u52a1\u5e10\u6237\uff0c\u6240\u4ee5\u5e94\u8be5\u5728\u4e4b\u524d\u7684`gcloud iam service-accounts`\u83dc\u5355\u4e2d\u53ef\u4ee5\u627e\u5230\u3002<\/p>\n<pre class=\"post-pre\"><code>$ gcloud iam service-accounts \r\nERROR: (gcloud.iam.service-accounts) Command name argument expected.\r\n\r\nAvailable groups for gcloud iam service-accounts:\r\n\r\n      keys                    Manage service account keys.\r\n\r\nAvailable commands for gcloud iam service-accounts:\r\n\r\n      add-iam-policy-binding     Add an IAM policy binding to an IAM service\r\n                                 account.\r\n      create                     Create a service account for a project.\r\n      delete                     Delete a service account from a project.\r\n      describe                   Show metadata for a service account from a\r\n                                 project.\r\n\u3000\u3000\u3000\u3000\u3000\u301c\u301c\u301c\r\n<\/code><\/pre>\n<p>\u4f7f\u7528\u94a5\u5319\u7684\u611f\u89c9\u5427\u3002<\/p>\n<pre class=\"post-pre\"><code>$ gcloud iam service-accounts keys \r\nERROR: (gcloud.iam.service-accounts.keys) Command name argument expected.\r\n\r\nAvailable commands for gcloud iam service-accounts keys:\r\n\r\n      create                  Create a private key for a service account.\r\n      delete                  Delete a user-managed key from a service account.\r\n      list                    List the keys for a service account.\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>$ gcloud iam service-accounts keys create \r\nERROR: (gcloud.iam.service-accounts.keys.create) argument OUTPUT-FILE --iam-account: Must be specified.\r\nUsage: gcloud iam service-accounts keys create OUTPUT-FILE --iam-account=IAM_ACCOUNT [optional flags]\r\n<\/code><\/pre>\n<p>\u53ea\u9700\u6307\u5b9a\u8f93\u51fa\u6587\u4ef6\u7684\u540d\u79f0\u4ee5\u53ca\u6240\u5c5e\u7684\u670d\u52a1\u5e10\u6237\u5373\u53ef\u3002<\/p>\n<pre class=\"post-pre\"><code>$ gcloud iam service-accounts keys create ~\/.config\/gcloud\/my-gcp-prj-01-terraform-credential.json --iam-account terraform@my-gcp-prj-01.iam.gserviceaccount.com\r\ncreated key [532a~~~~~~~~5802~~~~~~~~f30b~~~~~~~~e7uy9] of type [json] as [\/home\/sky0621\/.config\/gcloud\/my-gcp-prj-01-terraform-credential.json] for [terraform@my-gcp-prj-01.iam.gserviceaccount.com]\r\n<\/code><\/pre>\n<p>\u4e0b\u9762\u662f\u521b\u5efa\u7684JSON\u7684\u5185\u5bb9\uff0c\u5927\u6982\u662f\u8fd9\u6837\u7684\u3002<\/p>\n<pre class=\"post-pre\"><code>$ cat ~\/.config\/gcloud\/my-gcp-prj-01-terraform-credential.json \r\n{\r\n  \"type\": \"service_account\",\r\n  \"project_id\": \"my-gcp-prj-01\",\r\n  \"private_key_id\": \"xxxxxxxxxx33580xxxxxxxxxx30b99xxxxxxxxxx\",\r\n  \"private_key\": \"-----BEGIN PRIVATE KEY-----\\nXX\u3010\u9375\u306e\u4e2d\u8eab\u3011XXXX=\\n-----END PRIVATE KEY-----\\n\",\r\n  \"client_email\": \"terraform@my-gcp-prj-01.iam.gserviceaccount.com\",\r\n  \"client_id\": \"11111111111111111111\",\r\n  \"auth_uri\": \"https:\/\/accounts.google.com\/o\/oauth2\/auth\",\r\n  \"token_uri\": \"https:\/\/oauth2.googleapis.com\/token\",\r\n  \"auth_provider_x509_cert_url\": \"https:\/\/www.googleapis.com\/oauth2\/v1\/certs\",\r\n  \"client_x509_cert_url\": \"https:\/\/www.googleapis.com\/robot\/v1\/metadata\/x509\/terraform%40my-gcp-prj-01.iam.gserviceaccount.com\"\r\n}\r\n<\/code><\/pre>\n<h2>\u51c6\u5907\u5de5\u4f5c\u5df2\u7ecf\u5b8c\u6210\u4e86\u3002<\/h2>\n<p>\u6211\u8bd5\u7740\u6839\u636e\u4ee5\u4e0b\u6b65\u9aa4\uff0c\u5728GCP\u4e0a\u7f16\u5199\u4e00\u4e2a\u8bd5\u9a8c\u6027\u7684tf\u6587\u4ef6\u6765\u521b\u5efa\u8d44\u6e90\u3002<br \/>\nhttps:\/\/learn.hashicorp.com\/terraform\/gcp\/build#configuration<\/p>\n<pre class=\"post-pre\"><code>provider \"google\" {\r\n  version = \"3.5.0\"\r\n\r\n  region = \"asia-northeast1\"\r\n  zone = \"asia-northeast1-c\"\r\n}\r\n\r\nresource \"google_compute_network\" \"vpc_network\" {\r\n  name = \"terraform-network\"\r\n}\r\n<\/code><\/pre>\n<p>\u4ece\u53c2\u8003\u9875\u9762\u4e0a\u7684\u5185\u5bb9\u4e2d\u7701\u7565\u4e86\u4ee5\u4e0b\u90e8\u5206\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">credentials<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">project<\/ul>\n<p>\u6211\u5011\u6c7a\u5b9a\u4f7f\u7528\u4e0a\u8ff0\u5169\u500b\u96b1\u542b\u7684\u74b0\u5883\u8b8a\u6578\u4f86\u6307\u5b9a\u3002\u4ee5\u4e0b\u662f\u53c3\u8003\u8cc7\u6599\u3002<br \/>\nhttps:\/\/www.terraform.io\/docs\/providers\/google\/guides\/provider_reference.html#full-reference<\/p>\n<h2>\u597d\u7684\uff0c\u5f00\u59cb\u884c\u52a8\u3002<\/h2>\n<h3>\u7b2c\u4e00\u6b21\u4f7f\u7528\u65f6\uff0c\u9996\u5148\u6267\u884c terraform init\u3002<\/h3>\n<pre class=\"post-pre\"><code>$ terraform init\r\n\r\nInitializing the backend...\r\n\r\nInitializing provider plugins...\r\n- Checking for available provider plugins...\r\n- Downloading plugin for provider \"google\" (hashicorp\/google) 3.5.0...\r\n\r\nTerraform has been successfully initialized!\r\n\r\nYou may now begin working with Terraform. Try running \"terraform plan\" to see\r\nany changes that are required for your infrastructure. All Terraform commands\r\nshould now work.\r\n\r\nIf you ever set or change modules or backend configuration for Terraform,\r\nrerun this command to reinitialize your working directory. If you forget, other\r\ncommands will detect it and remind you to do so if necessary.\r\n<\/code><\/pre>\n<p>\u63a5\u7740\uff0c\u4f1a\u751f\u6210\u540d\u4e3a.terraform\u7684\u6587\u4ef6\u5939\u3002<br \/>\n\u5176\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n<pre class=\"post-pre\"><code>$ ls -la .terraform\/plugins\/linux_amd64\/\r\n\u5408\u8a08 50484\r\ndrwxr-xr-x 2 sky0621 sky0621     4096  5\u6708 28 23:47 .\r\ndrwxr-xr-x 3 sky0621 sky0621     4096  5\u6708 28 23:47 ..\r\n-rwxrwxr-x 1 sky0621 sky0621       82  5\u6708 28 23:47 lock.json\r\n-rwxr-xr-x 1 sky0621 sky0621 51679232  5\u6708 28 23:47 terraform-provider-google_v3.5.0_x5\r\n<\/code><\/pre>\n<h3>\u7136\u540e\u6267\u884c terraform plan \uff0c\u4ee5\u4e86\u89e3\u6267\u884c\u540e\u4f1a\u662f\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\u3002<\/h3>\n<p>\u4f46\u662f\uff0c\u5728\u6b64\u4e4b\u524d\u3002<br \/>\n\u9996\u5148\uff0cterraform\u547d\u4ee4\u6709\u54ea\u4e9b\u5b50\u547d\u4ee4\uff1f<\/p>\n<h4>\u5b50\u547d\u4ee4 (z\u01d0<\/h4>\n<pre class=\"post-pre\"><code>$ terraform \r\nUsage: terraform [-version] [-help] &lt;command&gt; [args]\r\n\r\nThe available commands for execution are listed below.\r\nThe most common, useful commands are shown first, followed by\r\nless common or more advanced commands. If you're just getting\r\nstarted with Terraform, stick with the common commands. For the\r\nother commands, please read the help and docs before usage.\r\n\r\nCommon commands:\r\n    apply              Builds or changes infrastructure\r\n    console            Interactive console for Terraform interpolations\r\n    destroy            Destroy Terraform-managed infrastructure\r\n    env                Workspace management\r\n    fmt                Rewrites config files to canonical format\r\n    get                Download and install modules for the configuration\r\n    graph              Create a visual graph of Terraform resources\r\n    import             Import existing infrastructure into Terraform\r\n    init               Initialize a Terraform working directory\r\n    login              Obtain and save credentials for a remote host\r\n    logout             Remove locally-stored credentials for a remote host\r\n    output             Read an output from a state file\r\n    plan               Generate and show an execution plan\r\n    providers          Prints a tree of the providers used in the configuration\r\n    refresh            Update local state file against real resources\r\n    show               Inspect Terraform state or plan\r\n    taint              Manually mark a resource for recreation\r\n    untaint            Manually unmark a resource as tainted\r\n    validate           Validates the Terraform files\r\n    version            Prints the Terraform version\r\n    workspace          Workspace management\r\n\r\nAll other commands:\r\n    0.12upgrade        Rewrites pre-0.12 module source code for v0.12\r\n    debug              Debug output management (experimental)\r\n    force-unlock       Manually unlock the terraform state\r\n    push               Obsolete command for Terraform Enterprise legacy (v1)\r\n    state              Advanced state management\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u662f\u7ecf\u5e38\u4f7f\u7528\uff08\u6216\u8005\u8bf4\u662f\u5728\u6559\u7a0b\u7ea7\u522b\u7ecf\u5e38\u51fa\u73b0\u7684\uff09\u4e00\u4e9b\u547d\u4ee4\uff1aapply\u3001destroy\u3001init\u3001plan\u3002<br \/>\n\u987a\u4fbf\u8bf4\u4e00\u53e5\uff08\uff1f\uff09\uff0c\u6211\u4eec\u4e5f\u505a\u4ee5\u4e0b\u4e24\u4e2a\u65e0\u5bb3\u7684\u547d\u4ee4\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">fmt<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">validate<\/ul>\n<h4>\u6545\u610f\u5730\u5c06\u683c\u5f0f\u7565\u5fae\u8c03\u6574\uff0c\u6267\u884c terraform fmt\u3002<\/h4>\n<pre class=\"post-pre\"><code>$ cat main.tf \r\nprovider \"google\"{\r\n  version = \"3.5.0\"\r\n    region = \"asia-northeast1\"\r\n  zone= \"asia-northeast1-c\"\r\n}\r\nresource \"google_compute_network\" \"vpc_network\"   {\r\n  name = \"terraform-network\"\r\n}\r\n$\r\n$ terraform fmt\r\nmain.tf\r\n$\r\n$ cat main.tf \r\nprovider \"google\" {\r\n  version = \"3.5.0\"\r\n  region  = \"asia-northeast1\"\r\n  zone    = \"asia-northeast1-c\"\r\n}\r\nresource \"google_compute_network\" \"vpc_network\" {\r\n  name = \"terraform-network\"\r\n}\r\n<\/code><\/pre>\n<p>\u54e6\uff0c\u5b8c\u7f8e\u4e86\u3002<\/p>\n<h4>\u63a5\u4e0b\u6765\u662f\u9a8c\u8bc1\u3002<\/h4>\n<p>\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c<\/p>\n<pre class=\"post-pre\"><code>$ terraform validate\r\nSuccess! The configuration is valid.\r\n<\/code><\/pre>\n<p>\u5982\u679c\u6211\u8bd5\u7740\u7ed9\u4f60\u4e00\u4e9b\u5947\u602a\u7684\u4e1c\u897f\uff0c\u6bd4\u5982\u7248\u672c2\u6216\u8005xyz\u7b49\u4e8e123\u3002<\/p>\n<pre class=\"post-pre\"><code>$ cat main.tf \r\nprovider \"google\" {\r\n  version2 = \"3.5.0\"\r\n  region  = \"asia-northeast1\"\r\n  zone    = \"asia-northeast1-c\"\r\n}\r\nresource \"google_compute_network\" \"vpc_network\" {\r\n  name = \"terraform-network\"\r\n  xyz = 123\r\n}\r\n$\r\n$ terraform validate\r\n\r\nError: Unsupported argument\r\n\r\n  on main.tf line 2, in provider \"google\":\r\n   2:   version2 = \"3.5.0\"\r\n\r\nAn argument named \"version2\" is not expected here.\r\n\r\n$\r\n<\/code><\/pre>\n<p>xyz = 123\u5c31\u4e0d\u4f1a\u88ab\u751f\u6c14\u4e86\u3002\u5982\u679c\u4fee\u6b63version2\u5e76\u91cd\u65b0\u8fd0\u884c\uff0c<\/p>\n<pre class=\"post-pre\"><code>$ terraform validate\r\n\r\nError: Unsupported argument\r\n\r\n  on main.tf line 8, in resource \"google_compute_network\" \"vpc_network\":\r\n   8:   xyz = 123\r\n\r\nAn argument named \"xyz\" is not expected here.\r\n\r\n<\/code><\/pre>\n<p>\u54ce\u5440\uff0c\u4e00\u65e6\u53d1\u73b0\u95ee\u9898\uff0c\u9a8c\u8bc1\u5c31\u4f1a\u88ab\u4e2d\u65ad\u2026\u2026<\/p>\n<h4>\u7ec8\u4e8e\uff0c\u8ba1\u5212\u3002<\/h4>\n<p>\u73a9\u4e50\u5230\u6b64\u4e3a\u6b62\uff0c\u6267\u884cterraform plan\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform plan\r\nRefreshing Terraform state in-memory prior to plan...\r\nThe refreshed state will be used to calculate this plan, but will not be\r\npersisted to local or remote state storage.\r\n\r\n\r\n------------------------------------------------------------------------\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  # google_compute_network.vpc_network will be created\r\n  + resource \"google_compute_network\" \"vpc_network\" {\r\n      + auto_create_subnetworks         = true\r\n      + delete_default_routes_on_create = false\r\n      + gateway_ipv4                    = (known after apply)\r\n      + id                              = (known after apply)\r\n      + ipv4_range                      = (known after apply)\r\n      + name                            = \"terraform-network\"\r\n      + project                         = (known after apply)\r\n      + routing_mode                    = (known after apply)\r\n      + self_link                       = (known after apply)\r\n    }\r\n\r\nPlan: 1 to add, 0 to change, 0 to destroy.\r\n\r\n------------------------------------------------------------------------\r\n\r\nNote: You didn't specify an \"-out\" parameter to save this plan, so Terraform\r\ncan't guarantee that exactly these actions will be performed if\r\n\"terraform apply\" is subsequently run.\r\n\r\n<\/code><\/pre>\n<p>\u53ea\u8981\u5199\u5165main.tf\u7684\u5185\u5bb9\u53ea\u662f\u521b\u5efa\u4e00\u4e2a\u7f51\u7edc\u8d44\u6e90\uff0c\u6240\u4ee5\u53ef\u4ee5\u7b80\u5355\u5730\u50cf\u8fd9\u6837\u5b8c\u6210\u3002<br \/>\n\u4e00\u65e6\u5b9a\u4e49\u4e86\u5fc5\u8981\u7684GCP\u8d44\u6e90\uff0c\u9002\u7528\u4e8e\u5f00\u53d1\u4e00\u5b9a\u89c4\u6a21\u7684\u670d\u52a1\uff0c\u5c06\u4f1a\u53d8\u5f97\u975e\u5e38\u590d\u6742\u3002<\/p>\n<h3>\u7ec8\u4e8e\u5c06GCP\u73af\u5883\u5e94\u7528\u4e0a\u4e86\u3002<\/h3>\n<pre class=\"post-pre\"><code>$ 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  # google_compute_network.vpc_network will be created\r\n  + resource \"google_compute_network\" \"vpc_network\" {\r\n      + auto_create_subnetworks         = true\r\n      + delete_default_routes_on_create = false\r\n      + gateway_ipv4                    = (known after apply)\r\n      + id                              = (known after apply)\r\n      + ipv4_range                      = (known after apply)\r\n      + name                            = \"terraform-network\"\r\n      + project                         = (known after apply)\r\n      + routing_mode                    = (known after apply)\r\n      + self_link                       = (known after apply)\r\n    }\r\n\r\nPlan: 1 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 'yes' will be accepted to approve.\r\n\r\n  Enter a value: yes\r\n\r\ngoogle_compute_network.vpc_network: Creating...\r\n\r\nError: Error creating Network: googleapi: Error 403: Access Not Configured. Compute Engine API has not been used in project 691957547651 before or it is disabled. Enable it by visiting https:\/\/console.developers.google.com\/apis\/api\/compute.googleapis.com\/overview?project=691957547651 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry., accessNotConfigured\r\n\r\n  on main.tf line 6, in resource \"google_compute_network\" \"vpc_network\":\r\n   6: resource \"google_compute_network\" \"vpc_network\" {\r\n\r\n<\/code><\/pre>\n<p>\u597d\u7684\uff0c\u5931\u8d25\u4e86\u3002<br \/>\n\u7531\u4e8e\u6ca1\u6709\u542f\u7528\u6240\u4f7f\u7528\u8d44\u6e90\u7684 API\u3002\u5b83\u662f\u5173\u4e8e GCE \u7684\u3002<br \/>\n\u5e76\u4e14\uff0c\u9519\u8bef\u6d88\u606f\u4e2d\u8fd8\u7ed9\u4e86\u6211\u4eec\u4e00\u4e2a\u94fe\u63a5\uff0c\u8981\u6c42\u6211\u4eec\u8bbf\u95ee\u6b64\u5904\u3002<br \/>\nhttps:\/\/console.developers.google.com\/apis\/api\/compute.googleapis.com\/overview?project=xxxxxxxxxx<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d879c913a08637a6c05ad\/81-0.png\" alt=\"screenshot-console.developers.google.com-2020.05.29-00_16_01.png\" \/><\/div>\n<p>\u6240\u4ee5\u55ef\uff0c\u5728\u8fd9\u91cc\uff0c\u867d\u7136\u4f60\u53ef\u4ee5\u70b9\u51fb&#8221;\u542f\u7528&#8221;\uff0c\u4f46\u662f\u9664\u4e86\u786e\u8ba4terraform\u6267\u884c\u7ed3\u679c\u4e4b\u5916\uff0c\u5c3d\u53ef\u80fd\u4f7f\u7528gcloud\u547d\u4ee4\u6765\u5b8c\u6210\u3002<\/p>\n<h4>\u6fc0\u6d3bAPI<\/h4>\n<p>\u8bf7\u53c2\u8003\u4ee5\u4e0b\u94fe\u63a5\uff0c\u4ee5\u5c55\u793a\u53ef\u7528\u7684\u670d\u52a1\u5217\u8868\uff1a<br \/>\nhttps:\/\/cloud.google.com\/endpoints\/docs\/openapi\/enable-api?hl=ja<\/p>\n<pre class=\"post-pre\"><code>$ gcloud services list --available \r\nNAME                                                  TITLE\r\nabusiveexperiencereport.googleapis.com                Abusive Experience Report API\r\nacceleratedmobilepageurl.googleapis.com               Accelerated Mobile Pages (AMP) URL API\r\n\u3000\u3000\u301c\u301c\u301c\r\ncomposer.googleapis.com                               Cloud Composer API\r\ncompute.googleapis.com                                Compute Engine API\r\ncomputescanning.googleapis.com                        Compute Scanning API\r\ncontacts.googleapis.com                               Contacts API\r\ncontainer.googleapis.com                              Kubernetes Engine API\r\n\u3000\u3000\u301c\u301c\u301c\r\nyoutubereporting.googleapis.com                       YouTube Reporting API\r\nzync.googleapis.com                                   Zync Render API\r\n<\/code><\/pre>\n<p>\u76f4\u63a5\u5927\u91cf\u51fa\u73b0\uff0c\u4f46\u7531\u4e8e\u9519\u8bef\u4fe1\u606f\u4e2d\u63d0\u5230\u7684\u662fGCE\uff0c\u56e0\u6b64\u53ef\u4ee5\u731c\u6d4b\u662f\u4ee5&#8221;compute.googleapis.com&#8221;\u5f00\u5934\u7684\u3002<br \/>\n\u56e0\u6b64\uff0c\u6211\u4f1a\u5c1d\u8bd5\u8fd0\u884c&#8221;gcloud services enable SERVICE_NAME&#8221;\u6765\u542f\u7528\u5b83\u3002<\/p>\n<pre class=\"post-pre\"><code>$ gcloud services enable compute.googleapis.com\r\nERROR: (gcloud.services.enable) FAILED_PRECONDITION: Billing must be enabled for activation of service '[compute.googleapis.com, compute.googleapis.com, compute.googleapis.com]' in project 'xxxxxxxxxx' to proceed.\r\n- '@type': type.googleapis.com\/google.rpc.PreconditionFailure\r\n  violations:\r\n  - description: \"billing-enabled: Project's billing account is not found. https:\/\/console.developers.google.com\/project\/xxxxxxxxxx\/settings\"\r\n    subject: 'xxxxxxxxxx'\r\n    type: serviceusage\/billing-enabled\r\n<\/code><\/pre>\n<p>\u90a3\u4e2a\uff1f<br \/>\n\u554a\uff0c\u603b\u4e4b\u5148\u51c6\u5907\u597d\u8c37\u6b4c\u8d26\u53f7\uff0c\u5df2\u7ecf\u521b\u5efa\u4e86GCP\u9879\u76ee\uff0c\u4e0d\u8fc7\u8fd8\u6ca1\u6709\u8bbe\u7f6e\u8ba1\u8d39\u3002<br \/>\n\u53ef\u4ee5\u8bd5\u7528\u4e00\u4e0b\u514d\u8d39\u8bd5\u7528\u7248\uff0c\u70b9\u51fb\u4e0b\u65b9\u7684&#8221;\u542f\u7528&#8221;\u6309\u94ae\u3002<br \/>\n\u5728\u8bbe\u7f6e\u8fc7\u7a0b\u4e2d\u4f1a\u9700\u8981\u4fe1\u7528\u5361\uff0c\u4f46\u662f\u53ef\u4ee5\u514d\u8d39\u4f7f\u7528300\u7f8e\u5143\uff0c\u800c\u4e14\u5982\u679c\u4e0d\u81ea\u5df1\u8bbe\u7f6e\uff0c\u4e0d\u4f1a\u81ea\u52a8\u4ece\u4fe1\u7528\u5361\u6263\u8d39\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d879c913a08637a6c05ad\/89-0.png\" alt=\"screenshot-console.cloud.google.com-2020.05.29-00_26_39.png\" \/><\/div>\n<p>\u6240\u4ee5\uff0c\u5c31\u50cf\u8fd9\u6837\uff0c\u514d\u8d39\u8bd5\u7528\u5f00\u59cb\u4e86\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d879c913a08637a6c05ad\/91-0.png\" alt=\"screenshot-console.cloud.google.com-2020.05.29-00_47_57.png\" \/><\/div>\n<p>\u6240\u4ee5\uff0c\u6211\u521a\u521a\u91cd\u65b0\u5c1d\u8bd5\u6fc0\u6d3b\u4e86\u4e4b\u524d\u5931\u8d25\u7684API\u3002<\/p>\n<pre class=\"post-pre\"><code>$ gcloud services enable compute.googleapis.com\r\nOperation \"operations\/xxx.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\" finished successfully.\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d879c913a08637a6c05ad\/94-0.png\" alt=\"screenshot-console.developers.google.com-2020.05.29-01_22_46.png\" \/><\/div>\n<h4>\u8bf7\u518d\u6b21\u6267\u884cterraform apply\u3002<\/h4>\n<pre class=\"post-pre\"><code>$ 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  # google_compute_network.vpc_network will be created\r\n  + resource \"google_compute_network\" \"vpc_network\" {\r\n      + auto_create_subnetworks         = true\r\n      + delete_default_routes_on_create = false\r\n      + gateway_ipv4                    = (known after apply)\r\n      + id                              = (known after apply)\r\n      + ipv4_range                      = (known after apply)\r\n      + name                            = \"terraform-network\"\r\n      + project                         = (known after apply)\r\n      + routing_mode                    = (known after apply)\r\n      + self_link                       = (known after apply)\r\n    }\r\n\r\nPlan: 1 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 'yes' will be accepted to approve.\r\n\r\n  Enter a value: yes\r\n\r\ngoogle_compute_network.vpc_network: Creating...\r\ngoogle_compute_network.vpc_network: Still creating... [10s elapsed]\r\ngoogle_compute_network.vpc_network: Still creating... [20s elapsed]\r\ngoogle_compute_network.vpc_network: Still creating... [30s elapsed]\r\ngoogle_compute_network.vpc_network: Still creating... [40s elapsed]\r\ngoogle_compute_network.vpc_network: Creation complete after 50s [id=projects\/my-gcp-prj-01\/global\/networks\/terraform-network]\r\n\r\nApply complete! Resources: 1 added, 0 changed, 0 destroyed.\r\n<\/code><\/pre>\n<p>\u8fd9\u6b21\u987a\u5229\u5b8c\u6210\u4e86\u3002<br \/>\n\u8ba9\u6211\u4eec\u6765\u786e\u8ba4\u6210\u679c\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d879c913a08637a6c05ad\/98-0.png\" alt=\"screenshot-console.cloud.google.com-2020.05.29-01_07_30.png\" \/><\/div>\n<p>\u91cd\u65b0\u786e\u8ba4\u4e00\u4e0b main.tf \u7684\u5185\u5bb9\u3002<\/p>\n<pre class=\"post-pre\"><code>$ cat main.tf \r\nprovider \"google\" {\r\n  version = \"3.5.0\"\r\n  region  = \"asia-northeast1\"\r\n  zone    = \"asia-northeast1-c\"\r\n}\r\nresource \"google_compute_network\" \"vpc_network\" {\r\n  name = \"terraform-network\"\r\n}\r\n<\/code><\/pre>\n<p>\u55ef\uff0c\u5df2\u7ecf\u521b\u5efa\u4e86\u4e00\u4e2a\u540d\u4e3aterraform-network\u7684VPC\u7f51\u7edc\u3002<\/p>\n<h3>\u901a\u8fc7Terraform\u6784\u5efa\u7684GCP\u73af\u5883\u7684\u72b6\u6001<\/h3>\n<p>Terraform\u901a\u8fc7tfstate\u6587\u4ef6\u6765\u7ba1\u7406\u901a\u8fc7\u547d\u4ee4\u6267\u884c\u7684\u5f53\u524d\u72b6\u6001\u3002<br \/>\n\u6240\u4ee5\uff0c\u5982\u679c\u6ca1\u6709\u8fd9\u4e2a\u6587\u4ef6\uff0c\u5c31\u65e0\u6cd5\u4e86\u89e3\u5f53\u524d\u72b6\u6001\u3002<br \/>\n\u56e0\u6b64\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u901a\u8fc7\u6267\u884cterraform\u547d\u4ee4\u65f6\uff0c\u4f1a\u5c06\u6b64\u6587\u4ef6\u8f93\u51fa\u5230AWS\u7684S3\u6216GCP\u7684Cloud Storage\u4e2d\uff0c\u4ee5\u4fbf\uff08\u65e0\u8bba\u8c01\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884cterraform\u547d\u4ee4\uff09\u53ef\u4ee5\u5171\u4eab\u76f8\u540c\u7684\u72b6\u6001\uff0c\u8fd9\u662f\u5b9e\u9645\u8fd0\u8425\u4e2d\u7684\u6807\u51c6\u65b9\u6cd5\u3002<\/p>\n<h2>\u597d\u7684\uff0c\u6211\u6765\u6536\u62fe\u3002 de, w\u01d2 .)<\/h2>\n<p>\u56e0\u4e3a\u8fd9\u53ea\u662f\u4e2a\u8bd5\u9a8c\uff0c\u867d\u7136\u521b\u5efa\u4e86 VPC \u7f51\u7edc\uff0c\u4f46\u662f\u4f1a\u5c06\u5176\u5220\u9664\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform destroy\r\ngoogle_compute_network.vpc_network: Refreshing state... [id=projects\/my-gcp-prj-01\/global\/networks\/terraform-network]\r\n\r\nAn execution plan has been generated and is shown below.\r\nResource actions are indicated with the following symbols:\r\n  - destroy\r\n\r\nTerraform will perform the following actions:\r\n\r\n  # google_compute_network.vpc_network will be destroyed\r\n  - resource \"google_compute_network\" \"vpc_network\" {\r\n      - auto_create_subnetworks         = true -&gt; null\r\n      - delete_default_routes_on_create = false -&gt; null\r\n      - id                              = \"projects\/my-gcp-prj-01\/global\/networks\/terraform-network\" -&gt; null\r\n      - name                            = \"terraform-network\" -&gt; null\r\n      - project                         = \"my-gcp-prj-01\" -&gt; null\r\n      - routing_mode                    = \"REGIONAL\" -&gt; null\r\n      - self_link                       = \"https:\/\/www.googleapis.com\/compute\/v1\/projects\/my-gcp-prj-01\/global\/networks\/terraform-network\" -&gt; null\r\n    }\r\n\r\nPlan: 0 to add, 0 to change, 1 to destroy.\r\n\r\nDo you really want to destroy all resources?\r\n  Terraform will destroy all your managed infrastructure, as shown above.\r\n  There is no undo. Only 'yes' will be accepted to confirm.\r\n\r\n  Enter a value: yes\r\n\r\ngoogle_compute_network.vpc_network: Destroying... [id=projects\/my-gcp-prj-01\/global\/networks\/terraform-network]\r\ngoogle_compute_network.vpc_network: Still destroying... [id=projects\/my-gcp-prj-01\/global\/networks\/terraform-network, 10s elapsed]\r\ngoogle_compute_network.vpc_network: Still destroying... [id=projects\/my-gcp-prj-01\/global\/networks\/terraform-network, 20s elapsed]\r\ngoogle_compute_network.vpc_network: Still destroying... [id=projects\/my-gcp-prj-01\/global\/networks\/terraform-network, 30s elapsed]\r\ngoogle_compute_network.vpc_network: Destruction complete after 39s\r\n\r\nDestroy complete! Resources: 1 destroyed.\r\n<\/code><\/pre>\n<h1>\u603b\u7ed3<\/h1>\n<p>\u53ea\u8981\u638c\u63e1\u4e86\u57fa\u672c\u8981\u70b9\uff0c\u4e4b\u540e\u5c31\u6ca1\u4ec0\u4e48\u95ee\u9898\u4e86\u3002<br \/>\n\u5728\u6b64\u4e4b\u540e\uff0c\u9996\u5148\u9700\u8981\u4e86\u89e3GCP\u7684\u670d\u52a1\u5e76\u5b66\u4e60GCP\u63d0\u4f9b\u5546\u7684\u914d\u7f6e\u65b9\u6cd5\uff0c\u540c\u65f6\u8fd8\u9700\u8981\u4e86\u89e3Terraform\u7684\u6700\u4f73\u5b9e\u8df5\u3002\u603b\u4e4b\uff0c\u552f\u4e00\u7684\u529e\u6cd5\u5c31\u662f\u5b9e\u9645\u64cd\u4f5c\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e2d\u56fd\u4eba\u4e13\u4e3a\u4f60\u89e3\u7b54\uff01 &#8220;\u304a\u984c&#8221; \u7684\u672c\u5730\u5316\u4e2d\u6587\u89e3\u91ca\u5982\u4e0b\uff1a &#8211; \u8bdd\u9898 (hu\u00e0  [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48806","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>\u4f7f\u7528 Terraform\uff08v0.12.25\uff09\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u4ee5\u6784\u5efa GCP \u73af\u5883 - 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\/\u4f7f\u7528-terraform\uff08v0-12-25\uff09\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u4ee5\u6784\u5efa-gcp-\u73af\u5883\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528 Terraform\uff08v0.12.25\uff09\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u4ee5\u6784\u5efa GCP \u73af\u5883\" \/>\n<meta property=\"og:description\" content=\"\u4e2d\u56fd\u4eba\u4e13\u4e3a\u4f60\u89e3\u7b54\uff01 &#8220;\u304a\u984c&#8221; \u7684\u672c\u5730\u5316\u4e2d\u6587\u89e3\u91ca\u5982\u4e0b\uff1a &#8211; \u8bdd\u9898 (hu\u00e0 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528-terraform\uff08v0-12-25\uff09\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u4ee5\u6784\u5efa-gcp-\u73af\u5883\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-02-13T17:50:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T08:52:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d879c913a08637a6c05ad\/30-0.png\" \/>\n<meta name=\"author\" content=\"\u65b0, \u97f5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u65b0, \u97f5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 \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\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/\",\"name\":\"\u4f7f\u7528 Terraform\uff08v0.12.25\uff09\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u4ee5\u6784\u5efa GCP \u73af\u5883 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-02-13T17:50:53+00:00\",\"dateModified\":\"2024-04-30T08:52:18+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528 Terraform\uff08v0.12.25\uff09\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u4ee5\u6784\u5efa GCP \u73af\u5883\"}]},{\"@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\/4ba4019495123db3038fd0809e6959c9\",\"name\":\"\u65b0, \u97f5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"caption\":\"\u65b0, \u97f5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528 Terraform\uff08v0.12.25\uff09\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u4ee5\u6784\u5efa GCP \u73af\u5883 - 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\/\u4f7f\u7528-terraform\uff08v0-12-25\uff09\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u4ee5\u6784\u5efa-gcp-\u73af\u5883\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528 Terraform\uff08v0.12.25\uff09\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u4ee5\u6784\u5efa GCP \u73af\u5883","og_description":"\u4e2d\u56fd\u4eba\u4e13\u4e3a\u4f60\u89e3\u7b54\uff01 &#8220;\u304a\u984c&#8221; \u7684\u672c\u5730\u5316\u4e2d\u6587\u89e3\u91ca\u5982\u4e0b\uff1a &#8211; \u8bdd\u9898 (hu\u00e0 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528-terraform\uff08v0-12-25\uff09\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u4ee5\u6784\u5efa-gcp-\u73af\u5883\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-02-13T17:50:53+00:00","article_modified_time":"2024-04-30T08:52:18+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d879c913a08637a6c05ad\/30-0.png"}],"author":"\u65b0, \u97f5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u65b0, \u97f5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"10 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/","name":"\u4f7f\u7528 Terraform\uff08v0.12.25\uff09\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u4ee5\u6784\u5efa GCP \u73af\u5883 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-02-13T17:50:53+00:00","dateModified":"2024-04-30T08:52:18+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528 Terraform\uff08v0.12.25\uff09\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u4ee5\u6784\u5efa GCP \u73af\u5883"}]},{"@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\/4ba4019495123db3038fd0809e6959c9","name":"\u65b0, \u97f5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","caption":"\u65b0, \u97f5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-terraform%ef%bc%88v0-12-25%ef%bc%89%e8%bf%9b%e8%a1%8c%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e4%bb%a5%e6%9e%84%e5%bb%ba-gcp-%e7%8e%af%e5%a2%83%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48806","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\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48806"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48806\/revisions"}],"predecessor-version":[{"id":93113,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48806\/revisions\/93113"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48806"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48806"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48806"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}