{"id":48307,"date":"2022-12-25T04:38:15","date_gmt":"2023-10-12T18:54:04","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/"},"modified":"2024-04-29T06:52:40","modified_gmt":"2024-04-28T22:52:40","slug":"%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/","title":{"rendered":"\u4ece\u96f6\u5f00\u59cb\u4f7f\u7528Terraform"},"content":{"rendered":"<h1>\u9996\u5148<\/h1>\n<p>\u672c\u6b21\u5c06\u4f1a\u5199\u4e00\u7bc7\u6587\u7ae0\uff0c\u8be6\u7ec6\u4ecb\u7ecd\u4e00\u4e2a\u4e4b\u524d\u6ca1\u6709\u63a5\u89e6\u8fc7Terraform\u7684\u5b66\u751f\u5982\u4f55\u9010\u6e10\u638c\u63e1\u5b83\u3002\u6211\u4eec\u4f1a\u4ee5\u7b80\u660e\u6613\u61c2\u7684\u89e3\u91ca\u65b9\u5f0f\u6765\u8fdb\u884c\uff0c\u6b22\u8fce\u5927\u5bb6\u4e00\u8d77\u6765\u9605\u8bfb\u3002<\/p>\n<h4>\u6295\u7a3f\u4e3b\u7684\u524d\u63d0\u6761\u4ef6<\/h4>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u5927\u5b66\u9662\u751f<\/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\">\u5fdc\u7528\u60c5\u5831\u6280\u8853\u8005\u53d6\u5f97<\/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\">\u30a2\u30eb\u30d0\u30a4\u30c8\u3067\u30b2\u30fc\u30e0\u4f1a\u793e\u306eweb\u30a2\u30d7\u30ea\u30a8\u30f3\u30b8\u30cb\u30a2\u3068\u3057\u3066\u52e4\u52d9(2~3\u5e74)<\/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\">aws\u7d4c\u9a13\u306f\u30dc\u30c1\u30dc\u30c1<\/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\">\u5727\u5012\u7684Mac\u6d3e<\/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\">\u66f8\u3051\u308b\u8a00\u8a9e<\/ul>\n<\/li>\n<\/ul>\n<p>Python<br \/>\nGo<br \/>\nJava<br \/>\nJavascript<br \/>\nVue.js<br \/>\nGoogle App Script<\/p>\n<h1>Terraform\u662f\u4ec0\u4e48\uff1f<\/h1>\n<p>Terraform\uff08\u30c6\u30e9\u30d5\u30a9\u30fc\u30e0\uff09\u662f\u7531HashiCorp\u516c\u53f8\u5f00\u53d1\u7684\u5f00\u6e90\u57fa\u7840\u8bbe\u65bd\u7f16\u7801\u5de5\u5177\u3002\u901a\u8fc7\u8fd9\u4e2a\u5de5\u5177\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee3\u7801\u7ba1\u7406\u548c\u6784\u5efa\u4e91\u8d44\u6e90\u548c\u6570\u636e\u4e2d\u5fc3\u8d44\u6e90\u3002<\/p>\n<h2>\u7279\u70b9<\/h2>\n<h3>\u4e0d\u4f9d\u8d56\u4e8e\u4e91\u670d\u52a1\u63d0\u4f9b\u5546<\/h3>\n<p>Terraform\u53ef\u4ee5\u4e0e\u4f17\u591a\u4e91\u670d\u52a1\u63d0\u4f9b\u5546\u5982AWS\u3001Azure\u3001Google Cloud Platform\u7b49\u8fdb\u884c\u96c6\u6210\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">provider<\/span> <span class=\"s2\">\"aws\"<\/span> <span class=\"p\">{<\/span>\r\n<span class=\"nx\">region<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"us-west-2\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>2. \u5ba3\u8a00\u6027\u7684\u4ee3\u7801 de<\/h3>\n<p>Terraform\u901a\u8fc7\u58f0\u660e\u6027\u7684\u4ee3\u7801\u6765\u5b9a\u4e49\u57fa\u7840\u67b6\u6784\u3002\u53ea\u9700\u5199\u4e0b\u60f3\u8981\u5b9e\u73b0\u7684\u5185\u5bb9\uff0c\u8d44\u6e90\u5c06\u6309\u7167\u6240\u5199\u7684\u65b9\u5f0f\u6784\u5efa\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">resource<\/span> <span class=\"s2\">\"aws_instance\"<\/span> <span class=\"s2\">\"example\"<\/span> <span class=\"p\">{<\/span>\r\n<span class=\"nx\">ami<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-123456\"<\/span>\r\n<span class=\"nx\">instance_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"t2.micro\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u6bb5\u4ee3\u7801\u662f\u4f7f\u7528Terraform\u6765\u5728AWS\u4e0a\u521b\u5efa\u865a\u62df\u673a\u7684\u58f0\u660e\u6027\u5b9a\u4e49\u3002<br \/>\n\u5177\u4f53\u800c\u8a00\uff0c\u5305\u62ec\u4ee5\u4e0b\u914d\u7f6e\u3002<\/p>\n<p>resource &#8220;aws_instance&#8221; &#8220;example&#8221;: AWS\u4e0a\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u4f5c\u6210\u3059\u308b\u30ea\u30bd\u30fc\u30b9\u306e\u5b9a\u7fa9\u3067\u3001\u3053\u306e\u30ea\u30bd\u30fc\u30b9\u306b\u306f\u540d\u524d\u3068\u3057\u3066&#8221;example&#8221;\u304c\u4ed8\u3051\u3089\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>ami = &#8220;ami-123456&#8221;: \u4f7f\u7528\u3059\u308bAmazon Machine Image\uff08AMI\uff09\u306eID\u3092\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u306eID\u306f\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u4f5c\u6210\u6642\u306b\u4f7f\u7528\u3059\u308bOS\u3084\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u304c\u30d7\u30ea\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u305f\u30a4\u30e1\u30fc\u30b8\u3092\u8868\u3057\u307e\u3059\u3002<\/p>\n<p>instance_type = &#8220;t2.micro&#8221;: \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u30b5\u30a4\u30ba\u3092\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u4f8b\u3067\u306f\u3001&#8221;t2.micro&#8221;\u30bf\u30a4\u30d7\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u4f5c\u6210\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>\u5f53\u5728Terraform\u4e2d\u6267\u884c\u8fd9\u6bb5\u4ee3\u7801\u65f6\uff0c\u5c06\u4f1a\u4f7f\u7528\u6307\u5b9a\u7684AMI\u548c\u5b9e\u4f8b\u7c7b\u578b\uff0c\u5728AWS\u4e0a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u865a\u62df\u673a\u3002<\/p>\n<p>\u8be6\u7ec6\u7684\u8bed\u6cd5\u5c06\u5728\u4e0b\u4e00\u7ae0\u4ecb\u7ecd\u3002<\/p>\n<h3>3. \u901a\u8fc7\u4ee3\u7801\u5b9e\u73b0\u7248\u672c\u63a7\u5236<\/h3>\n<p>\u901a\u8fc7\u5c06\u57fa\u7840\u8bbe\u65bd\u8fdb\u884c\u4ee3\u7801\u5316\uff0c\u53ef\u4ee5\u5b9e\u73b0\u7248\u672c\u7ba1\u7406\uff0c\u5e76\u8f7b\u677e\u8ffd\u8e2a\u53d8\u66f4\u8bb0\u5f55\u3002<\/p>\n<h2>\u57fa\u7840\u8bbe\u65bd\u7684\u751f\u547d\u5468\u671f<\/h2>\n<p>Terraform\u7684\u64cd\u4f5c\u4e3b\u8981\u7531\u4ee5\u4e0b\u51e0\u4e2a\u6b65\u9aa4\u7ec4\u6210\u3002<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u521d\u59cb\u5316\uff1aterraform init<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u521b\u5efa\u8ba1\u5212\uff1aterraform plan<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5e94\u7528\uff1aterraform apply<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\u9500\u6bc1\uff1aterraform destroy<\/ol>\n<h1>Terraform\u7684\u57fa\u672c\u8bed\u6cd5<\/h1>\n<h2>terraform\u4ee3\u7801\u5757<\/h2>\n<p>terraform\u5757\u7528\u4e8eTerraform\u914d\u7f6e\u3002\u5b83\u5305\u542b\u4e0eTerraform\u64cd\u4f5c\u76f8\u5173\u7684\u914d\u7f6e\uff0c\u5982\u540e\u7aef\u8bbe\u7f6e\u548c\u63d0\u4f9b\u8005\u7248\u672c\u7ea6\u675f\u3002<\/p>\n<h3>\u4f9b\u5e94\u5546\u7684\u7248\u672c\u9650\u5236<\/h3>\n<p>\u60a8\u53ef\u4ee5\u4f7f\u7528required_providers\u5757\u6765\u6307\u5b9a\u63d0\u4f9b\u8005\u7684\u7248\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"&gt;=1.3\"<\/span>\r\n  <span class=\"nx\">required_providers<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">aws<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">source<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"hashicorp\/aws\"<\/span>\r\n      <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"~&gt; 2.0\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u4e2a\u8bbe\u7f6e\u8981\u6c42\u4f7f\u7528AWS\u63d0\u4f9b\u7a0b\u5e8f\u7684\u7248\u672c2.0\u4ee5\u4e0a\uff0c\u4f46\u4e0d\u8d85\u8fc73.0\u3002<\/p>\n<h3>\u540e\u7aef\u8bbe\u7f6e<\/h3>\n<p>\u540e\u7aef\u5b9a\u4e49\u4e86\u4fdd\u5b58Terraform\u72b6\u6001\u7684\u4f4d\u7f6e\u3002\u4ee5\u4e0b\u662f\u4f7f\u7528S3\u5b58\u50a8\u6876\u4f5c\u4e3a\u540e\u7aef\u7684\u793a\u4f8b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">backend<\/span> <span class=\"s2\">\"s3\"<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">bucket<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"my-tf-state-bucket\"<\/span>\r\n    <span class=\"nx\">key<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform.tfstate\"<\/span>\r\n    <span class=\"nx\">region<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"us-west-2\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u53d8\u91cf<\/h2>\n<p>\u53d8\u91cf\u88ab\u7528\u4e8e\u96c6\u4e2d\u7ba1\u7406\u5728\u4ee3\u7801\u4e2d\u591a\u6b21\u4f7f\u7528\u7684\u503c\u3002\u901a\u8fc7\u4f7f\u7528\u53d8\u91cf\uff0c\u53ef\u4ee5\u63d0\u9ad8\u4ee3\u7801\u7684\u53ef\u91cd\u7528\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">variable<\/span> <span class=\"s2\">\"region\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\u306e\u30ea\u30fc\u30b8\u30e7\u30f3\"<\/span>\r\n  <span class=\"nx\">default<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"us-west-2\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u8d44\u6e90<\/h2>\n<p>\u8d44\u6e90\u5757\u7528\u4e8e\u5b9a\u4e49\u4e91\u57fa\u7840\u8bbe\u65bd\u4e2d\u7684\u7269\u7406\u7ec4\u4ef6\u3002\u4ee5\u4e0b\u662f\u521b\u5efaAWS\u7684S3\u5b58\u50a8\u6876\u7684\u793a\u4f8b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">resource<\/span> <span class=\"s2\">\"aws_s3_bucket\"<\/span> <span class=\"s2\">\"bucket\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">bucket<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"my-tf-test-bucket\"<\/span>\r\n  <span class=\"nx\">acl<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"private\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u6570\u636e\u6e90<\/h2>\n<p>\u6570\u636e\u6e90\u5757\u7528\u4e8e\u8bbf\u95ee\u73b0\u6709\u7684\u4e91\u57fa\u7840\u8bbe\u65bd\u7ec4\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">data<\/span> <span class=\"s2\">\"aws_ami\"<\/span> <span class=\"s2\">\"example\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">most_recent<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"nx\">owners<\/span>      <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"self\"<\/span><span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u65bd\u52a0\u529b\u91cf\u6216\u52aa\u529b<\/h2>\n<p>\u51fa\u529b\u6a21\u5757\u7528\u4e8e\u8f93\u51fa\u6709\u5173\u7531Terraform\u6784\u5efa\u6216\u66f4\u6539\u7684\u57fa\u7840\u8bbe\u65bd\u7684\u4fe1\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">output<\/span> <span class=\"s2\">\"bucket_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u6807\u51c6\u6a21\u5757\u7ed3\u6784<\/h2>\n<p>\u57fa\u672c\u4e0a\uff0c\u6309\u7167HashiCorp\u7684Terraform\u6807\u51c6\u6a21\u5757\u7684\u6587\u4ef6\u5939\u7ed3\u6784\u6765\u7ec4\u7ec7\u662f\u4e00\u4e2a\u4e0d\u9519\u7684\u9009\u62e9\u3002<br \/>\n\u53ef\u4ee5\u53c2\u8003\u4ee5\u4e0b\u5185\u5bb9\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u4ee5\u4e0b\u662f\u7531\u6700\u5c11\u7684\u6807\u51c6\u6a21\u5757\u7ec4\u6210\u7684\u3002<\/p>\n<pre class=\"post-pre\"><code>$ tree minimal-module\/\r\n.\r\n\u251c\u2500\u2500 README.md\r\n\u251c\u2500\u2500 main.tf\r\n\u251c\u2500\u2500 variables.tf\r\n\u251c\u2500\u2500 outputs.tf\r\n<\/code><\/pre>\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u5305\u542b\u6240\u6709\u9009\u9879\u5143\u7d20\u7684\u6a21\u5757\u914d\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code>$ tree complete-module\/\r\n.\r\n\u251c\u2500\u2500 README.md\r\n\u251c\u2500\u2500 main.tf\r\n\u251c\u2500\u2500 variables.tf\r\n\u251c\u2500\u2500 outputs.tf\r\n\u251c\u2500\u2500 ...\r\n\u251c\u2500\u2500 modules\/\r\n\u2502   \u251c\u2500\u2500 nestedA\/\r\n\u2502   \u2502   \u251c\u2500\u2500 README.md\r\n\u2502   \u2502   \u251c\u2500\u2500 variables.tf\r\n\u2502   \u2502   \u251c\u2500\u2500 main.tf\r\n\u2502   \u2502   \u251c\u2500\u2500 outputs.tf\r\n\u2502   \u251c\u2500\u2500 nestedB\/\r\n\u2502   \u251c\u2500\u2500 ...\/\r\n\u251c\u2500\u2500 examples\/\r\n\u2502   \u251c\u2500\u2500 exampleA\/\r\n\u2502   \u2502   \u251c\u2500\u2500 main.tf\r\n\u2502   \u251c\u2500\u2500 exampleB\/\r\n\u2502   \u251c\u2500\u2500 ...\/\r\n\r\n<\/code><\/pre>\n<h1>\u8bbe\u5b9a\u6559\u7a0b (Mac)<\/h1>\n<p>\u6211\u5c06\u5728\u4ee5\u4e0b\u8bf4\u660e\u5728Mac\u4e0a\u8bbe\u7f6eTerraform\u7684\u6b65\u9aa4\u3002<\/p>\n<h2>\u5b89\u88c5tfenv<\/h2>\n<p>tfenv\u662f\u4e00\u79cd\u7528\u4e8e\u7ba1\u7406Terraform\u7248\u672c\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u9488\u5bf9\u6bcf\u4e2a\u9879\u76ee\u4f7f\u7528\u4e0d\u540c\u7248\u672c\u7684Terraform\u3002\u4ee5\u4e0b\u662f\u5728Mac\u4e0a\u5b89\u88c5\u7684\u6b65\u9aa4\uff1a<\/p>\n<div>\u867d\u7136\u5e76\u975e\u5fc5\u987b\u4f7f\u7528tfenv\uff0c\u4f46\u4f7f\u7528\u5b83\u80fd\u66f4\u8f7b\u677e\u5730\u7ba1\u7406\u7248\u672c\u3002<\/div>\n<h3>\u4f7f\u7528Homebrew\u8fdb\u884c\u5b89\u88c5<\/h3>\n<p>\u4f7f\u7528Homebrew\u5b89\u88c5tfenv\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>brew <span class=\"nb\">install <\/span>tfenv\r\n<\/code><\/pre>\n<h3>\u786e\u8ba4\u5b89\u88c5<\/h3>\n<p>\u8bf7\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u4ee5\u786e\u4fddtfenv\u5df2\u6b63\u786e\u5b89\u88c5\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>tfenv <span class=\"nt\">--version<\/span>\r\n<\/code><\/pre>\n<h3>\u5b89\u88c5\u548c\u9009\u62e9Terraform\u7684\u7248\u672c\u3002<\/h3>\n<p>\u4f60\u53ef\u4ee5\u4f7f\u7528tfenv\u6765\u5b89\u88c5\u7279\u5b9a\u7248\u672c\u7684Terraform\uff0c\u5e76\u9009\u62e9\u8981\u4f7f\u7528\u7684\u7248\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>tfenv <span class=\"nb\">install <\/span>1.3.9\r\n<span class=\"nv\">$ <\/span>tfenv use 1.3.9\r\n<\/code><\/pre>\n<p>\u6211\u5df2\u7ecf\u5c06\u9879\u76ee\u4e2d\u4f7f\u7528\u7684Terraform\u7248\u672c\u8bbe\u7f6e\u4e3a0.12.0\u3002<\/p>\n<h3>\u786e\u8ba4\u53ef\u4f7f\u7528\u7684\u7248\u672c<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>tfenv list\r\n<span class=\"k\">*<\/span> 1.3.9 <span class=\"o\">(<\/span><span class=\"nb\">set <\/span>by \/Users\/local\/.tfenv\/version<span class=\"o\">)<\/span>\r\n  1.3.8\r\n<\/code><\/pre>\n<p>\u60a8\u53ef\u4ee5\u4f7f\u7528 `tfenv list-remote` \u547d\u4ee4\u67e5\u770b\u53ef\u5b89\u88c5\u7684\u7248\u672c\u5217\u8868\u3002<\/p>\n<h2>\u5b89\u88c5Terraform<\/h2>\n<p>\u4f7f\u7528Homebrew\u5b89\u88c5Terraform\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>brew tap hashicorp\/tap\r\n<span class=\"nv\">$ <\/span>brew <span class=\"nb\">install <\/span>hashicorp\/tap\/terraform\r\n<\/code><\/pre>\n<h2>\u786e\u8ba4\u5b89\u88c5\u60c5\u51b5<\/h2>\n<p>\u8bf7\u8fd0\u884c\u4e0b\u9762\u7684\u547d\u4ee4\uff0c\u4ee5\u786e\u8ba4Terraform\u5df2\u6b63\u786e\u5b89\u88c5\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform <span class=\"nt\">-version<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u4e2a\u547d\u4ee4\u4f1a\u663e\u793a\u5df2\u5b89\u88c5\u7684Terraform\u7248\u672c\u3002<\/p>\n<h2>\u521d\u59cb\u5316 (Ch\u016b Q\u012b Hu\u00e0)<\/h2>\n<p>\u6211\u4eec\u5148\u8fdb\u5165\u9879\u76ee\u76ee\u5f55\uff0c\u7136\u540e\u8fdb\u884cTerraform\u7684\u521d\u59cb\u5316\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>your_project_directory\r\n<span class=\"nv\">$ <\/span>terraform init\r\n<\/code><\/pre>\n<p>\u8fd9\u4e2a\u547d\u4ee4\u4f1a\u4e0b\u8f7d\u9879\u76ee\u6240\u9700\u7684\u63d0\u4f9b\u5546\u5e76\u521d\u59cb\u5316Terraform\u3002<\/p>\n<h1>\u5c1d\u8bd5\u4f7f\u7528-\u57fa\u7840\u7bc7<\/h1>\n<h2>\u8fdb\u884c\u521d\u59cb\u5316<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">mkdir <\/span>terraform_test\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>terraform_test\r\n<\/code><\/pre>\n<p>\u5728\u6267\u884cterraform init\u4e4b\u524d\uff0c\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u7528\u4e8e\u4fdd\u5b58tfstate\u7684S3\u5b58\u50a8\u6876\u624d\u884c\u3002<\/p>\n<p>\u6211\u4eec\u5c06\u5c1d\u8bd5\u521b\u5efa\u4e00\u4e2a\u540d\u4e3aterraform-paupau-tfstate\u7684\u5b58\u50a8\u6876\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8491913a08637a6b693d\/85-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-08-14 17.05.06.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8491913a08637a6b693d\/86-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-08-14 2.03.06.png\" \/><\/div>\n<p>\u4e0b\u4e00\u6b65\uff0c\u6211\u4eec\u5c06\u628aS3\u7684\u4fe1\u606f\u6dfb\u52a0\u5230backend.tf\u6587\u4ef6\u4e2d\u3002<br \/>\n\u7531\u4e8eterraform\u7684\u5b98\u65b9\u6587\u6863\u975e\u5e38\u4e30\u5bcc\uff0c\u6211\u4eec\u53ef\u4ee5\u63d0\u53d6\u6a21\u677f\u4f7f\u7528\u3002<\/p>\n<p>\u7531\u4e8e\u6587\u6863\u5341\u5206\u8be6\u5c3d\uff0c\u5bf9\u4e8e\u521d\u5b66\u8005\u6765\u8bf4\u771f\u662f\u592a\u597d\u4e86\uff01<\/p>\n<p>&nbsp;<\/p>\n<p>\u6211\u5c06\u6a21\u677f\u66ff\u6362\u4e3a\u9002\u5e94\u6211\u7684\u73af\u5883\uff0c\u5e76\u521b\u5efa\u4e86\u4ee5\u4e0b\u7c7b\u4f3c\u7684\u4e1c\u897f\u3002<\/p>\n<pre class=\"post-pre\"><code>  <span class=\"k\">provider<\/span> <span class=\"s2\">\"aws\"<\/span><span class=\"p\">{<\/span>\r\n    <span class=\"nx\">region<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"1.5.5\"<\/span>\r\n  <span class=\"nx\">backend<\/span> <span class=\"s2\">\"s3\"<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">bucket<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-paupau-tfstate\"<\/span>\r\n    <span class=\"nx\">key<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform.tfstate\"<\/span>\r\n    <span class=\"nx\">region<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<div>\u5728VScode\u7684\u6269\u5c55\u529f\u80fd\u4e2d\uff0c\u6709terraform\u7684\u529f\u80fd\uff0c\u5b83\u5177\u6709\u81ea\u52a8\u8865\u5168\u7684\u529f\u80fd\uff0c\u975e\u5e38\u65b9\u4fbf\uff0c\u6211\u4eec\u5e94\u79ef\u6781\u4f7f\u7528\uff01<\/div>\n<p>\u968f\u540e\u5c1d\u8bd5\u4f7f\u7528terraform init\u8fdb\u884c\u521d\u59cb\u5316&#8230;<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"nv\">$ <\/span>terraform init\r\n\r\nInitializing the backend...\r\nTerraform encountered problems during initialisation, including problems\r\nwith the configuration, described below.\r\n\r\nThe Terraform configuration must be valid before initialization so that\r\nTerraform can determine which modules and providers need to be installed.\r\n\u2577\r\n\u2502 Error: error configuring S3 Backend: error validating provider credentials: error calling sts:GetCallerIdentity: InvalidClientTokenId: The security token included <span class=\"k\">in <\/span>the request is invalid.\r\n\u2502       status code: 403, request <span class=\"nb\">id<\/span>: xxxxxx\r\n\r\n<\/code><\/pre>\n<p>\u55ef\uff0c\u65e0\u6cd5\u8fdb\u884c\u8ba4\u8bc1\u5417&#8230;?<\/p>\n<p>\u662f\u7684\uff0cAWS CLI\u7684\u8bbe\u7f6e\u8fd8\u6ca1\u6709\u5b8c\u6210\u3002<br \/>\n\u6211\u4eec\u5c06\u8fdb\u884cconfig\u548ccredentials\u7684\u8bbe\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">cat<\/span> ~\/.aws\/credentials                                      \r\n<span class=\"o\">[<\/span>default]\r\naws_access_key_id <span class=\"o\">=<\/span> hogehoge\r\naws_secret_access_key <span class=\"o\">=<\/span> hogehoge\r\n\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">cat<\/span> ~\/.aws\/config                      \r\n<span class=\"o\">[<\/span>default]\r\nregion <span class=\"o\">=<\/span> ap-northeast-1\r\noutput <span class=\"o\">=<\/span> json\r\n\r\n<\/code><\/pre>\n<p>\u8fd9\u6837\u5b8c\u7f8e\u4e86\uff01<\/p>\n<pre class=\"post-pre\"><code>.terraform % terraform init <span class=\"nt\">-reconfigure<\/span>\r\n\r\nInitializing the backend...\r\n\r\nSuccessfully configured the backend <span class=\"s2\">\"s3\"<\/span><span class=\"o\">!<\/span> Terraform will automatically\r\nuse this backend unless the backend configuration changes.\r\n\r\nInitializing provider plugins...\r\n- Finding latest version of hashicorp\/aws...\r\n- Installing hashicorp\/aws v5.12.0...\r\n- Installed hashicorp\/aws v5.12.0 <span class=\"o\">(<\/span>signed by HashiCorp<span class=\"o\">)<\/span>\r\n\r\nTerraform has created a lock file .terraform.lock.hcl to record the provider\r\nselections it made above. Include this file <span class=\"k\">in <\/span>your version control repository\r\nso that Terraform can guarantee to make the same selections by default when\r\nyou run <span class=\"s2\">\"terraform init\"<\/span> <span class=\"k\">in <\/span>the future.\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>\u521d\u59cb\u5316\u6210\u529f\uff01<\/p>\n<h2>\u521b\u5efaVPC\u548c\u5b50\u7f51<\/h2>\n<p>\u8fd9\u4e5f\u662f\u4ece Terraform \u7684\u6587\u6863\u4e2d\u5f15\u7528\u7684\u3002<br \/>\nVPC \u7684\u6587\u6863\u5728\u8fd9\u91cc\u3002<br \/>\n\u5b50\u7f51\u7684\u6587\u6863\u5728\u8fd9\u91cc\u3002<\/p>\n<p>\u6211\u5c06\u5c1d\u8bd5\u521b\u5efavpc.tf\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_vpc\"<\/span> <span class=\"s2\">\"main\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"192.168.1.0\/24\"<\/span>\r\n\r\n    <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Main-vpc\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_subnet\"<\/span> <span class=\"s2\">\"main_1a\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>     <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"192.168.1.0\/25\"<\/span>\r\n  <span class=\"nx\">availability_zone<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1a\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u4f7f\u7528terraform validate\u6765\u68c0\u67e5\u8bed\u6cd5\u662f\u5426\u6b63\u786e\u3002<br \/>\n\u8fd9\u5c06\u7528\u4e8e\u68c0\u67e5Terraform\u914d\u7f6e\u6587\u4ef6\u662f\u5426\u5177\u6709\u6b63\u786e\u7684\u8bed\u6cd5\u548c\u7ed3\u6784\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform validate\r\nSuccess! The configuration is valid.\r\n<\/code><\/pre>\n<p>\u4e00\u5207\u987a\u5229\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u5c06\u4f7f\u7528terraform plan\u8fdb\u884c\u786e\u8ba4\u3002<br \/>\n\u5b83\u4f1a\u67e5\u770btfstate\u548c\u5f53\u524d\u4ee3\u7801\u4e4b\u95f4\u7684\u5dee\u5f02\uff0c\u5e76\u544a\u8bc9\u6211\u4eec\u72b6\u6001\u3002<br \/>\n(\u7701\u7565\u90e8\u5206\u5185\u5bb9)<\/p>\n<pre class=\"post-pre\"><code>% terraform plan\r\n\r\n\u30fb\r\n\u30fb\r\n\u30fb\r\nPlan: 2 to add, 0 to change, 0 to destroy.\r\n<\/code><\/pre>\n<p>\u6211\u5df2\u786e\u8ba4\u6709\u4e24\u4e2a\u8ba1\u5212\u6b63\u5728\u5236\u5b9a\u4e2d\u3002<\/p>\n<p>\u987a\u4fbf\u63d0\u4e00\u4e0b\uff0c\u4f7f\u7528terraform fmt\u80fd\u591f\u8ba9\u4ee3\u7801\u683c\u5f0f\u66f4\u52a0\u6574\u9f50\u3002<\/p>\n<p>\u7ec8\u4e8e\uff0c\u6211\u5c06\u5c1d\u8bd5\u6267\u884cterraform apply\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform apply\r\n\r\nTerraform used the selected providers to generate the following execution plan. Resource 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\"># aws_subnet.main_1a will be created<\/span>\r\n  + resource <span class=\"s2\">\"aws_subnet\"<\/span> <span class=\"s2\">\"main_1a\"<\/span> <span class=\"o\">{<\/span>\r\n      + arn                                            <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + assign_ipv6_address_on_creation                <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + availability_zone                              <span class=\"o\">=<\/span> <span class=\"s2\">\"ap-northeast-1a\"<\/span>\r\n      + availability_zone_id                           <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + cidr_block                                     <span class=\"o\">=<\/span> <span class=\"s2\">\"192.168.1.0\/25\"<\/span>\r\n      + enable_dns64                                   <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + enable_resource_name_dns_a_record_on_launch    <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + enable_resource_name_dns_aaaa_record_on_launch <span class=\"o\">=<\/span> <span class=\"nb\">false<\/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      + ipv6_cidr_block_association_id                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + ipv6_native                                    <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + map_public_ip_on_launch                        <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span>\r\n      + owner_id                                       <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + private_dns_hostname_type_on_launch            <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + tags_all                                       <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + vpc_id                                         <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\"># aws_vpc.main will be created<\/span>\r\n  + resource <span class=\"s2\">\"aws_vpc\"<\/span> <span class=\"s2\">\"main\"<\/span> <span class=\"o\">{<\/span>\r\n      + arn                                  <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + cidr_block                           <span class=\"o\">=<\/span> <span class=\"s2\">\"192.168.1.0\/24\"<\/span>\r\n      + default_network_acl_id               <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + default_route_table_id               <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + default_security_group_id            <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + dhcp_options_id                      <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + enable_dns_hostnames                 <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + enable_dns_support                   <span class=\"o\">=<\/span> <span class=\"nb\">true<\/span>\r\n      + enable_network_address_usage_metrics <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      + instance_tenancy                     <span class=\"o\">=<\/span> <span class=\"s2\">\"default\"<\/span>\r\n      + ipv6_association_id                  <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + ipv6_cidr_block                      <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + ipv6_cidr_block_network_border_group <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + main_route_table_id                  <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + owner_id                             <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + tags                                 <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\r\n          + <span class=\"s2\">\"Name\"<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"Main-vpc\"<\/span>\r\n        <span class=\"o\">}<\/span>\r\n      + tags_all                             <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\r\n          + <span class=\"s2\">\"Name\"<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"Main-vpc\"<\/span>\r\n        <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>aws_vpc.main: Creating...\r\n\u2577\r\n\u2502 Error: creating EC2 VPC: operation error EC2: CreateVpc, https response error StatusCode: 403, RequestID: 71b56b4f-b2c5-4b51-9138-a859a5707eb3, api error UnauthorizedOperation: You are not authorized to perform this operation. Encoded authorization failure message: HFvjs_g1WA1DvLX7IkOqRVkEP6BRUVXdIgl2l2Z6TBm69UahT9QAnCvHbZSDVviMDyucCaXAsOpuz2vls0JTMEiuLMM6CGhluUggZp8VdlaMmmHfDfH\r\n<\/code><\/pre>\n<p>\u55ef\uff0c\u770b\u8d77\u6765\u4e0d\u592a\u987a\u5229\u3002\u8be6\u7ec6\u5185\u5bb9\u5df2\u7ecf\u88ab\u7f16\u7801\u4e86\u5462&#8230;<\/p>\n<p>\u8ba9\u6211\u4eec\u4f7f\u7528aws sts decode-authorization-message \u2014encoded-message &#8220;encode_message&#8221;\u6765\u8fdb\u884c\u89e3\u7801\u8bd5\u8bd5\u770b\u3002<\/p>\n<p>\u4e3a\u4e86\u89e3\u7801\uff0c\u9700\u8981\u5c06DecodeAuthorizationMessage\u6dfb\u52a0\u5230IAM\u7b56\u7565\u4e2d\u3002<br \/>\n\u524d\u5f80IAM &gt; \u7b56\u7565 &gt; \u65b0\u5efa\u7b56\u7565 &gt; \u8fdb\u5165JSON\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n    <span class=\"nl\">\"Version\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"2012-10-17\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"Statement\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n        <span class=\"p\">{<\/span>\r\n            <span class=\"nl\">\"Effect\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"Allow\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"nl\">\"Action\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"sts:DecodeAuthorizationMessage\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"nl\">\"Resource\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"*\"<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8491913a08637a6b693d\/119-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-08-15 3.16.59.png\" \/><\/div>\n<p>\u7136\u540e\u5c06\u6211\u521a\u5236\u5b9a\u7684\u653f\u7b56\u9644\u52a0\u4e0a\u53bb\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8491913a08637a6b693d\/121-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-08-15 3.17.52.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8491913a08637a6b693d\/122-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-08-15 3.18.18.png\" \/><\/div>\n<p>\u770b\u8d77\u6765\u4e00\u5207\u90fd\u6ca1\u95ee\u9898\uff0c\u6210\u529f\u9644\u52a0\u4e86\u3002<\/p>\n<p>\u521a\u521a\u5bf9\u5176\u8fdb\u884c\u89e3\u7801\u5e76\u5206\u6790\u9519\u8bef\u540e\uff0c\u4f3c\u4e4e\u9700\u8981\u4e0eVPC\u548c\u5b50\u7f51\u76f8\u5173\u7684\u7b56\u7565\u3002<br \/>\n\u4ee5\u4e0b\u662f\u7b56\u7565\u7684JSON\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n    <span class=\"nl\">\"Version\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"2012-10-17\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"Statement\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n        <span class=\"p\">{<\/span>\r\n            <span class=\"nl\">\"Effect\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"Allow\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"nl\">\"Action\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n                <span class=\"s2\">\"ec2:CreateVpc\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s2\">\"ec2:DescribeVpcs\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s2\">\"ec2:DeleteVpc\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s2\">\"ec2:ModifyVpcAttribute\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s2\">\"ec2:CreateTags\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s2\">\"ec2:DeleteTags\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s2\">\"ec2:DescribeTags\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s2\">\"ec2:CreateSubnet\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s2\">\"ec2:DescribeSubnets\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s2\">\"ec2:DeleteSubnet\"<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s2\">\"ec2:DescribeVpcAttribute\"<\/span>\r\n            <span class=\"p\">],<\/span>\r\n            <span class=\"nl\">\"Resource\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"*\"<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u6211\u5df2\u7ecf\u521b\u5efa\u5e76\u9644\u52a0\u4e86\u653f\u7b56\u3002<\/p>\n<p>\u6211\u5c06\u518d\u6b21\u5c1d\u8bd5\u8fdb\u884cterraform apply\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"nv\">$ <\/span>terraform apply\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>aws_vpc.main: Destroying... <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>vpc-06e030806]\r\naws_vpc.main: Destruction <span class=\"nb\">complete <\/span>after 0s\r\naws_vpc.main: Creating...\r\naws_vpc.main: Creation <span class=\"nb\">complete <\/span>after 1s <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>vpc-0e77b6339378]\r\naws_subnet.main_1a: Creating...\r\naws_subnet.main_1a: Creation <span class=\"nb\">complete <\/span>after 1s <span class=\"o\">[<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span>subnet-000f00088170b]\r\n\r\nApply <span class=\"nb\">complete<\/span><span class=\"o\">!<\/span> Resources: 2 added, 0 changed, 1 destroyed.\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8491913a08637a6b693d\/129-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-08-15 3.38.49.png\" \/><\/div>\n<p>\u770b\u8d77\u6765VPC\u548c\u5b50\u7f51\u8bbe\u7f6e\u5f97\u5f88\u597d\uff01<\/p>\n<p>S3\u4e2d\u7684tfstate\u4e5f\u5df2\u7ecf\u66f4\u65b0\u4e86\u5462^^ (S3 de tfstate y\u011b le ne)<\/p>\n<h1>\u8bd5\u7740\u4f7f\u7528\u4e00\u4e0b~\u5e94\u7528\u7bc7~<\/h1>\n<h2>\u5c1d\u8bd5\u8fdb\u884c\u6a21\u5757\u5316\u548c\u53d8\u91cf\u5316<\/h2>\n<p>\u6211\u5728\u4ee5\u4e0b\u7c7b\u4f3c\u7684\u6811\u72b6\u7ed3\u6784\u4e2d\u5c1d\u8bd5\u5b9e\u73b0\u4e86\u6a21\u5757\u5316\u548c\u53d8\u91cf\u5316\u3002<\/p>\n<pre class=\"post-pre\"><code>$ tree\r\n.\r\n\u251c\u2500\u2500 backend.tf\r\n\u251c\u2500\u2500 modules\r\n\u2502   \u2514\u2500\u2500 vpc_subnet\r\n\u2502       \u251c\u2500\u2500 main.tf\r\n\u2502       \u2514\u2500\u2500 variables.tf\r\n\u2514\u2500\u2500 use_module.tf\r\n<\/code><\/pre>\n<p>backend.tf\u6587\u4ef6\u7684\u6e90\u4ee3\u7801\u4fdd\u6301\u4e0d\u53d8\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_vpc\"<\/span> <span class=\"s2\">\"main\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_cidr_block<\/span>\r\n\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Main-vpc\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_subnet\"<\/span> <span class=\"s2\">\"main_1a\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>            <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">cidr_block<\/span>        <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet_1a_cidr_block<\/span>\r\n  <span class=\"nx\">availability_zone<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1a\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"vpc_cidr_block\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"subnet_1a_cidr_block\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/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\">\"vpc_subnet1\"<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">source<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\".\/modules\/vpc_subnet\/\"<\/span>\r\n\r\n    <span class=\"nx\">vpc_cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"192.168.1.0\/24\"<\/span>\r\n    <span class=\"nx\">subnet_1a_cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"192.168.1.0\/25\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">module<\/span> <span class=\"s2\">\"vpc_subnet2\"<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">source<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\".\/modules\/vpc_subnet\/\"<\/span>\r\n    \r\n    <span class=\"nx\">vpc_cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"192.168.12.0\/24\"<\/span>\r\n    <span class=\"nx\">subnet_1a_cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"192.168.2.0\/25\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<h2>\u5de5\u4f5c\u7a7a\u95f4\u7684\u4f7f\u7528<\/h2>\n<p>\u6211\u60f3\u8981\u5728\u5de5\u4f5c\u7a7a\u9593\u4e2d\u5206\u522b\u521b\u5efa\u4e24\u4e2a\u73af\u5883\uff0c\u4e00\u4e2a\u662fstage\uff0c\u53e6\u4e00\u4e2a\u662fmaster\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform workspace list\r\n* default\r\n\r\n$ terraform workspace new \"stage\"\r\nCreated and switched to workspace \"stage\"!\r\n\r\nYou're now on a new, empty workspace. Workspaces isolate their state,\r\nso if you run \"terraform plan\" Terraform will not see any existing state\r\nfor this configuration.\r\n\r\n\r\n$ terraform workspace new \"master\"\r\nCreated and switched to workspace \"master\"!\r\n\r\nYou're now on a new, empty workspace. Workspaces isolate their state,\r\nso if you run \"terraform plan\" Terraform will not see any existing state\r\nfor this configuration.\r\n\r\n<\/code><\/pre>\n<p>\u7136\u540e\uff0c\u6211\u4f1a\u8bd5\u7740\u5236\u4f5c\u5230\u53ef\u4ee5\u4f7f\u7528\u7684\u9636\u6bb5\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_vpc\"<\/span> <span class=\"s2\">\"main\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_cidr_block<\/span>\r\n\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-test-vpc\"<\/span> <span class=\"c1\">\/\/\u73fe\u5728\u9078\u3070\u308c\u3066\u3044\u308bworkspace\u304c\u5165\u308b<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<h1>\u603b\u7ed3<\/h1>\n<p>\u8fd9\u6b21\uff0c\u4e00\u4e2a\u6ca1\u6709\u7ecf\u9a8c\u7684\u5b66\u751f\u5c1d\u8bd5\u6311\u6218\u57fa\u7840\u5185\u5bb9\u3002\u5e0c\u671b\u80fd\u5bf9\u67d0\u4eba\u6709\u6240\u53c2\u8003\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u672c\u6b21\u5c06\u4f1a\u5199\u4e00\u7bc7\u6587\u7ae0\uff0c\u8be6\u7ec6\u4ecb\u7ecd\u4e00\u4e2a\u4e4b\u524d\u6ca1\u6709\u63a5\u89e6\u8fc7Terraform\u7684\u5b66\u751f\u5982\u4f55\u9010\u6e10\u638c\u63e1\u5b83\u3002\u6211\u4eec\u4f1a\u4ee5\u7b80\u660e\u6613\u61c2\u7684 [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48307","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>\u4ece\u96f6\u5f00\u59cb\u4f7f\u7528Terraform - 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\/\u4ece\u96f6\u5f00\u59cb\u4f7f\u7528terraform\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4ece\u96f6\u5f00\u59cb\u4f7f\u7528Terraform\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148 \u672c\u6b21\u5c06\u4f1a\u5199\u4e00\u7bc7\u6587\u7ae0\uff0c\u8be6\u7ec6\u4ecb\u7ecd\u4e00\u4e2a\u4e4b\u524d\u6ca1\u6709\u63a5\u89e6\u8fc7Terraform\u7684\u5b66\u751f\u5982\u4f55\u9010\u6e10\u638c\u63e1\u5b83\u3002\u6211\u4eec\u4f1a\u4ee5\u7b80\u660e\u6613\u61c2\u7684 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4ece\u96f6\u5f00\u59cb\u4f7f\u7528terraform\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-12T18:54:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-28T22:52:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8491913a08637a6b693d\/85-0.png\" \/>\n<meta name=\"author\" content=\"\u6e05, \u626c\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6e05, \u626c\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 \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%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/\",\"name\":\"\u4ece\u96f6\u5f00\u59cb\u4f7f\u7528Terraform - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-10-12T18:54:04+00:00\",\"dateModified\":\"2024-04-28T22:52:40+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4ece\u96f6\u5f00\u59cb\u4f7f\u7528Terraform\"}]},{\"@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\/cb5556d2501da73d864cac945e8d9461\",\"name\":\"\u6e05, \u626c\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"caption\":\"\u6e05, \u626c\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4ece\u96f6\u5f00\u59cb\u4f7f\u7528Terraform - 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\/\u4ece\u96f6\u5f00\u59cb\u4f7f\u7528terraform\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4ece\u96f6\u5f00\u59cb\u4f7f\u7528Terraform","og_description":"\u9996\u5148 \u672c\u6b21\u5c06\u4f1a\u5199\u4e00\u7bc7\u6587\u7ae0\uff0c\u8be6\u7ec6\u4ecb\u7ecd\u4e00\u4e2a\u4e4b\u524d\u6ca1\u6709\u63a5\u89e6\u8fc7Terraform\u7684\u5b66\u751f\u5982\u4f55\u9010\u6e10\u638c\u63e1\u5b83\u3002\u6211\u4eec\u4f1a\u4ee5\u7b80\u660e\u6613\u61c2\u7684 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4ece\u96f6\u5f00\u59cb\u4f7f\u7528terraform\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-10-12T18:54:04+00:00","article_modified_time":"2024-04-28T22:52:40+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8491913a08637a6b693d\/85-0.png"}],"author":"\u6e05, \u626c","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6e05, \u626c","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/","name":"\u4ece\u96f6\u5f00\u59cb\u4f7f\u7528Terraform - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-10-12T18:54:04+00:00","dateModified":"2024-04-28T22:52:40+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4ece\u96f6\u5f00\u59cb\u4f7f\u7528Terraform"}]},{"@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\/cb5556d2501da73d864cac945e8d9461","name":"\u6e05, \u626c","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","caption":"\u6e05, \u626c"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8terraform\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48307","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\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48307"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48307\/revisions"}],"predecessor-version":[{"id":83714,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48307\/revisions\/83714"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}