{"id":48404,"date":"2022-11-23T00:51:50","date_gmt":"2024-02-02T06:22:27","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/"},"modified":"2024-04-29T02:01:06","modified_gmt":"2024-04-28T18:01:06","slug":"%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/","title":{"rendered":"\u3010AWS\u7f16\u3011Terraform\u5b98\u65b9\u6559\u7a0b\u3010\u4e2d\u6587\u7ffb\u8bd1\u3011"},"content":{"rendered":"<p>\u8fd9\u662fTerraform\u516c\u5f0f\u6559\u7a0b\u7684\u65e5\u6587\u7ffb\u8bd1\u3002<br \/>\n\u8fd9\u662f\u4e00\u4e2a\u53ef\u4ee5\u901a\u8fc7\u5b9e\u9645\u64cd\u4f5c\u8fdb\u884c\u5b66\u4e60\u7684\u6559\u7a0b\u3002<br \/>\n\u5728\u3010AWS\u7bc7\u3011\u4e2d\uff0c\u6211\u4eec\u5c06\u5728\u5b9e\u9645\u7684AWS\u73af\u5883\u4e2d\u8fdb\u884c\u57fa\u7840\u8bbe\u65bd\u7684\u6784\u5efa\u3001\u4fee\u6539\u548c\u5220\u9664\u3002<\/p>\n<p>\u611f\u8c22HashiCorp\u7684\u6559\u80b2\u56e2\u961f\u540c\u610f\u53d1\u5e03\u6b64\u7ffb\u8bd1\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Infrastructure | Terraform | HashiCorp Developerl<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Change Infrastructure | Terraform | HashiCorp Developer<\/ul>\n<p>\u53e6\u5916\uff0c\u5f53\u60a8\u6ce8\u518cHashiCorp Learn\u540e\uff0c\u60a8\u5c06\u53ef\u4ee5\u5728\u4eea\u8868\u677f\u4e0a\u67e5\u770b\u6559\u7a0b\u7684\u8fdb\u5ea6\u7b49\u4fe1\u606f\u3002<br \/>\n\u8bf7\u5728\u6b64\u5904\u6ce8\u518c\u3002\u767b\u5f55 &#8211; HashiCorp Learn<br \/>\n\u203b\u53e6\u5916\uff0cHashiCorp \u76ee\u524d\u6ca1\u6709\u8ba1\u5212\u5bf9\u6587\u6863\u8fdb\u884c\u672c\u5730\u5316\u3002<\/p>\n<p>\u4e0a\u4e00\u6b21\u7684\u6559\u7a0b&#8221;\u51c6\u5907\u548c\u5bfc\u5165\u7bc7&#8221;\u5728\u8fd9\u91cc\u3002<\/p>\n<p>&nbsp;<\/p>\n<h1>\u57fa\u5efa\u7684\u5efa\u8bbe<\/h1>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d84d5913a08637a6b74d5\/7-0.png\" alt=\"Terraform Video\" \/><\/div>\n<p>\u5b89\u88c5\u4e86Terraform\uff0c\u73b0\u5728\u5df2\u7ecf\u51c6\u5907\u597d\u521b\u5efa\u57fa\u7840\u67b6\u67842\u4e86\u3002<\/p>\n<p>\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u6211\u4eec\u5c06\u5728\u4e9a\u9a6c\u900a\u7f51\u7edc\u670d\u52a1(AWS)\u4e0a\u8bbe\u7f6eEC2\u5b9e\u4f8b\u3002EC2\u662f\u5728AWS\u4e0a\u542f\u52a8\u7684\u865a\u62df\u673a\uff0c\u5e38\u7528\u4e8e\u57fa\u7840\u67b6\u6784\u9879\u76ee\u4e2d\u7684\u7ec4\u4ef6\u3002<\/p>\n<h2>\u524d\u63d0\u6761\u4ef6 t\u00ed<\/h2>\n<p>\u4e3a\u4e86\u5b8c\u6210\u8fd9\u4e2a\u6559\u7a0b\uff0c\u60a8\u9700\u8981\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6\u3002<\/p>\n<p>Terraform CLI(1.2.0+)\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u3044\u308b\u3053\u3068<\/p>\n<p>AWS CLI\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u3044\u308b\u3053\u3068<\/p>\n<p>AWS account\u3068\u95a2\u9023\u3059\u308b\u8a8d\u8a3c\u60c5\u5831\u3067\u30ea\u30bd\u30fc\u30b9\u304c\u4f5c\u6210\u3067\u304d\u308b\u72b6\u614b\u306b\u3042\u308b\u3053\u3068<\/p>\n<p>\u8981\u4f7f\u7528IAM\u8ba4\u8bc1\u4fe1\u606f\u6765\u5bf9Terraform\u7684AWS\u63d0\u4f9b\u7a0b\u5e8f\u8fdb\u884c\u8ba4\u8bc1\uff0c\u9700\u8981\u8bbe\u7f6e\u73af\u5883\u53d8\u91cfAWS_ACCESS_KEY_ID\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">export <\/span><span class=\"nv\">AWS_ACCESS_KEY_ID<\/span><span class=\"o\">=<\/span>\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u8bbe\u7f6e\u79d8\u94a5\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">export <\/span><span class=\"nv\">AWS_SECRET_ACCESS_KEY<\/span><span class=\"o\">=<\/span>\r\n<\/code><\/pre>\n<div>\u5982\u679c\u65e0\u6cd5\u8bbf\u95eeIAM\u7684\u8ba4\u8bc1\u4fe1\u606f\uff0c\u8bf7\u5c1d\u8bd5\u5176\u4ed6\u7684\u8ba4\u8bc1\u65b9\u6cd5\u3002\u8bf7\u53c2\u8003AWS\u63d0\u4f9b\u5546\u6587\u6863\u83b7\u53d6\u66f4\u8be6\u7ec6\u7684\u4fe1\u606f\u3002<\/div>\n<p>\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u6211\u4eec\u5c06\u8bbe\u7f6e\u53ef\u4ee5\u5728AWS\u514d\u8d39\u4f7f\u7528\u914d\u989d\u4e2d\u4f7f\u7528\u7684\u8d44\u6e90\u3002\u5bf9\u4e8e\u65e0\u6cd5\u4f7f\u7528\u514d\u8d39\u4f7f\u7528\u914d\u989d\u800c\u4ea7\u751f\u7684\u4efb\u4f55\u8d39\u7528\uff0c\u6211\u4eec\u6982\u4e0d\u8d1f\u8d23\u3002<\/p>\n<h2>\u521b\u5efa\u8bbe\u5b9a<\/h2>\n<p>\u6211\u4eec\u79f0\u4e4b\u4e3aTerraform\u914d\u7f6e\u6587\u4ef6\uff0c\u7528\u4e8e\u63cf\u8ff0\u57fa\u7840\u67b6\u6784\u7684\u5185\u5bb9\u3002\u9996\u5148\uff0c\u6211\u4eec\u521b\u5efa\u914d\u7f6e\u6587\u4ef6\u5e76\u5b9a\u4e49\u4e00\u4e2aAWS EC2\u5b9e\u4f8b\u3002<\/p>\n<p>\u5728Terraform\u4e2d\uff0c\u914d\u7f6e\u5fc5\u987b\u5728\u5de5\u4f5c\u76ee\u5f55\u4e2d\u521b\u5efa\u3002\u521b\u5efa\u4e00\u4e2a\u76ee\u5f55\u7528\u4e8e\u914d\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">mkdir <\/span>learn-terraform-aws-instance\r\n<\/code><\/pre>\n<p>\u8fdb\u5165\u5df2\u521b\u5efa\u7684\u76ee\u5f55\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>learn-terraform-aws-instance\r\n<\/code><\/pre>\n<p>\u521b\u5efa\u6587\u4ef6\u5e76\u5b9a\u4e49\u57fa\u7840\u67b6\u6784\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">touch <\/span>main.tf\r\n<\/code><\/pre>\n<p>\u8bf7\u6253\u5f00\u6587\u672c\u7f16\u8f91\u5668\u5e76\u6253\u5f00main.tf\u6587\u4ef6\uff0c\u5c06\u4ee5\u4e0b\u914d\u7f6e\u7c98\u8d34\u5e76\u4fdd\u5b58\u3002<\/p>\n<div>\u4f7f\u7528\u6b64\u914d\u7f6e\u7684AMI ID\u5c06\u6307\u5b9a\u4e3aus-west-2\u533a\u57df\u3002\u5982\u679c\u60f3\u8981\u4f7f\u7528\u5176\u4ed6\u533a\u57df\uff0c\u8bf7\u6309\u7167\u6545\u969c\u6392\u9664\u6307\u5357\u64cd\u4f5c\u3002<\/div>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/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; 4.16\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"&gt;= 1.2.0\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<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\">\"us-west-2\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_instance\"<\/span> <span class=\"s2\">\"app_server\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">ami<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-830c94e3\"<\/span>\r\n  <span class=\"nx\">instance_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"t2.micro\"<\/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\">\"ExampleAppServerInstance\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8bbe\u5b9a\u8fd9\u4e2a\u9009\u9879\u540e\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528Terraform\u8fdb\u884c\u90e8\u7f72\u3002\u8ba9\u6211\u4eec\u8be6\u7ec6\u770b\u770b\u6bcf\u4e2a\u533a\u5757\u3002<\/p>\n<h3>Terraform\u533a\u5757<\/h3>\n<p>terraform{}\u5757\u4e2d\u5305\u542bTerraform\u7684\u914d\u7f6e\u3002\u8ba9\u6211\u4eec\u6765\u63cf\u8ff0\u4e00\u4e0b\u5728Terraform\u4e2d\u8bbe\u7f6e\u57fa\u7840\u67b6\u6784\u6240\u9700\u7684\u63d0\u4f9b\u8005\u3002\u6bcf\u4e2a\u63d0\u4f9b\u8005\u90fd\u6709\u4e00\u4e2asource\u5c5e\u6027\uff0c\u5b9a\u4e49\u4e86\u4efb\u610f\u7684\u4e3b\u673a\u540d\u3001\u547d\u540d\u7a7a\u95f4\u548c\u63d0\u4f9b\u8005\u7c7b\u578b\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cTerraform\u4f1a\u4eceTerraform\u5b58\u50a8\u5e93\u4e2d\u5b89\u88c5\u63d0\u4f9b\u8005\u3002\u5728\u672c\u6559\u7a0b\u7684\u793a\u4f8b\u4e2d\uff0caws\u63d0\u4f9b\u8005\u7684\u6e90\u4ee3\u7801\u5b9a\u4e49\u4e3ahashicorp\/aws\u3002\u8fd9\u662fregistry.terraform.io\/hashicorp\/aws\u7684\u7b80\u7565\u5199\u6cd5\u3002<\/p>\n<p>\u5728`required_providers`\u5757\u4e2d\uff0c\u60a8\u8fd8\u53ef\u4ee5\u9650\u5236\u63d0\u4f9b\u7a0b\u5e8f\u7684\u7248\u672c\u3002\u867d\u7136\u4e0d\u9700\u8981\u6307\u5b9a`version`\u5c5e\u6027\uff0c\u4f46\u5efa\u8bae\u60a8\u6307\u5b9a`version`\u5c5e\u6027\u4ee5\u9650\u5236\u63d0\u4f9b\u7a0b\u5e8f\u7684\u7248\u672c\u3002\u901a\u8fc7\u8fd9\u6837\u505a\uff0c\u60a8\u53ef\u4ee5\u9632\u6b62Terraform\u5b89\u88c5\u4e0d\u9002\u7528\u4e8e\u6240\u521b\u5efa\u914d\u7f6e\u7684\u7248\u672c\u7684\u63d0\u4f9b\u7a0b\u5e8f\u800c\u5bfc\u81f4\u51fa\u73b0\u95ee\u9898\u3002\u5982\u679c\u4e0d\u6307\u5b9a\u63d0\u4f9b\u7a0b\u5e8f\u7684\u7248\u672c\uff0cTerraform\u4f1a\u5728\u521d\u59cb\u5316\u8fc7\u7a0b\u4e2d\u81ea\u52a8\u4e0b\u8f7d\u6700\u65b0\u7248\u672c\u3002<\/p>\n<p>\u8bf7\u67e5\u9605\u4f9b\u5e94\u5546\u6e90\u6587\u4ef6\u4ee5\u83b7\u53d6\u66f4\u8be6\u7ec6\u7684\u4fe1\u606f\u3002<\/p>\n<h3>\u53ea\u9700\u8981\u63d0\u4f9b\u5546<\/h3>\n<p>\u63d0\u4f9b\u8005\u533a\u5757\u7528\u4e8e\u8bbe\u7f6e\u7279\u5b9a\u7684\u63d0\u4f9b\u5546\u3002\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u6211\u4eec\u5c06\u8bbe\u7f6eAWS\u4f5c\u4e3a\u63d0\u4f9b\u5546\u3002\u63d0\u4f9b\u5546\u6307\u7684\u662fTerraform\u7528\u4e8e\u521b\u5efa\u548c\u7ba1\u7406\u8d44\u6e90\u6240\u4f7f\u7528\u7684\u63d2\u4ef6\u3002<\/p>\n<p>\u5728Terraform\u7684\u914d\u7f6e\u4e2d\uff0c\u60a8\u53ef\u4ee5\u7f16\u5199\u591a\u4e2a\u63d0\u4f9b\u8005\u5757\uff0c\u4ee5\u4fbf\u4ece\u4e0d\u540c\u7684\u63d0\u4f9b\u8005\u7ba1\u7406\u8d44\u6e90\u3002\u6b64\u5916\uff0c\u60a8\u8fd8\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u4e0d\u540c\u7684\u63d0\u4f9b\u8005\u3002\u4f8b\u5982\uff0c\u60a8\u53ef\u4ee5\u5c06AWS EC2\u5b9e\u4f8b\u7684IP\u5730\u5740\u4f20\u9012\u7ed9DataDog\u7684\u76d1\u63a7\u8d44\u6e90\u3002<\/p>\n<h3>\u8d44\u6e90 (z\u012b<\/h3>\n<p>\u8ba9\u6211\u4eec\u4f7f\u7528&#8221;resource&#8221;\u5757\u6765\u5b9a\u4e49\u57fa\u7840\u8bbe\u65bd\u7684\u6784\u6210\u8981\u7d20\u3002\u8d44\u6e90\u53ef\u4ee5\u662f\u7269\u7406\u7684\uff0c\u4e5f\u53ef\u80fd\u662f\u865a\u62df\u7684\uff0c\u4f8b\u5982EC2\u5b9e\u4f8b\uff0c\u6216\u8005\u662f\u903b\u8f91\u8d44\u6e90\uff0c\u4f8b\u5982Heroku\u5e94\u7528\u3002<\/p>\n<p>\u8d44\u6e90\u5757\u4e2d\u6709\u4e24\u4e2a\u5b57\u7b26\u4e32\uff0c\u5728\u5757\u7684\u524d\u9762\u3002\u5206\u522b\u79f0\u4e3a\u8d44\u6e90\u7c7b\u578b\u548c\u8d44\u6e90\u540d\u79f0\u3002\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u8d44\u6e90\u7c7b\u578b\u662faws_instance\uff0c\u8d44\u6e90\u540d\u79f0\u662fapp_server\u3002\u8d44\u6e90\u7c7b\u578b\u7684\u524d\u7f00\u4e0e\u63d0\u4f9b\u7a0b\u5e8f\u7684\u8d44\u6e90\u540d\u79f0\u76f8\u5bf9\u5e94\u3002\u5728\u914d\u7f6e\u793a\u4f8b\u4e2d\uff0cTerraform\u5c06\u4f7f\u7528aws\u63d0\u4f9b\u7a0b\u5e8f\u6765\u7ba1\u7406aws_instance\u3002\u540c\u65f6\uff0c\u8d44\u6e90\u7c7b\u578b\u548c\u8d44\u6e90\u540d\u79f0\u5c06\u4e3a\u8d44\u6e90\u5206\u914d\u552f\u4e00\u7684ID\u3002\u4f8b\u5982\uff0cEC2\u5b9e\u4f8b\u7684ID\u662faws_instance.app_server\u3002<\/p>\n<p>\u5728\u8d44\u6e90\u5757\u4e2d\uff0c\u53ef\u4ee5\u4f20\u9012\u53c2\u6570\u5e76\u901a\u8fc7\u53c2\u6570\u6765\u8bbe\u7f6e\u8d44\u6e90\u3002\u8fd9\u4e9b\u53c2\u6570\u53ef\u4ee5\u5305\u62ec\u673a\u5668\u7684\u5927\u5c0f\u3001\u78c1\u76d8\u955c\u50cf\u7684\u540d\u79f0\u3001VPC\u7684ID\u7b49\u3002\u5728\u63d0\u4f9b\u8005\u53c2\u8003\u4e2d\uff0c\u5217\u51fa\u4e86\u6bcf\u4e2a\u8d44\u6e90\u6240\u9700\u7684\u5fc5\u8981\u53c2\u6570\u548c\u53ef\u9009\u53c2\u6570\u7684\u5217\u8868\u3002\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u6211\u4eec\u5c06AMI ID\u8bbe\u7f6e\u4e3aUbuntu\u955c\u50cf\uff0c\u5e76\u5c06\u5b9e\u4f8b\u7c7b\u578b\u8bbe\u7f6e\u4e3at2.micro\uff0c\u9488\u5bf9EC2\u5b9e\u4f8b\u8fdb\u884c\u4e86\u914d\u7f6e\u3002\u8fd9\u662fAWS\u514d\u8d39\u5957\u9910\u4e2d\u53ef\u7528\u7684\u3002\u60a8\u8fd8\u53ef\u4ee5\u8bbe\u7f6e\u6807\u7b7e\u5e76\u7ed9\u5b9e\u4f8b\u547d\u540d\u3002<\/p>\n<h2>\u521d\u59cb\u5316\u76ee\u5f55<\/h2>\n<p>\u5728\u65b0\u5efa\u8bbe\u7f6e\u6216\u4ece\u7248\u672c\u63a7\u5236\u7cfb\u7edf\u68c0\u51fa\u73b0\u6709\u8bbe\u7f6e\u65f6\uff0c\u9700\u8981\u6267\u884cterraform init\u6765\u521d\u59cb\u5316\u76ee\u5f55\u3002<\/p>\n<p>\u5728\u521d\u59cb\u5316\u5de5\u4f5c\u76ee\u5f55\u65f6\uff0c\u5c06\u4f1a\u4e0b\u8f7d\u5e76\u5b89\u88c5\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u5b9a\u4e49\u7684\u63d0\u4f9b\u7a0b\u5e8f\u3002\u672c\u6559\u7a0b\u5c06\u5b89\u88c5AWS\u63d0\u4f9b\u7a0b\u5e8f\u3002<\/p>\n<p>\u6211\u4eec\u7acb\u5373\u6765\u521d\u59cb\u5316\u5de5\u4f5c\u76ee\u5f55\u5427\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform init\r\n\r\nInitializing the backend...\r\n\r\nInitializing provider plugins...\r\n- Finding hashicorp\/aws versions matching \"~&gt; 4.16\"...\r\n- Installing hashicorp\/aws v4.17.0...\r\n- Installed hashicorp\/aws v4.17.0 (signed by HashiCorp)\r\n\r\nTerraform has created a lock file .terraform.lock.hcl to record the provider\r\nselections it made above. Include this file in your version control repository\r\nso that Terraform can guarantee to make the same selections by default when\r\nyou run \"terraform init\" in the future.\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>Terraform \u4e0b\u8f7d aws \u63d0\u4f9b\u7a0b\u5e8f\uff0c\u5e76\u5728\u5f53\u524d\u5de5\u4f5c\u76ee\u5f55\u4e2d\u521b\u5efa\u540d\u4e3a .terraform \u7684\u9690\u85cf\u76ee\u5f55\uff0c\u5e76\u5728\u5176\u4e2d\u5b89\u88c5 aws \u63d0\u4f9b\u7a0b\u5e8f\u3002\u6267\u884c terraform init \u547d\u4ee4\u540e\uff0c\u5c06\u8f93\u51fa\u5b89\u88c5\u7684\u63d0\u4f9b\u7a0b\u5e8f\u7684\u7248\u672c\u3002Terraform \u8fd8\u4f1a\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a .terraform.lock.hcl \u7684\u9501\u6587\u4ef6\u3002\u8be5\u9501\u6587\u4ef6\u6307\u5b9a\u4e86\u8981\u4f7f\u7528\u7684\u63d0\u4f9b\u7a0b\u5e8f\u7684\u7cbe\u786e\u7248\u672c\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728\u60f3\u8981\u66f4\u65b0\u9879\u76ee\u6240\u4f7f\u7528\u7684\u63d0\u4f9b\u7a0b\u5e8f\u65f6\u8fdb\u884c\u63a7\u5236\u3002<\/p>\n<h2>\u8bbe\u5b9a\u7684\u683c\u5f0f\u548c\u9a8c\u8bc1<\/h2>\n<p>\u5efa\u8bae\u4f7f\u7528\u4e00\u81f4\u7684\u683c\u5f0f\u6765\u8bbe\u7f6e\u914d\u7f6e\u6587\u4ef6\u3002\u8fd0\u884cterraform fmt\u4f1a\u81ea\u52a8\u66f4\u65b0\u5f53\u524d\u5de5\u4f5c\u76ee\u5f55\u4e2d\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u5e76\u5c06\u5176\u683c\u5f0f\u5316\u4e3a\u6613\u8bfb\u4e14\u4e00\u81f4\u7684\u683c\u5f0f\u3002<\/p>\n<p>\u8ba9\u6211\u4eec\u5c1d\u8bd5\u5bf9\u8bbe\u7f6e\u8fdb\u884c\u683c\u5f0f\u5316\u3002\u5982\u679c\u6709\u4efb\u4f55\u4fee\u6539\u8fc7\u7684\u6587\u4ef6\uff0c\u8be5\u6587\u4ef6\u540d\u5c06\u88ab\u8f93\u51fa\u3002\u5728\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u7531\u4e8e\u8bbe\u7f6e\u6587\u4ef6\u5df2\u7ecf\u6b63\u786e\u683c\u5f0f\u5316\uff0c\u6240\u4ee5Terraform\u4e0d\u4f1a\u8f93\u51fa\u4efb\u4f55\u5185\u5bb9\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform <span class=\"nb\">fmt<\/span>\r\n<\/code><\/pre>\n<p>\u6b64\u5916\uff0c\u60a8\u8fd8\u53ef\u4ee5\u901a\u8fc7\u6267\u884cterraform validate\u547d\u4ee4\u6765\u786e\u8ba4\u914d\u7f6e\u7684\u8bed\u6cd5\u6b63\u786e\u4e14\u4e00\u81f4\u3002<\/p>\n<p>\u8bf7\u786e\u8ba4\u8bbe\u7f6e\u5df2\u542f\u7528\u3002\u5982\u4e0a\u6240\u793a\u7684\u8bbe\u7f6e\u793a\u4f8b\u662f\u6709\u6548\u7684\uff0cTerraform\u5c06\u8fd4\u56de\u6210\u529f\u6d88\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform validate\r\nSuccess! The configuration is valid.\r\n<\/code><\/pre>\n<h2>\u57fa\u7840\u8bbe\u65bd\u5efa\u8bbe<\/h2>\n<p>\u8ba9\u6211\u4eec\u6267\u884cterraform apply\u6765\u5e94\u7528\u914d\u7f6e\u3002Terraform\u5c06\u4ea7\u751f\u7c7b\u4f3c\u4ee5\u4e0b\u7684\u8f93\u51fa\u3002\u6b64\u5916\uff0c\u7531\u4e8e\u7a7a\u95f4\u9650\u5236\uff0c\u90e8\u5206\u5185\u5bb9\u5df2\u7701\u7565\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform apply\r\n\r\nTerraform used the selected providers to generate the following execution plan.\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   aws_instance.app_server will be created\r\n  + resource \"aws_instance\" \"app_server\" {\r\n      + ami                          = \"ami-830c94e3\"\r\n      + arn                          = (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:\r\n<\/code><\/pre>\n<div>\u5982\u679c\u5e94\u7528\u914d\u7f6e\u5931\u8d25\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u66f4\u6539\u4e86\u533a\u57df\u6216\u610f\u5916\u5220\u9664\u9ed8\u8ba4\u7684VPC\u3002\u60a8\u53ef\u4ee5\u67e5\u770b\u672c\u6559\u7a0b\u4e2d\u7684\u6545\u969c\u6392\u9664\u7ae0\u8282\uff0c\u53ef\u80fd\u4f1a\u6709\u5e2e\u52a9\u3002<\/div>\n<p>\u5728\u8fdb\u884c\u4efb\u4f55\u66f4\u6539\u4e4b\u524d\uff0cTerraform\u4f1a\u751f\u6210\u4e00\u4e2a\u6267\u884c\u8ba1\u5212\u3002\u6267\u884c\u8ba1\u5212\u662f\u6307\u63cf\u8ff0Terraform\u5c06\u6267\u884c\u7684\u64cd\u4f5c\uff0c\u4ee5\u66f4\u6539\u57fa\u7840\u67b6\u6784\u4ee5\u4e0e\u914d\u7f6e\u6587\u4ef6\u5339\u914d\u3002<\/p>\n<p>\u6267\u884c\u8ba1\u5212\u7684\u683c\u5f0f\u7c7b\u4f3c\u4e8eGit\u7b49diff\u683c\u5f0f\u3002\u5728\u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c&#8221;+&#8221;\u65c1\u8fb9\u662faws_instance.app_server\u3002\u8fd9\u610f\u5473\u7740Terraform\u5c06\u521b\u5efa\u6b64\u8d44\u6e90\u3002\u5728\u4e0b\u4e00\u884c\u4e2d\uff0c\u5199\u7740\u5373\u5c06\u8bbe\u7f6e\u7684\u5c5e\u6027\u3002(known after apply)\u7684\u4f4d\u7f6e\u610f\u5473\u7740\u5728\u521b\u5efa\u8d44\u6e90\u4e4b\u524d\u8fd8\u4e0d\u77e5\u9053\u7684\u503c\u3002\u4f8b\u5982\uff0cAWS\u5728\u521b\u5efa\u65f6\u4f1a\u4e3a\u5b9e\u4f8b\u5206\u914dARN\uff08Amazon\u8d44\u6e90\u540d\u79f0\uff09\u3002\u56e0\u6b64\uff0c\u53ea\u6709\u5728\u5e94\u7528\u914d\u7f6e\u66f4\u6539\u5e76\u4e14AWS\u63d0\u4f9b\u5546\u4eceAWS API\u8fd4\u56de\u503c\u540e\uff0c\u624d\u80fd\u77e5\u9053arn\u5c5e\u6027\u7684\u503c\u3002<\/p>\n<p>\u76ee\u524d\uff0cTerraform\u5df2\u6682\u505c\u53d8\u66f4\u5e76\u7b49\u5f85\u53d8\u66f4\u7684\u6279\u51c6\u624d\u4f1a\u7ee7\u7eed\u8fd0\u884c\u3002\u5982\u679c\u6267\u884c\u8ba1\u5212\u4e2d\u5b58\u5728\u9519\u8bef\u6216\u5371\u9669\u6027\uff0cTerraform\u5728\u5bf9\u57fa\u7840\u67b6\u6784\u8fdb\u884c\u66f4\u6539\u4e4b\u524d\u5728\u6b64\u5904\u4e2d\u65ad\u662f\u5b89\u5168\u7684\u3002<\/p>\n<p>\u5728\u672c\u4f8b\u4e2d\uff0c\u5982\u679c\u6267\u884c\u8ba1\u5212\u88ab\u63a5\u53d7\uff0c\u60a8\u9700\u8981\u5728\u786e\u8ba4\u6d88\u606f\u4e2d\u952e\u5165\u201c\u662f\u201d\uff0c\u7136\u540e\u7ee7\u7eed\u64cd\u4f5c\u3002\u6267\u884c\u8ba1\u5212\u53ef\u80fd\u9700\u8981\u51e0\u5206\u949f\u624d\u80fd\u5b8c\u6210\u3002\u8fd9\u662f\u56e0\u4e3aTerraform\u4f1a\u7b49\u5f85EC2\u5b9e\u4f8b\u53ef\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code>  Enter a value: yes\r\n\r\naws_instance.app_server: Creating...\r\naws_instance.app_server: Still creating... [10s elapsed]\r\naws_instance.app_server: Still creating... [20s elapsed]\r\naws_instance.app_server: Still creating... [30s elapsed]\r\naws_instance.app_server: Creation complete after 36s [id=i-01e03375ba238b384]\r\n\r\nApply complete! Resources: 1 added, 0 changed, 0 destroyed.\r\n<\/code><\/pre>\n<p>\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528Terraform\u6765\u521b\u5efa\u57fa\u7840\u8bbe\u65bd\uff01\u5728EC2\u63a7\u5236\u53f0\u4e0a\uff0c\u8ba9\u6211\u4eec\u8bd5\u7740\u5bfb\u627e\u65b0\u7684EC2\u5b9e\u4f8b\u3002<\/p>\n<div>\u8bf7\u786e\u8ba4AWS\u63a7\u5236\u53f0\u5df2\u8bbe\u7f6e\u4e3aus-west-2\u533a\u57df\uff0c\u7531\u4e8eAWS\u63d0\u4f9b\u5546\u5c01\u9501\u7684\u539f\u56e0\uff0c\u5b9e\u4f8b\u7684\u533a\u57df\u88ab\u8bbe\u5b9a\u4e3aus-west-2\u3002<\/div>\n<h2>\u72b6\u6001\u68c0\u67e5 de<\/h2>\n<p>\u5e94\u7528\u914d\u7f6e\u540e\uff0cTerraform\u5c06\u6570\u636e\u5199\u5165\u540d\u4e3aterraform.tfstate\u7684\u6587\u4ef6\u3002Terraform\u5c06\u5b58\u50a8\u7ba1\u7406\u8d44\u6e90\u7684ID\u548c\u5c5e\u6027\u4e8e\u6b64\u6587\u4ef6\u4e2d\u3002\u56e0\u6b64\uff0c\u4e4b\u540e\u53ef\u4ee5\u66f4\u65b0\u6216\u5220\u9664\u8fd9\u4e9b\u8d44\u6e90\u3002<\/p>\n<p>Terraform\u7684\u72b6\u6001\u6587\u4ef6\u662f\u8ffd\u8e2a\u53d7\u7ba1\u7406\u8d44\u6e90\u7684\u552f\u4e00\u65b9\u5f0f\u3002\u6b64\u5916\uff0c\u72b6\u6001\u6587\u4ef6\u901a\u5e38\u5305\u542b\u673a\u5bc6\u4fe1\u606f\u3002\u56e0\u6b64\uff0c\u5fc5\u987b\u5b89\u5168\u5730\u5b58\u50a8\u72b6\u6001\u6587\u4ef6\uff0c\u5e76\u9650\u5236\u53ea\u6709\u53ef\u4fe1\u8d56\u7684\u56e2\u961f\u6210\u5458\u53ef\u4ee5\u8bbf\u95ee\u4ee5\u7ba1\u7406\u57fa\u7840\u67b6\u6784\u3002\u5728\u751f\u4ea7\u73af\u5883\u4e2d\uff0c\u5efa\u8bae\u4f7f\u7528Terraform Cloud\u6216Terraform Enterprise\u5c06\u72b6\u6001\u6587\u4ef6\u5b58\u50a8\u5728\u8fdc\u7a0b\u3002\u7531\u4e8eTerraform\u8fd8\u652f\u6301\u5176\u4ed6\u51e0\u4e2a\u8fdc\u7a0b\u540e\u7aef\uff0c\u56e0\u6b64\u53ef\u4ee5\u4f7f\u7528\u5b83\u4eec\u6765\u5b58\u50a8\u548c\u7ba1\u7406\u72b6\u6001\u6587\u4ef6\u3002<\/p>\n<p>\u8ba9\u6211\u4eec\u8fd0\u884c &#8220;terraform show&#8221; \u547d\u4ee4\u6765\u68c0\u67e5\u5f53\u524d\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform show\r\n# aws_instance.app_server:\r\nresource \"aws_instance\" \"app_server\" {\r\n    ami                          = \"ami-830c94e3\"\r\n    arn                          = \"arn:aws:ec2:us-west-2:561656980159:instance\/i-01e03375ba238b384\"\r\n    associate_public_ip_address  = true\r\n    availability_zone            = \"us-west-2c\"\r\n    cpu_core_count               = 1\r\n    cpu_threads_per_core         = 1\r\n    disable_api_termination      = false\r\n    ebs_optimized                = false\r\n    get_password_data            = false\r\n    hibernation                  = false\r\n    id                           = \"i-01e03375ba238b384\"\r\n    instance_state               = \"running\"\r\n    instance_type                = \"t2.micro\"\r\n    ipv6_address_count           = 0\r\n    ipv6_addresses               = []\r\n    monitoring                   = false\r\n    primary_network_interface_id = \"eni-068d850de6a4321b7\"\r\n    private_dns                  = \"ip-172-31-0-139.us-west-2.compute.internal\"\r\n    private_ip                   = \"172.31.0.139\"\r\n    public_dns                   = \"ec2-18-237-201-188.us-west-2.compute.amazonaws.com\"\r\n    public_ip                    = \"18.237.201.188\"\r\n    secondary_private_ips        = []\r\n    security_groups              = [\r\n        \"default\",\r\n    ]\r\n    source_dest_check            = true\r\n    subnet_id                    = \"subnet-31855d6c\"\r\n    tags                         = {\r\n        \"Name\" = \"ExampleAppServerInstance\"\r\n    }\r\n    tenancy                      = \"default\"\r\n    vpc_security_group_ids       = [\r\n        \"sg-0edc8a5a\",\r\n    ]\r\n\r\n    credit_specification {\r\n        cpu_credits = \"standard\"\r\n    }\r\n\r\n    enclave_options {\r\n        enabled = false\r\n    }\r\n\r\n    metadata_options {\r\n        http_endpoint               = \"enabled\"\r\n        http_put_response_hop_limit = 1\r\n        http_tokens                 = \"optional\"\r\n    }\r\n\r\n    root_block_device {\r\n        delete_on_termination = true\r\n        device_name           = \"\/dev\/sda1\"\r\n        encrypted             = false\r\n        iops                  = 0\r\n        tags                  = {}\r\n        throughput            = 0\r\n        volume_id             = \"vol-031d56cc45ea4a245\"\r\n        volume_size           = 8\r\n        volume_type           = \"standard\"\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>\u5f53Terraform\u521b\u5efa\u8fd9\u4e2aEC2\u5b9e\u4f8b\u65f6\uff0c\u5b83\u4e5f\u4f1a\u4eceAWS\u63d0\u4f9b\u5546\u90a3\u91cc\u6536\u96c6\u8d44\u6e90\u7684\u5143\u6570\u636e\uff0c\u5e76\u5c06\u5176\u5199\u5165\u72b6\u6001\u6587\u4ef6\u3002\u5728\u672c\u6559\u7a0b\u7684\u540e\u7eed\u6b65\u9aa4\u4e2d\uff0c\u6211\u4eec\u5c06\u53c2\u8003\u8fd9\u4e9b\u503c\u6765\u8fdb\u884c\u914d\u7f6e\u66f4\u6539\uff0c\u5e76\u8bbe\u7f6e\u5176\u4ed6\u8d44\u6e90\u548c\u8f93\u51fa\u503c\u7684\u914d\u7f6e\u3002<\/p>\n<h3>\u624b\u52a8\u7684\u72b6\u6001\u7ba1\u7406<\/h3>\n<p>\u4f7f\u7528Terraform\u65f6\uff0c\u6709\u4e00\u4e2a\u540d\u4e3aterraform state\u7684\u5185\u5efa\u547d\u4ee4\u7528\u4e8e\u8fdb\u884c\u8be6\u7ec6\u7684\u72b6\u6001\u7ba1\u7406\u3002\u5c1d\u8bd5\u6267\u884clist\u5b50\u547d\u4ee4\uff0c\u4ee5\u663e\u793a\u9879\u76ee\u5f53\u524d\u72b6\u6001\u4e0b\u7684\u8d44\u6e90\u5217\u8868\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform state list\r\naws_instance.app_server\r\n<\/code><\/pre>\n<h2>\u6545\u969c\u6392\u9664<\/h2>\n<p>\u5982\u679c\u5728terraform validate\u4e2d\u663e\u793a\u6210\u529f\u6d88\u606f\uff0c\u4f46\u5e94\u7528\u66f4\u6539\u5931\u8d25\uff0c\u5219\u53ef\u80fd\u53d1\u751f\u4ee5\u4e0b\u5e38\u89c1\u9519\u8bef\u3002<\/p>\n<p>\u30ea\u30fc\u30b8\u30e7\u30f3\u3092us-west-2\u4ee5\u5916\u306b\u8a2d\u5b9a\u3057\u3066\u3044\u308b\u5834\u5408\u3001ami\u3082\u5909\u66f4\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002AMI ID\u306f\u30ea\u30fc\u30b8\u30e7\u30f3\u306b\u56fa\u6709\u306e\u3082\u306e\u3060\u304b\u3089\u3067\u3059\u3002Amazon\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b\u5f93\u3063\u3066\u81ea\u8eab\u306e\u30ea\u30fc\u30b8\u30e7\u30f3\u306b\u56fa\u6709\u306eAMI ID\u3092\u9078\u629e\u3057\u3001main.tf\u306b\u305d\u306eID\u3092\u8a18\u8ff0\u3057\u307e\u3057\u3087\u3046\u3002\u305d\u3057\u3066terraform apply\u3092\u518d\u5ea6\u5b9f\u884c\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u6b63\u3057\u3044\u30ea\u30fc\u30b8\u30e7\u30f3\u306eAWS\u30a2\u30ab\u30a6\u30f3\u30c8\u306b\u30c7\u30d5\u30a9\u30eb\u30c8VPC\u304c\u306a\u3044\u5834\u5408\u3001\u307e\u305aWeb UI\u3067AWS VPC\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306b\u79fb\u52d5\u3057\u81ea\u8eab\u306e\u30ea\u30fc\u30b8\u30e7\u30f3\u306bVPC\u3092\u65b0\u3057\u304f\u4f5c\u6210\u3057\u3001\u30b5\u30d6\u30cd\u30c3\u30c8\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30fb\u30b0\u30eb\u30fc\u30d7\u3092\u305d\u306eVPC\u306b\u95a2\u9023\u4ed8\u3051\u307e\u3059\u3002\u6b21\u306b\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30fb\u30b0\u30eb\u30fc\u30d7\u306eID(vpc_security_group_ids)\u3068\u30b5\u30d6\u30cd\u30c3\u30c8\u306eID(subnet_id)\u306e\u5f15\u6570\u3092aws_instance\u306b\u52a0\u3048\u3001\u305d\u306e\u5024\u3092\u65b0\u3057\u3044\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30fb\u30b0\u30eb\u30fc\u30d7\u3068\u30b5\u30d6\u30cd\u30c3\u30c8\u306e\u3082\u306e\u306b\u66f8\u304d\u63db\u3048\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code> <span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_instance\"<\/span> <span class=\"s2\">\"app_server\"<\/span> <span class=\"p\">{<\/span>\r\n   <span class=\"nx\">ami<\/span>                    <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-830c94e3\"<\/span>\r\n   <span class=\"nx\">instance_type<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"t2.micro\"<\/span>\r\n<span class=\"hil\"><span class=\"o\">+ <\/span> <span class=\"nx\">vpc_security_group_ids<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"sg-0077...\"<\/span><span class=\"p\">]<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span> <span class=\"nx\">subnet_id<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"subnet-923a...\"<\/span>\r\n<\/span> <span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u6211\u4eec\u6765\u4fee\u6539\u5e76\u4fdd\u5b58\u4e3b\u8981\u7684`.tf`\u6587\u4ef6\uff0c\u7136\u540e\u518d\u6b21\u6267\u884c`terraform apply`\u547d\u4ee4\u8bd5\u8bd5\u770b\u3002<\/p>\n<p>\u8bf7\u786e\u4fdd\u5728\u9605\u8bfb\u540e\u7eed\u7684\u6559\u7a0b\u65f6\uff0c\u4e0d\u8981\u5fd8\u8bb0\u521a\u521a\u6dfb\u52a0\u7684\u66f4\u6539\u3002\u8be6\u60c5\u8bf7\u9605\u8bfb\u6765\u81ea\u6b63\u5728\u8fd0\u884c\u7684AWS VPC\u7684Amazon\u6587\u6863\u3002<\/p>\n<h2>\u4e0b\u4e00\u6b65<\/h2>\n<p>\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528Terraform\u521b\u5efa\u521d\u59cb\u57fa\u7840\u67b6\u6784\uff0c\u7136\u540e\u8fdb\u5165\u4e0b\u4e00\u4e2a\u6559\u7a0b\u5e76\u5bf9\u57fa\u7840\u67b6\u6784\u8fdb\u884c\u4fee\u6539\u3002<\/p>\n<p>\u5173\u4e8e\u5728\u6b64\u6559\u7a0b\u4e2d\u63d0\u5230\u7684\u6982\u5ff5\uff0c\u66f4\u591a\u4fe1\u606f\u8bf7\u53c2\u8003\u4ee5\u4e0bHashiCorp\u7684\u6587\u6863\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Terraform\u306e\u8a2d\u5b9a\u8a00\u8a9e\u306b\u3064\u3044\u3066\u306f\u3053\u3061\u3089\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u306f\u3053\u3061\u3089<\/ul>\n<\/li>\n<\/ul>\n<p>Terraform\u306e\u4ed6\u306e\u4f7f\u7528\u4f8b\u306b\u3064\u3044\u3066\u306f\u3053\u3061\u3089<\/p>\n<p>AWS\u306e\u8a8d\u8a3c\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u306f\u3053\u3061\u3089<\/p>\n<p>terraform state\u30b3\u30de\u30f3\u30c9\u3084\u305d\u306e\u30b5\u30d6\u30b3\u30de\u30f3\u30c9\u3092\u7528\u3044\u305f\u3001\u72b6\u614b\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u306e\u30ea\u30bd\u30fc\u30b9\u306e\u5909\u66f4\u306a\u3069\u306b\u3064\u3044\u3066\u306f\u3053\u3061\u3089<\/p>\n<hr \/>\n<hr \/>\n<h1>\u57fa\u7840\u8bbe\u65bd\u7684\u6539\u53d8 (j\u012b ch\u01d4 sh\u00e8 sh\u012b de<\/h1>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d84d5913a08637a6b74d5\/88-0.png\" alt=\"Terraform Video\" \/><\/div>\n<p>\u57fa\u7840\u8bbe\u65bd\u662f\u4e00\u76f4\u4e0d\u65ad\u53d8\u5316\u7684\u4e1c\u897f\u3002Terraform\u5728\u7ba1\u7406\u8fd9\u79cd\u53d8\u5316\u65b9\u9762\u975e\u5e38\u6709\u7528\u3002\u5f53\u66f4\u6539Terraform\u7684\u914d\u7f6e\u65f6\uff0cTerraform\u4f1a\u6784\u5efa\u6267\u884c\u8ba1\u5212\u3002\u8be5\u6267\u884c\u8ba1\u5212\u53ea\u4f1a\u5bf9\u9700\u8981\u66f4\u6539\u7684\u57fa\u7840\u8bbe\u65bd\u90e8\u5206\u8fdb\u884c\u4fee\u6539\uff0c\u4ee5\u4f7f\u5176\u8fbe\u5230\u6240\u671f\u671b\u7684\u72b6\u6001\u3002<\/p>\n<p>\u5982\u679c\u4f60\u5728\u9879\u76ee\u4e2d\u4f7f\u7528Terraform\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528\u7248\u672c\u63a7\u5236\u7cfb\u7edf\u6765\u7ba1\u7406\u914d\u7f6e\u6587\u4ef6\uff0c\u5e76\u5c06\u72b6\u6001\u5b58\u50a8\u5728\u8fdc\u7a0b\u540e\u7aef\uff0c\u5982Terraform Cloud\u6216Terraform Enterprise\u3002<\/p>\n<h2>\u524d\u63d0<\/h2>\n<p>Note: &#8220;\u524d\u63d0\u6761\u4ef6&#8221; literally means &#8220;premise conditions&#8221; or &#8220;preliminary conditions.&#8221; However, the word &#8220;\u6761\u4ef6&#8221; (conditions) is redundant when used with &#8220;\u524d\u63d0&#8221; (premise), so it can be omitted.<\/p>\n<p>\u5047\u8bbe\u60a8\u5df2\u7ecf\u5b8c\u6210\u4e0a\u4e00\u6559\u7a0b\uff0c\u624d\u80fd\u7ee7\u7eed\u5b66\u4e60\u672c\u6559\u7a0b\u3002\u5982\u679c\u672a\u5b8c\u6210\uff0c\u8bf7\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u7ee7\u7eed\u5b66\u4e60\u672c\u6559\u7a0b\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Terraform CLI(1.2.0+)\u3068\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u306b\u8a2d\u5b9a\u3055\u308c\u305fAWS CLI\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u8a73\u3057\u3044\u624b\u9806\u306b\u3064\u3044\u3066\u306f\u524d\u56de\u306e\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u3092\u3054\u53c2\u7167\u304f\u3060\u3055\u3044\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>learn-terraform-aws-instance\u3068\u3044\u3046\u540d\u524d\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3057\u3001\u4ee5\u4e0b\u306e\u8a2d\u5b9a\u3092main.tf\u3068\u3044\u3046\u540d\u524d\u3067\u4fdd\u5b58\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/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; 4.16\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"&gt;= 1.2.0\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<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\">\"us-west-2\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_instance\"<\/span> <span class=\"s2\">\"app_server\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">ami<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-830c94e3\"<\/span>\r\n  <span class=\"nx\">instance_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"t2.micro\"<\/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\">\"ExampleAppServerInstance\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\u4f5c\u6210\u3057\u305f\u8a2d\u5b9a\u3067\u521d\u671f\u5316\u3057\u307e\u3059\u3002<\/ul>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform init\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\u8a2d\u5b9a\u3092\u9069\u7528\u3055\u305b\u307e\u3059\u3002\u78ba\u8a8d\u30e1\u30c3\u30bb\u30fc\u30b8\u306b\u306fyes\u3068\u7b54\u3048\u307e\u3057\u3087\u3046\u3002<\/ul>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform apply\r\n<\/code><\/pre>\n<p>\u5982\u679c\u8a2d\u5b9a\u6210\u529f\u61c9\u7528\uff0c\u60a8\u5c31\u80fd\u7e7c\u7e8c\u9032\u884c\u6559\u5b78\u3002<\/p>\n<h2>\u8bbe\u5b9a<\/h2>\n<p>\u8ba9\u6211\u4eec\u66f4\u65b0\u5b9e\u4f8b\u7684AMI\u3002\u901a\u8fc7\u5c06\u5f53\u524d\u7684AMI ID\u66ff\u6362\u4e3a\u65b0\u7684ID\uff0c\u5373\u53ef\u4fee\u6539main.tf\u6587\u4ef6\u4e2daws_instance.app_server\u8d44\u6e90\u7684\u63d0\u4f9b\u7a0b\u5e8f\u5757\u3002<\/p>\n<div>\u4ee5\u4e0b\u7684\u4ee3\u7801\u7247\u6bb5\u9075\u5faa\u4e86\u5dee\u5f02\u683c\u5f0f\u3002\u5728\u8fd9\u4e2a\u683c\u5f0f\u4e2d\uff0c\u53ef\u4ee5\u6e05\u695a\u5730\u770b\u5230\u9700\u8981\u5bf9\u914d\u7f6e\u6587\u4ef6\u8fdb\u884c\u66f4\u6539\u7684\u5730\u65b9\u3002\u5c06\u7ea2\u8272\u884c\u7684\u5185\u5bb9\u66ff\u6362\u4e3a\u7eff\u8272\u884c\u3002\u66ff\u6362\u65f6\u5c06\u5220\u9664\u884c\u9996\u7684+\u548c-\u7b26\u53f7\u3002<\/div>\n<div>\u8bf7\u786e\u8ba4\u5728\u4f7f\u7528\u6b64\u914d\u7f6e\u6587\u4ef6\u65f6\uff0c\u6240\u9009\u62e9\u7684\u65b0\u7684AMI ID\u662f\u9488\u5bf9us-west-2\u5730\u533a\u7684\u7279\u5b9aID\u3002\u5982\u679c\u5728\u4e0d\u540c\u7684\u5730\u533a\u8fdb\u884c\u64cd\u4f5c\uff0c\u8bf7\u6309\u7167\u4e9a\u9a6c\u900a\u6587\u6863\u7684\u6307\u793a\u9009\u62e9\u9002\u5408\u8be5\u5730\u533a\u7684AMI\u3002<\/div>\n<pre class=\"post-pre\"><code> <span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_instance\"<\/span> <span class=\"s2\">\"app_server\"<\/span> <span class=\"p\">{<\/span>\r\n<span class=\"hdl\"><span class=\"o\">- <\/span> <span class=\"nx\">ami<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-830c94e3\"<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span> <span class=\"nx\">ami<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-08d70e59c07c61a3a\"<\/span>\r\n<\/span>   <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\u5c06\u4f7fAMI\u66f4\u6539\u4e3aUbuntu 16.04 AMI\u3002\u5728AWS\u63d0\u4f9b\u5546\u4e2d\uff0c\u60a8\u65e0\u6cd5\u5728\u521b\u5efa\u5b9e\u4f8b\u540e\u66f4\u6539\u8be5\u5b9e\u4f8b\u7684AMI\u3002\u56e0\u6b64\uff0cTerraform\u4f1a\u5148\u5220\u9664\u65e7\u5b9e\u4f8b\uff0c\u7136\u540e\u521b\u5efa\u65b0\u5b9e\u4f8b\u3002<\/p>\n<h2>\u5e94\u7528\u53d8\u66f4<\/h2>\n<p>\u6211\u4eec\u6765\u91cd\u65b0\u8fd0\u884cterraform apply\uff0c\u770b\u770b\u5728\u66f4\u6539\u8bbe\u7f6e\u540e\uff0cTerraform\u5982\u4f55\u5c06\u6b64\u66f4\u6539\u5e94\u7528\u4e8e\u73b0\u6709\u8d44\u6e90\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform apply\r\naws_instance.app_server: Refreshing state... [id=i-01e03375ba238b384]\r\n\r\nTerraform used the selected providers to generate the following execution plan.\r\nResource actions are indicated with the following symbols:\r\n-\/+ destroy and then create replacement\r\n\r\nTerraform will perform the following actions:\r\n\r\n   aws_instance.app_server must be replaced\r\n-\/+ resource \"aws_instance\" \"app_server\" {\r\n      ~ ami                          = \"ami-830c94e3\" -&gt; \"ami-08d70e59c07c61a3a\" # forces replacement\r\n      ~ arn                          = \"arn:aws:ec2:us-west-2:561656980159:instance\/i-01e03375ba238b384\" -&gt; (known after apply)\r\n##...\r\n\r\nPlan: 1 to add, 0 to change, 1 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:\r\n<\/code><\/pre>\n<p>\u4ee5&#8221;+&#8221;\u6216&#8221;-&#8220;\u5f00\u5934\u7684\u884c\uff0c\u66f4\u51c6\u786e\u5730\u8bf4\uff0c\u610f\u5473\u7740Terraform\u4f1a\u5220\u9664\u8d44\u6e90\u7136\u540e\u91cd\u65b0\u521b\u5efa\uff0c\u800c\u4e0d\u662f\u76f4\u63a5\u8986\u76d6\u66f4\u65b0\u8d44\u6e90\u3002\u5728Terraform\u4e2d\uff0c\u53ef\u4ee5\u76f4\u63a5\u8986\u76d6\u66f4\u65b0\u67d0\u4e9b\u5c5e\u6027\u3002\u8fd9\u6837\u7684\u53d8\u66f4\u884c\u4ee5&#8221;~&#8221;\u5f00\u5934\u3002\u7136\u800c\uff0c\u5982\u679c\u8981\u66f4\u6539EC2\u5b9e\u4f8b\u7684AMI\uff0c\u5219\u65e0\u6cd5\u76f4\u63a5\u8986\u76d6\u66f4\u65b0\uff0c\u5fc5\u987b\u91cd\u65b0\u521b\u5efa\u5b9e\u4f8b\u3002Terraform\u5c06\u6267\u884c\u8fd9\u4e9b\u64cd\u4f5c\u3002\u6267\u884c\u8ba1\u5212\u663e\u793a\u4e86Terraform\u6267\u884c\u7684\u5185\u5bb9\u3002<\/p>\n<p>\u53e6\u5916\uff0c\u5b9e\u65bd\u8ba1\u5212\u4e2d\u6ce8\u660e\u4e86AMI\u7684\u66f4\u6539\u4f1a\u5f3a\u5236\u66ff\u6362\u5b9e\u4f8b\u3002\u6839\u636e\u8fd9\u4e00\u4fe1\u606f\uff0c\u6211\u4eec\u9700\u8981\u8c03\u6574\u53d8\u66f4\u5185\u5bb9\uff0c\u5e76\u5728\u5fc5\u8981\u65f6\u907f\u514d\u7834\u574f\u6027\u7684\u66f4\u65b0\u3002<\/p>\n<p>\u6267\u884c\u8ba1\u5212\u662f\u5426\u7ee7\u7eed\u8fdb\u884c\uff0c\u5c06\u518d\u6b21\u663e\u793a\u786e\u8ba4\u6d88\u606f\u3002\u8bf7\u952e\u5165\u201c\u662f\u201d\u4ee5\u6267\u884c\u3002<\/p>\n<pre class=\"post-pre\"><code>  Enter a value: yes\r\n\r\naws_instance.app_server: Destroying... [id=i-01e03375ba238b384]\r\naws_instance.app_server: Still destroying... [id=i-01e03375ba238b384, 10s elapsed]\r\naws_instance.app_server: Still destroying... [id=i-01e03375ba238b384, 20s elapsed]\r\naws_instance.app_server: Still destroying... [id=i-01e03375ba238b384, 30s elapsed]\r\naws_instance.app_server: Still destroying... [id=i-01e03375ba238b384, 40s elapsed]\r\naws_instance.app_server: Destruction complete after 42s\r\naws_instance.app_server: Creating...\r\naws_instance.app_server: Still creating... [10s elapsed]\r\naws_instance.app_server: Still creating... [20s elapsed]\r\naws_instance.app_server: Still creating... [30s elapsed]\r\naws_instance.app_server: Still creating... [40s elapsed]\r\naws_instance.app_server: Creation complete after 50s [id=i-0fd4a35969bd21710]\r\n\r\nApply complete! Resources: 1 added, 0 changed, 1 destroyed.\r\n<\/code><\/pre>\n<p>\u6309\u7167\u6267\u884c\u8ba1\u5212\u7684\u8981\u6c42\uff0c\u5148\u5220\u9664\u73b0\u6709\u7684\u5b9e\u4f8b\uff0c\u7136\u540e\u91cd\u65b0\u521b\u5efa\u5b9e\u4f8b\u3002\u518d\u6b21\u6267\u884c`terraform show`\u547d\u4ee4\uff0c\u53ef\u4ee5\u8f93\u51fa\u4e0e\u6b64\u5b9e\u4f8b\u76f8\u5173\u7684\u65b0\u503c\u3002<\/p>\n<hr \/>\n<hr \/>\n<h1>\u57fa\u7840\u8bbe\u65bd\u7684\u79fb\u9664<\/h1>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d84d5913a08637a6b74d5\/117-0.png\" alt=\"Terraform Video\" \/><\/div>\n<p>\u5f53\u4e0d\u518d\u9700\u8981\u57fa\u7840\u8bbe\u65bd\u65f6\uff0c\u53ef\u80fd\u4f1a\u8003\u8651\u5220\u9664\u57fa\u7840\u8bbe\u65bd\u4ee5\u51cf\u5c11\u5b89\u5168\u98ce\u9669\u548c\u5b89\u5168\u6210\u672c\u3002\u4f8b\u5982\uff0c\u53ef\u80fd\u4f1a\u4ece\u670d\u52a1\u4e2d\u5220\u9664\u751f\u4ea7\u73af\u5883\uff0c\u6216\u8005\u7ba1\u7406\u8bf8\u5982\u6784\u5efa\u548c\u6d4b\u8bd5\u7cfb\u7edf\u4e4b\u7c7b\u7684\u5de5\u4f5c\u73af\u5883\u3002\u9664\u4e86\u6784\u5efa\u548c\u66f4\u6539\u57fa\u7840\u8bbe\u65bd\uff0cTerraform\u8fd8\u53ef\u4ee5\u5220\u9664\u548c\u91cd\u65b0\u521b\u5efa\u5df2\u7ba1\u7406\u7684\u57fa\u7840\u8bbe\u65bd\u3002<\/p>\n<h2>\u5220\u9664<\/h2>\n<p>\u6267\u884cterraform destroy\u53ef\u4ee5\u7ed3\u675fTerraform\u9879\u76ee\u4e2d\u7ba1\u7406\u7684\u8d44\u6e90\u3002\u6b64\u547d\u4ee4\u4e0eterraform apply\u5b8c\u5168\u76f8\u53cd\uff0c\u5b83\u4f1a\u7ec8\u6b62\u72b6\u6001\u6587\u4ef6\u4e2d\u6307\u5b9a\u7684\u6240\u6709\u8d44\u6e90\u3002\u6b64\u547d\u4ee4\u4e0d\u4f1a\u5220\u9664\u5728\u5176\u4ed6\u73af\u5883\u4e2d\u8fd0\u884c\u4e14\u672a\u5728\u5f53\u524dTerraform\u9879\u76ee\u4e2d\u7ba1\u7406\u7684\u8d44\u6e90\u3002<\/p>\n<p>\u8ba9\u6211\u4eec\u5c1d\u8bd5\u5220\u9664\u5df2\u521b\u5efa\u7684\u8d44\u6e90\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform destroy\r\nTerraform used the selected providers to generate the following execution plan.\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   aws_instance.app_server will be destroyed\r\n  - resource \"aws_instance\" \"app_server\" {\r\n      - ami                          = \"ami-08d70e59c07c61a3a\" -&gt; null\r\n      - arn                          = \"arn:aws:ec2:us-west-2:561656980159:instance\/i-0fd4a35969bd21710\" -&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:\r\n<\/code><\/pre>\n<p>\u884c\u982d\u7684 &#8221; &#8211; &#8221; \u8868\u793a\u8be5\u5b9e\u4f8b\u5c06\u88ab\u5220\u9664\u3002\u4e0e apply \u7c7b\u4f3c\uff0cTerraform \u5c06\u663e\u793a\u6267\u884c\u8ba1\u5212\uff0c\u5e76\u5728\u786e\u8ba4\u6d88\u606f\u540e\u8fdb\u884c\u4fee\u6539\u3002<\/p>\n<p>\u8bf7\u8f93\u5165\u201c\u662f\u201d\u4ee5\u7ee7\u7eed\u6267\u884c\u8be5\u8ba1\u5212\uff0c\u5e76\u5c1d\u8bd5\u5220\u9664\u57fa\u7840\u8bbe\u65bd\u3002<\/p>\n<pre class=\"post-pre\"><code>  Enter a value: yes\r\n\r\naws_instance.app_server: Destroying... [id=i-0fd4a35969bd21710]\r\naws_instance.app_server: Still destroying... [id=i-0fd4a35969bd21710, 10s elapsed]\r\naws_instance.app_server: Still destroying... [id=i-0fd4a35969bd21710, 20s elapsed]\r\naws_instance.app_server: Still destroying... [id=i-0fd4a35969bd21710, 30s elapsed]\r\naws_instance.app_server: Destruction complete after 31s\r\n\r\nDestroy complete! Resources: 1 destroyed.\r\n<\/code><\/pre>\n<p>\u4e0e\u6267\u884capply\u76f8\u540c\uff0cTerraform\u51b3\u5b9a\u5220\u9664\u8d44\u6e90\u7684\u987a\u5e8f\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0cTerraform\u786e\u8ba4\u6ca1\u6709\u4f9d\u8d56\u4e8e\u5355\u4e2a\u5b9e\u4f8b\uff0c\u5e76\u5220\u9664\u4e86\u8be5\u5b9e\u4f8b\u3002\u5728\u6d89\u53ca\u591a\u4e2a\u8d44\u6e90\u7684\u590d\u6742\u60c5\u51b5\u4e0b\uff0cTerraform\u5c06\u6839\u636e\u4f9d\u8d56\u5173\u7cfb\u4ee5\u9002\u5f53\u7684\u987a\u5e8f\u5220\u9664\u8d44\u6e90\u3002<\/p>\n<hr \/>\n<hr \/>\n<h1>\u5b9a\u4e49\u8f93\u5165\u53d8\u91cf<\/h1>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d84d5913a08637a6b74d5\/130-0.png\" alt=\"Terraform Video\" \/><\/div>\n<h2>\u6761\u4ef6\u5148\u51b3<\/h2>\n<p>\u4e00\u65e6\u5b8c\u6210\u6559\u7a0b\u5230\u8fd9\u4e00\u6b65\uff0c\u4f60\u4f1a\u5728\u4e00\u4e2a\u540d\u4e3a&#8221;learn-terraform-aws-instance&#8221;\u7684\u76ee\u5f55\u4e2d\u627e\u5230\u4e00\u4e2a\u540d\u4e3a&#8221;main.tf&#8221;\u7684\u6587\u4ef6\uff0c\u5185\u5bb9\u5982\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/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; 4.16\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"&gt;= 1.2.0\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<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\">\"us-west-2\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_instance\"<\/span> <span class=\"s2\">\"app_server\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">ami<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-08d70e59c07c61a3a\"<\/span>\r\n  <span class=\"nx\">instance_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"t2.micro\"<\/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\">\"ExampleAppServerInstance\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8bf7\u786e\u8ba4\u5728learn-terraform-aws-instance\u76ee\u5f55\u4e2d\u6267\u884c\u4e86terraform init\u547d\u4ee4\uff0c\u5e76\u4e14\u8bbe\u7f6e\u6587\u4ef6\u4e0e\u4e0a\u8ff0\u5185\u5bb9\u5339\u914d\u3002<\/p>\n<h2>\u6839\u636e\u53d8\u91cf\u8bbe\u5b9a\u5b9e\u4f8b\u540d<\/h2>\n<p>\u73b0\u5728\u7684\u8bbe\u7f6e\u4e2d\u6709\u786c\u7f16\u7801\u7684\u6570\u503c\u968f\u5904\u53ef\u89c1\u3002\u901a\u8fc7\u4f7f\u7528Terraform\u53d8\u91cf\uff0c\u53ef\u4ee5\u7f16\u5199\u7075\u6d3b\u4e14\u6613\u4e8e\u91cd\u7528\u7684\u8bbe\u7f6e\u3002<\/p>\n<p>\u6211\u4eec\u53ef\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u53d8\u91cf\uff0c\u5e76\u5b9a\u4e49\u5b9e\u4f8b\u540d\u79f0\u3002<\/p>\n<p>\u521b\u5efa\u4e00\u4e2a\u540d\u4e3avariables.tf\u7684\u6587\u4ef6\uff0c\u5e76\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u5b9a\u4e49instance_name\u53d8\u91cf\u7684\u533a\u5757\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"instance_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Value of the Name tag for the EC2 instance\"<\/span>\r\n  <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n  <span class=\"nx\">default<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"ExampleAppServerInstance\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<div>\u5728Terraform\u4e2d\uff0c\u5b83\u4f1a\u8bfb\u53d6\u5f53\u524d\u76ee\u5f55\u4e2d\u4ee5.tf\u7ed3\u5c3e\u7684\u6240\u6709\u6587\u4ef6\uff0c\u6240\u4ee5\u60a8\u53ef\u4ee5\u7ed9\u914d\u7f6e\u6587\u4ef6\u53d6\u4efb\u610f\u540d\u5b57\u3002<\/div>\n<p>\u8ba9\u6211\u4eec\u5728main.tf\u4e2d\u66f4\u65b0aws_instance\u8d44\u6e90\u5757\uff0c\u5c1d\u8bd5\u4f7f\u7528\u65b0\u53d8\u91cf\u3002\u901a\u8fc7\u6dfb\u52a0instance_name\u53d8\u91cf\u5757\uff0c\u5982\u679c\u672a\u58f0\u660e\u503c\uff0c\u5219instance_name\u5c06\u9ed8\u8ba4\u4e3a&#8221;ExampleAppServerInstance&#8221;\u3002<\/p>\n<pre class=\"post-pre\"><code> <span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_instance\"<\/span> <span class=\"s2\">\"app_server\"<\/span> <span class=\"p\">{<\/span>\r\n   <span class=\"nx\">ami<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-08d70e59c07c61a3a\"<\/span>\r\n   <span class=\"nx\">instance_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"t2.micro\"<\/span>\r\n\r\n   <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n<span class=\"hdl\"><span class=\"o\">- <\/span>   <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ExampleAppServerInstance\"<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>   <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">instance_name<\/span>\r\n<\/span>   <span class=\"p\">}<\/span>\r\n <span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u5e94\u7528\u8bbe\u7f6e<\/h2>\n<p>\u8bf7\u6267\u884c\u8bbe\u7f6e\u3002\u5728\u786e\u8ba4\u6d88\u606f\u4e2d\u56de\u7b54&#8221;\u662f&#8221;\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform apply\r\n\r\nTerraform used the selected providers to generate the following execution plan.\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   aws_instance.app_server will be created\r\n  + resource \"aws_instance\" \"app_server\" {\r\n      + ami                          = \"ami-08d70e59c07c61a3a\"\r\n      + arn                          = (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\naws_instance.app_server: Creating...\r\naws_instance.app_server: Still creating... [10s elapsed]\r\naws_instance.app_server: Still creating... [20s elapsed]\r\naws_instance.app_server: Still creating... [30s elapsed]\r\naws_instance.app_server: Still creating... [40s elapsed]\r\naws_instance.app_server: Creation complete after 50s [id=i-0bf954919ed765de1]\r\n\r\nApply complete! Resources: 1 added, 0 changed, 0 destroyed.\r\n<\/code><\/pre>\n<p>\u8ba9\u6211\u4eec\u518d\u6b21\u5e94\u7528\u8bbe\u7f6e\u3002\u8fd9\u6b21\u6211\u4eec\u5c06\u4f7f\u7528-var\u6807\u5fd7\u5c06\u503c\u4f20\u9012\u7ed9\u53d8\u91cf\uff0c\u5e76\u8986\u76d6\u9ed8\u8ba4\u7684\u5b9e\u4f8b\u540d\u79f0\u3002Terraform\u5c06\u628a\u5b9e\u4f8b\u7684\u540d\u79f0\u6807\u7b7e\u8986\u76d6\u4e3a\u65b0\u503c\u3002\u5728\u786e\u8ba4\u6d88\u606f\u4e2d\u56de\u7b54yes\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform apply -var \"instance_name=YetAnotherName\"\r\naws_instance.app_server: Refreshing state... [id=i-0bf954919ed765de1]\r\n\r\nTerraform used the selected providers to generate the following execution plan.\r\nResource actions are indicated with the following symbols:\r\n  ~ update in-place\r\n\r\nTerraform will perform the following actions:\r\n\r\n   aws_instance.app_server will be updated in-place\r\n  ~ resource \"aws_instance\" \"app_server\" {\r\n        id                           = \"i-0bf954919ed765de1\"\r\n      ~ tags                         = {\r\n          ~ \"Name\" = \"ExampleAppServerInstance\" -&gt; \"YetAnotherName\"\r\n        }\r\n         (26 unchanged attributes hidden)\r\n\r\n\r\n\r\n\r\n         (4 unchanged blocks hidden)\r\n    }\r\n\r\nPlan: 0 to add, 1 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\naws_instance.app_server: Modifying... [id=i-0bf954919ed765de1]\r\naws_instance.app_server: Modifications complete after 7s [id=i-0bf954919ed765de1]\r\n\r\nApply complete! Resources: 0 added, 1 changed, 0 destroyed.\r\n<\/code><\/pre>\n<p>\u5982\u679c\u5728\u547d\u4ee4\u884c\u4e2d\u8bbe\u7f6e\u53d8\u91cf\uff0c\u8be5\u503c\u4e0d\u4f1a\u88ab\u4fdd\u5b58\u3002Terraform\u652f\u6301\u591a\u79cd\u65b9\u6cd5\u6765\u4f7f\u7528\u548c\u8bbe\u7f6e\u53d8\u91cf\uff0c\u53ef\u4ee5\u5728\u6267\u884c\u547d\u4ee4\u65f6\u7701\u53bb\u91cd\u590d\u8f93\u5165\u76f8\u540c\u503c\u7684\u9ebb\u70e6\u3002\u6709\u5173\u8be6\u60c5\uff0c\u8bf7\u53c2\u9605\u66f4\u8be6\u7ec6\u7684\u6559\u7a0b&#8221;\u4f7f\u7528\u53d8\u91cf\u81ea\u5b9a\u4e49\u914d\u7f6e&#8221;\u3002<\/p>\n<hr \/>\n<hr \/>\n<h1>\u67e5\u8be2\u6570\u636e\u7684\u8f93\u51fa<\/h1>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d84d5913a08637a6b74d5\/152-0.png\" alt=\"Terraform Video\" \/><\/div>\n<p>\u5982\u679c\u60a8\u8fd8\u6ca1\u6709\u5b8c\u6210\u524d\u4e00\u4e2a\u8f93\u5165\u53d8\u91cf\u7684\u5b9a\u4e49\uff0c\u8bf7\u5148\u5b8c\u6210\u5b83\u3002<\/p>\n<h2>\u6700\u521d\u7684\u8bbe\u7f6e<\/h2>\n<p>\u7531\u4e8e\u5df2\u7ecf\u5b8c\u6210\u4e86\u4e0a\u4e00\u6b21\u7684\u6559\u7a0b\u5b9e\u8df5\uff0c\u73b0\u5728\u6709\u4e00\u4e2a\u540d\u4e3alearn-terraform-aws-instance\u7684\u76ee\u5f55\uff0c\u5176\u4e2d\u5e94\u8be5\u5305\u542b\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/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; 4.16\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"&gt;= 1.2.0\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<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\">\"us-west-2\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_instance\"<\/span> <span class=\"s2\">\"app_server\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">ami<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-08d70e59c07c61a3a\"<\/span>\r\n  <span class=\"nx\">instance_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"t2.micro\"<\/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=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">instance_name<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"instance_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Value of the Name tag for the EC2 instance\"<\/span>\r\n  <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n  <span class=\"nx\">default<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"ExampleAppServerInstance\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8bf7\u786e\u8ba4\u60a8\u7684\u8bbe\u7f6e\u4e0e\u4e0a\u8ff0\u8bbe\u7f6e\u4e00\u81f4\uff0c\u5e76\u4e14\u5df2\u7ecf\u5728learn-terraform-aws-instance\u76ee\u5f55\u4e2d\u5b8c\u6210\u4e86\u521d\u59cb\u5316\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform init\r\n<\/code><\/pre>\n<p>\u5728\u7ee7\u7eed\u524d\u8fdb\u4e4b\u524d\uff0c\u8bf7\u5e94\u7528\u8bbe\u7f6e\u3002\u5728\u786e\u8ba4\u6d88\u606f\u4e2d\uff0c\u56de\u7b54\u201c\u662f\u201d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform apply\r\n<\/code><\/pre>\n<h2>\u8f93\u51faEC2\u5b9e\u4f8b\u7684\u914d\u7f6e<\/h2>\n<p>\u8ba9\u6211\u4eec\u5728learn-terraform-aws-instance\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u540d\u4e3aoutputs.tf\u7684\u6587\u4ef6\u3002<\/p>\n<p>\u8b93\u6211\u5011\u5beb\u5165\u4ee5\u4e0b\u8a2d\u5b9a\u4e26\u5b9a\u7fa9 EC2 \u5be6\u4f8b\u7684 ID \u548c IP \u8f38\u51fa\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">output<\/span> <span class=\"s2\">\"instance_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ID of the EC2 instance\"<\/span>\r\n  <span class=\"nx\">value<\/span>       <span class=\"p\">=<\/span> <span class=\"nx\">aws_instance<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_server<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"instance_public_ip\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Public IP address of the EC2 instance\"<\/span>\r\n  <span class=\"nx\">value<\/span>       <span class=\"p\">=<\/span> <span class=\"nx\">aws_instance<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_server<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_ip<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u9a8c\u8bc1\u8f93\u51fa\u503c<\/h2>\n<p>\u8bf7\u5e94\u7528\u6b64\u914d\u7f6e\u3002\u8fd9\u6837\uff0c\u60a8\u5c31\u53ef\u4ee5\u4f7f\u7528\u8fd9\u4e2a\u8f93\u51fa\u503c\u4e86\u3002\u8ba9\u6211\u4eec\u8bd5\u7740\u5e94\u7528\u8bbe\u7f6e\u3002\u8bf7\u5728\u786e\u8ba4\u6d88\u606f\u4e0a\u56de\u7b54\u201c\u662f\u201d\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform apply\r\naws_instance.app_server: Refreshing state... [id=i-0bf954919ed765de1]\r\n\r\nChanges to Outputs:\r\n  + instance_id        = \"i-0bf954919ed765de1\"\r\n  + instance_public_ip = \"54.186.202.254\"\r\n\r\nYou can apply this plan to save these new output values to the Terraform state,\r\nwithout changing any real infrastructure.\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\n\r\nApply complete! Resources: 0 added, 0 changed, 0 destroyed.\r\n\r\nOutputs:\r\n\r\ninstance_id = \"i-0bf954919ed765de1\"\r\ninstance_public_ip = \"54.186.202.254\"\r\n<\/code><\/pre>\n<p>\u5f53\u5e94\u7528\u8bbe\u7f6e\u540e\uff0c\u5c06\u663e\u793aOutput\u503c\u3002\u53ef\u4ee5\u6267\u884cterraform output\u6765\u67e5\u8be2\u6b64Output\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform output\r\ninstance_id = \"i-0bf954919ed765de1\"\r\ninstance_public_ip = \"54.186.202.254\"\r\n<\/code><\/pre>\n<p>\u60a8\u53ef\u4ee5\u4f7f\u7528Terraform\u7684Output\u529f\u80fd\uff0c\u5c06\u5f53\u524d\u7684Terraform\u9879\u76ee\u4e0e\u57fa\u7840\u8bbe\u65bd\u7684\u5176\u4ed6\u90e8\u5206\u6216\u5176\u4ed6Terraform\u9879\u76ee\u5173\u8054\u8d77\u6765\u3002\u8981\u4e86\u89e3\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u66f4\u8be6\u7ec6\u7684\u6559\u7a0b\u201c\u4eceTerraform\u8f93\u51fa\u6570\u636e\u201d\u3002<\/p>\n<h2>\u57fa\u7840\u8bbe\u65bd\u7684\u5220\u9664<\/h2>\n<div>\u5982\u679c\u4f60\u6253\u7b97\u7ee7\u7eed\u5b9e\u8df5\u63a5\u4e0b\u6765\u7684\u6559\u7a0b\uff0c\u53ef\u4ee5\u8df3\u8fc7\u4ee5\u4e0b\u5220\u9664\u90e8\u5206\u3002<\/div>\n<p>\u5220\u4e86\u57fa\u7840\u8bbe\u65bd\u3002\u786e\u8ba4\u6d88\u606f\u56de\u7b54yes\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform destroy\r\n\r\nTerraform used the selected providers to generate the following execution plan.\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   aws_instance.app_server will be destroyed\r\n  - resource \"aws_instance\" \"app_server\" {\r\n      - ami                          = \"ami-08d70e59c07c61a3a\" -&gt; null\r\n      - arn                          = \"arn:aws:ec2:us-west-2:561656980159:instance\/i-0bf954919ed765de1\" -&gt; null\r\n##...\r\n\r\nPlan: 0 to add, 0 to change, 1 to destroy.\r\n\r\nChanges to Outputs:\r\n  - instance_id        = \"i-0bf954919ed765de1\" -&gt; null\r\n  - instance_public_ip = \"54.186.202.254\" -&gt; null\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\naws_instance.app_server: Destroying... [id=i-0bf954919ed765de1]\r\naws_instance.app_server: Still destroying... [id=i-0bf954919ed765de1, 10s elapsed]\r\naws_instance.app_server: Still destroying... [id=i-0bf954919ed765de1, 20s elapsed]\r\naws_instance.app_server: Still destroying... [id=i-0bf954919ed765de1, 30s elapsed]\r\naws_instance.app_server: Destruction complete after 31s\r\n\r\nDestroy complete! Resources: 1 destroyed.\r\n<\/code><\/pre>\n<hr \/>\n<hr \/>\n<h1>\u5c06\u72b6\u6001\u8fdc\u7a0b\u4fdd\u5b58\u8d77\u6765<\/h1>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d84d5913a08637a6b74d5\/179-0.png\" alt=\"Terraform Video\" \/><\/div>\n<p>\u4f7f\u7528Terraform Cloud\uff0c\u56e2\u961f\u5185\u53ef\u4ee5\u8f7b\u677e\u8fdb\u884c\u7248\u672c\u7ba1\u7406\u3001\u57fa\u7840\u8bbe\u65bd\u76d1\u63a7\u548c\u57fa\u7840\u8bbe\u5907\u4e0a\u7684\u534f\u540c\u5de5\u4f5c\u3002\u6b64\u5916\uff0c\u53ef\u4ee5\u5b89\u5168\u5b58\u50a8API\u4ee4\u724c\u548c\u8bbf\u95ee\u5bc6\u94a5\u7b49\u53d8\u91cf\uff0c\u83b7\u53d6\u7528\u4e8e\u957f\u65f6\u95f4\u8fd0\u884cTerraform\u8fdb\u7a0b\u7684\u5b89\u5168\u7a33\u5b9a\u73af\u5883\u3002<\/p>\n<p>\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u6211\u4eec\u5c06\u628aTerraform\u7684\u72b6\u6001\u8fc1\u79fb\u5230Terraform Cloud\u3002<\/p>\n<h2>\u524d\u63d0\u6761\u4ef6 &#8211; premise\/constraint\/assumption<\/h2>\n<p>\u5047\u8bbe\u60a8\u5df2\u7ecf\u5b8c\u6210\u4e86\u4e0a\u4e00\u7bc7\u6559\u7a0b\uff0c\u672c\u6559\u7a0b\u662f\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7684\u3002\u5982\u679c\u60a8\u8fd8\u6ca1\u6709\u5b8c\u6210\u4e0a\u4e00\u7bc7\u6559\u7a0b\uff0c\u8bf7\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a&#8221;learn-terraform-aws-instance&#8221;\u7684\u76ee\u5f55\uff0c\u5e76\u5c06\u4e0b\u9762\u7684\u4ee3\u7801\u4fdd\u5b58\u4e3a&#8221;main.tf&#8221;\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/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; 4.16\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"&gt;= 1.2.0\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<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\">\"us-west-2\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_instance\"<\/span> <span class=\"s2\">\"app_server\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">ami<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-08d70e59c07c61a3a\"<\/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>\u6267\u884cterraform init\u547d\u4ee4\uff0c\u521d\u59cb\u5316\u5de5\u4f5c\u76ee\u5f55\u5e76\u4e0b\u8f7d\u6240\u9700\u7684\u63d0\u4f9b\u5546\u3002\u5373\u4f7f\u8be5\u76ee\u5f55\u5df2\u7ecf\u88ab\u521d\u59cb\u5316\u8fc7\uff0c\u518d\u6b21\u6267\u884cterraform init\u4e5f\u6ca1\u6709\u95ee\u9898\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform init\r\nInitializing the backend...\r\n\r\nInitializing provider plugins...\r\n- Finding hashicorp\/aws versions matching \"~&gt; 4.16\"...\r\n- Installing hashicorp\/aws v4.27.0...\r\n- Installed hashicorp\/aws v4.27.0 (signed by HashiCorp)\r\n\r\nTerraform has created a lock file .terraform.lock.hcl to record the provider\r\nselections it made above. Include this file in your version control repository\r\nso that Terraform can guarantee to make the same selections by default when\r\nyou run \"terraform init\" in the future.\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>\u8bf7\u63a5\u53d7\u4e0b\u9762\u7684\u8bbe\u5b9a\u3002\u8981\u63a5\u53d7\u66f4\u6539\uff0c\u8bf7\u8f93\u5165\u201c\u662f\u201d\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform apply\r\nTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the\r\nfollowing symbols:\r\n  + create\r\n\r\nTerraform will perform the following actions:\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\nApply complete! Resources: 1 added, 0 changed, 0 destroyed.\r\n<\/code><\/pre>\n<p>Terraform\u7528\u4e8e\u8bbe\u7f6eAWS EC2\u5b9e\u4f8b\u5e76\u5c06\u4e0e\u8d44\u6e90\u76f8\u5173\u7684\u6570\u636e\u5b58\u50a8\u5728\u672c\u5730\u72b6\u6001\u6587\u4ef6\u4e2d\u3002<\/p>\n<h2>\u8bbe\u7f6eTerraform Cloud\u3002<\/h2>\n<p>\u5982\u679c\u60a8\u5df2\u7ecf\u62e5\u6709 HashiCorp Cloud Platform \u6216 Terraform Cloud \u7684\u8d26\u6237\uff0c\u8bf7\u4f7f\u7528\u8fd9\u4e9b\u8ba4\u8bc1\u4fe1\u606f\u8fdb\u884c\u767b\u5f55\u3002\u6709\u5173\u6ce8\u518c\u548c\u521b\u5efa\u7ec4\u7ec7\u7684\u8be6\u7ec6\u65b9\u6cd5\uff0c\u8bf7\u53c2\u9605 Terraform Cloud \u6ce8\u518c\u6559\u7a0b\u3002<\/p>\n<p>\u7136\u540e\uff0c\u5728main.tf\u6587\u4ef6\u4e2d\u8fdb\u884c\u66f4\u6539\u3002 \u5728Terraform\u914d\u7f6e\u4e2d\u6dfb\u52a0\u4e00\u4e2acloud\u5757\uff0c\u5e76\u5c06organization-name\u66ff\u6362\u4e3a\u81ea\u5df1\u7684\u7ec4\u7ec7\u540d\u79f0\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/span>\r\n<span class=\"hil\"><span class=\"o\">+ <\/span>  <span class=\"nx\">cloud<\/span> <span class=\"p\">{<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>    <span class=\"nx\">organization<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"organization-name\"<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>    <span class=\"nx\">workspaces<\/span> <span class=\"p\">{<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>      <span class=\"nx\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"learn-tfc-aws\"<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>    <span class=\"p\">}<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>  <span class=\"p\">}<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+<\/span>\r\n<\/span>  <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; 4.16\"<\/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>\u5728\u65e7\u7248\u672c\u7684Terraform\u4e2d\u4e0d\u652f\u6301cloud\u6a21\u5757\u3002\u56e0\u6b64\uff0c\u8981\u7ee7\u7eed\u8fdb\u884c\u672c\u6559\u7a0b\uff0cTerraform\u7684\u7248\u672c\u5fc5\u987b\u4e3a1.1.0\u6216\u66f4\u9ad8\u3002\u57281.1.0\u4e4b\u524d\u7684\u7248\u672c\u4e2d\uff0c\u53ef\u4ee5\u4f7f\u7528remote backend\u6a21\u5757\u6765\u8bbe\u7f6eCLI\u7684\u5de5\u4f5c\u6d41\u5e76\u8fdb\u884c\u72b6\u6001\u8fc1\u79fb\u3002<\/div>\n<h2>\u767b\u5f55Terraform Cloud<\/h2>\n<p>\u4e0b\u4e00\u6b65\uff0c\u8ba9\u6211\u4eec\u4f7f\u7528\u7ec8\u7aef\u5e76\u4f7f\u7528Terraform CLI\u5c1d\u8bd5\u767b\u5f55Terraform Cloud\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform login\r\nTerraform will request an API token for app.terraform.io using your browser.\r\n\r\nIf login is successful, Terraform will store the token in plain text in\r\nthe following file for use by subsequent commands:\r\n    \/Users\/&lt;USER&gt;\/.terraform.d\/credentials.tfrc.json\r\n\r\nDo you want to proceed?\r\n  Only 'yes' will be accepted to confirm.\r\n\r\n  Enter a value:\r\n<\/code><\/pre>\n<p>\u5982\u679c\u60a8\u56de\u7b54\u786e\u8ba4\u6d88\u606f\u4e3a\u201c\u662f\u201d\uff0c\u6d4f\u89c8\u5668\u5c06\u81ea\u52a8\u6253\u5f00\uff0c\u8bf7\u6309\u7167\u6307\u793a\u8fdb\u884c\u64cd\u4f5c\u3002\u5982\u679c\u9700\u8981\u8f93\u5165\uff0c\u8bf7\u5c06\u751f\u6210\u7684API\u5bc6\u94a5\u7c98\u8d34\u5230\u7ec8\u7aef\u4e2d\u3002\u5982\u9700\u4e86\u89e3\u6709\u5173\u767b\u5f55\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605Terraform Cloud\u4e0aCLI\u7684\u8eab\u4efd\u9a8c\u8bc1\u3002<\/p>\n<h2>\u8fdb\u884cTerraform\u7684\u521d\u59cb\u5316\u3002<\/h2>\n<p>\u56e0\u4e3a\u5df2\u7ecf\u914d\u7f6e\u4e86\u548c Terraform Cloud \u7684\u96c6\u6210\uff0c\u6240\u4ee5\u53ef\u4ee5\u6267\u884c terraform init \u547d\u4ee4\uff0c\u91cd\u65b0\u521d\u59cb\u5316\u8bbe\u7f6e\u5e76\u5c06\u72b6\u6001\u6587\u4ef6\u8fc1\u79fb\u5230 Terraform Cloud \u4e0a\u3002\u5982\u679c\u51fa\u73b0\u8fc1\u79fb\u786e\u8ba4\u6d88\u606f\uff0c\u8f93\u5165\u201cyes\u201d\u5373\u53ef\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform init\r\n\r\nInitializing Terraform Cloud...\r\nDo you wish to proceed?\r\n  As part of migrating to Terraform Cloud, Terraform can optionally copy your\r\n  current workspace state to the configured Terraform Cloud workspace.\r\n\r\n  Answer \"yes\" to copy the latest state snapshot to the configured\r\n  Terraform Cloud workspace.\r\n\r\n  Answer \"no\" to ignore the existing state and just activate the configured\r\n  Terraform Cloud workspace with its existing state, if any.\r\n\r\n  Should Terraform migrate your existing state?\r\n\r\n  Enter a value: yes\r\n\r\n\r\nInitializing provider plugins...\r\n- Reusing previous version of hashicorp\/aws from the dependency lock file\r\n- Using previously-installed hashicorp\/aws v4.17.0\r\n\r\nTerraform Cloud has been successfully initialized!\r\n\r\nYou may now begin working with Terraform Cloud. Try running \"terraform plan\" to\r\nsee any changes that are required for your infrastructure.\r\n\r\nIf you ever set or change modules or Terraform Settings, run \"terraform init\"\r\nagain to reinitialize your working directory.\r\n<\/code><\/pre>\n<p>\u72b6\u614b\u30d5\u30a1\u30a4\u30eb\u5df2\u7ecf\u8fc1\u79fb\u5230Terraform Cloud\u4e0a\u4e86\uff0c\u8bf7\u5220\u9664\u672c\u5730\u7684\u72b6\u6001\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">rm <\/span>terraform.tfstate\r\n<\/code><\/pre>\n<p>\u5982\u679c\u60a8\u60f3\u4f7f\u7528CLI\u4eceTerraform Cloud\u64cd\u4f5c\uff0c\u53ef\u4ee5\u9009\u62e9\u4f7fTerraform\u5728\u8fdc\u7a0b\u8fd0\u884c\u6216\u5728\u672c\u5730\u8fd0\u884c\u3002\u5982\u679c\u9009\u62e9\u5728\u672c\u5730\u8fd0\u884c\uff0c\u5219Terraform Cloud\u4f1a\u6267\u884c\u672c\u5730\u673a\u5668\u4e0a\u7684Terraform\uff0c\u5e76\u5c06\u72b6\u6001\u6587\u4ef6\u5b58\u50a8\u5728Terraform Cloud\u7684\u8fdc\u7a0b\u4f4d\u7f6e\u3002\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u8fdc\u7a0b\u6267\u884c\u6a21\u5f0f\u3002<\/p>\n<h2>\u8bbe\u7f6e\u5de5\u4f5c\u533a\u53d8\u91cf<\/h2>\n<p>\u6267\u884cterraform init\u547d\u4ee4\u540e\uff0c\u5c06\u5728Terraform Cloud\u7684Organization\u5185\u521b\u5efa\u4e00\u4e2a\u540d\u4e3alearn-tfc-aws\u7684\u5de5\u4f5c\u533a\u3002\u8981\u5bf9AWS\u63d0\u4f9b\u7a0b\u5e8f\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\uff0c\u8bf7\u4f7f\u7528\u60a8\u81ea\u5df1\u7684\u8ba4\u8bc1\u4fe1\u606f\u914d\u7f6e\u5de5\u4f5c\u533a\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d84d5913a08637a6b74d5\/207-0.png\" alt=\"image.png\" \/><\/div>\n<h2>\u61c9\u7528\u8a2d\u7f6e<\/h2>\n<p>\u8ba9\u6211\u4eec\u6267\u884c`terraform apply`\u6765\u8fd0\u884cTerraform Cloud\u3002\u5e94\u8be5\u4f1a\u663e\u793a\u6ca1\u6709\u8fdb\u884c\u4efb\u4f55\u66f4\u6539\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform apply\r\n\r\n## ...\r\nNo changes. Your infrastructure matches the configuration.\r\n\r\nTerraform has compared your real infrastructure against your configuration\r\nand found no differences, so no changes are needed.\r\n\r\n------------------------------------------------------------------------ \r\n<\/code><\/pre>\n<p>\u8fd9\u610f\u5473\u7740\u5f53\u524d\u8bbe\u7f6e\u4e0e\u5b9e\u9645\u5b58\u5728\u7684\u7269\u7406\u8d44\u6e90\u4e4b\u95f4\u5b8c\u5168\u6ca1\u6709\u5dee\u5f02\u3002\u56e0\u6b64\uff0c\u4e0d\u9700\u8981\u6267\u884c\u4efb\u4f55\u64cd\u4f5c\u3002<\/p>\n<p>\u8fd9\u6837\u505a\u53ef\u4ee5\u5c06\u72b6\u6001\u5b58\u50a8\u5728Terraform Cloud\u4e0a\u3002\u901a\u8fc7\u5c06\u72b6\u6001\u5b58\u50a8\u5728\u8fdc\u7a0b\u4f4d\u7f6e\uff0c\u53ef\u4ee5\u66f4\u5bb9\u6613\u5730\u8fdb\u884c\u534f\u4f5c\uff0c\u5e76\u5c06\u72b6\u6001\u6587\u4ef6\u548c\u673a\u5bc6\u4fe1\u606f\u4e0e\u672c\u5730\u786c\u76d8\u5206\u79bb\u3002\u8fdc\u7a0b\u72b6\u6001\u53ea\u5728\u4f7f\u7528\u65f6\u88ab\u52a0\u8f7d\u5230\u5185\u5b58\u4e2d\u3002<\/p>\n<h2>\u5220\u9664\u57fa\u7840\u8bbe\u65bd<\/h2>\n<p>\u4e0d\u8981\u5fd8\u8bb0\u6267\u884cterraform destroy\u547d\u4ee4\u6765\u5220\u9664\u5728\u672c\u6559\u7a0b\u4e2d\u521b\u5efa\u7684\u8d44\u6e90\u3002terraform destroy\u547d\u4ee4\u5c06\u5728Terraform Cloud\u4e0a\u6267\u884c\uff0c\u5e76\u5c06\u7ed3\u679c\u8f93\u51fa\u5230\u7ec8\u7aef\u4e0a\u3002\u5f53\u786e\u8ba4\u6d88\u606f\u663e\u793a\u65f6\uff0c\u8bf7\u8f93\u5165yes\u3002\u60a8\u4e5f\u53ef\u4ee5\u901a\u8fc7Terraform Cloud\u7684Web UI\u8bbf\u95ee\u81ea\u5df1\u7684\u5de5\u4f5c\u7a7a\u95f4\u5e76\u786e\u8ba4\u6267\u884c\u60c5\u51b5\u4ee5\u786e\u4fdd\u64cd\u4f5c\u6b63\u786e\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform destroy\r\nRunning apply in Terraform Cloud. Output will stream here. Pressing Ctrl-C\r\nwill cancel the remote apply if it's still pending. If the apply started it\r\nwill stop streaming the logs, but will not stop the apply running remotely.\r\n\r\nPreparing the remote apply...\r\n\r\nTo view this run in a browser, visit:\r\nhttps:\/\/app.terraform.io\/app\/hashicorp-training\/learn-tfc-aws\/runs\/run-kovFzCiUSrbMP3sD\r\n\r\nWaiting for the plan to start...\r\n\r\nTerraform v1.2.0\r\non linux_amd64\r\nInitializing Terraform configuration...\r\naws_instance.app_server: Refreshing state... [id=i-0e756c00e19ec8f6b]\r\n\r\nTerraform used the selected providers to generate the following execution\r\nplan. Resource actions are indicated with the following symbols:\r\n  - destroy\r\n\r\nTerraform will perform the following actions:\r\n\r\n  # aws_instance.app_server will be destroyed\r\n##...\r\nApply complete! Resources: 0 added, 0 changed, 1 destroyed.\r\n<\/code><\/pre>\n<h2>\u4e0b\u4e00\u6b65<\/h2>\n<p>\u73b0\u5728Terraform\u5165\u95e8\u6307\u5357\u7ed3\u675f\u4e86\u3002\u60a8\u5df2\u7ecf\u5b66\u4f1a\u4f7f\u7528Terraform\u521b\u5efa\u548c\u7ba1\u7406\u57fa\u7840\u67b6\u6784\u3002<\/p>\n<p>\u8bf7\u53c2\u9605\u4ee5\u4e0b\u7684\u6559\u7a0b\uff0c\u4e86\u89e3\u6709\u5173Terraform\u7684\u914d\u7f6e\u8bed\u8a00\u3001\u8d44\u6e90\u8bbe\u7f6e\u4ee5\u53ca\u73b0\u6709\u57fa\u7840\u67b6\u6784\u5bfc\u5165\u7b49\u5b9e\u8df5\u6280\u5de7\u3002<\/p>\n<p>\u8a2d\u5b9a\u8a00\u8a9e &#8211; \u5909\u6570\u3084Output\u3001\u4f9d\u5b58\u95a2\u4fc2\u3001\u30e1\u30bf\u5f15\u6570\u306a\u3069\u8a2d\u5b9a\u8a00\u8a9e\u306e\u4ed6\u306e\u7279\u5fb4\u306b\u6163\u308c\u3066\u3088\u308a\u6d17\u7df4\u3055\u308c\u305fTerraform\u306e\u8a2d\u5b9a\u3092\u66f8\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>\u30e2\u30b8\u30e5\u30fc\u30eb &#8211; \u30e2\u30b8\u30e5\u30fc\u30eb\u3067Terraform\u306e\u8a2d\u5b9a\u3092\u6574\u7406\u3057\u3066\u518d\u5229\u7528\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7 &#8211; Packer\u3084Cloud-init\u3092\u4f7f\u3063\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u81ea\u52d5\u3067SSH\u30ad\u30fc\u3068\u30a6\u30a7\u30d6\u30fb\u30b5\u30fc\u30d0\u3092Terraform\u3067AWS\u306b\u4f5c\u6210\u3057\u305fLinux VM\u4e0a\u306b\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u30a4\u30f3\u30dd\u30fc\u30c8 &#8211; \u65e2\u5b58\u306e\u30a4\u30f3\u30d5\u30e9\u3092Terraform\u306b\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>\u8bf7\u67e5\u9605Terraform\u6587\u6863\u4ee5\u83b7\u53d6\u6709\u5173\u53ef\u7528\u8bbe\u7f6e\u9009\u9879\u7684\u8be6\u7ec6\u4fe1\u606f\u3002<\/p>\n<h2>\u8981\u6df1\u5165\u4e86\u89e3Terraform Cloud\uff0c\u8bf7\u53c2\u8003\u4ee5\u4e0b\u5185\u5bb9\u3002<\/h2>\n<p>Terraform\u53ef\u4ee5\u5b58\u50a8\u72b6\u6001\u5e76\u652f\u6301\u5728\u672c\u5730\u6267\u884cTerraform\uff0c\u4f46\u5f53\u7528\u4f5c\u8fdc\u7a0b\u6267\u884c\u73af\u5883\u65f6\u624d\u80fd\u53d1\u6325\u5176\u771f\u6b63\u4ef7\u503c\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">VCS\u65b9\u5f0f\u3002VCS\u306b\u5909\u66f4\u304c\u30b3\u30df\u30c3\u30c8\u3055\u308c\u308b\u5ea6\u306b\u81ea\u52d5\u3067\u8a08\u753b\u304c\u30ad\u30e5\u30fc\u306b\u5165\u308c\u3089\u308c\u307e\u3059\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">API\u65b9\u5f0f\u3002CI\u306a\u3069\u306e\u81ea\u52d5\u5316\u3055\u308c\u305f\u30c4\u30fc\u30eb\u304c\u8a2d\u5b9a\u3092\u76f4\u63a5\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3057\u307e\u3059\u3002<\/ul>\n<p>\u5173\u4e8eVCS(Versions Control System)\u65b9\u5f0f\u7684\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u8bf7\u53c2\u9605Terraform Cloud\u7684\u5165\u95e8\u6307\u5357\u3002Terraform Cloud\u8fd8\u63d0\u4f9b\u5546\u4e1a\u89e3\u51b3\u65b9\u6848\uff0c\u5305\u62ec\u56e2\u961f\u5185\u6743\u9650\u7ba1\u7406\u3001\u7b56\u7565\u6267\u884c\u548c\u4e1a\u52a1\u4ee3\u7406\u7b49\u529f\u80fd\u3002<\/p>\n<section>\u7531\u4e8e\u4e0e\u539f\u7f51\u7ad9\u7684\u7528\u6237\u754c\u9762\u5b58\u5728\u5dee\u5f02\uff0c\u65e0\u6cd5\u5b8c\u5168\u6309\u7167\u539f\u7f51\u7ad9\u7684\u6837\u5f0f\u6765\u91cd\u65b0\u5448\u73b0\u3002\u8bf7\u8c05\u89e3\u3002\u53e6\u5916\uff0c\u4e00\u7cfb\u5217\u6587\u7ae0\u6807\u9898\u4e2d\u7684\u3010\u25cb\u25cb\u7bc7\u3011\u662f\u8bd1\u8005\u6839\u636e\u65b9\u4fbf\u8d77\u89c1\u6dfb\u52a0\u7684\u3002\u21a9\u5728\u7279\u5b9a\u6587\u8109\u4e4b\u5916\uff0c\u201cinfrastructure\u201d\u4e00\u5f8b\u7ffb\u8bd1\u4e3a\u201c\u57fa\u7840\u8bbe\u65bd\u201d\u3002\u21a9<\/p>\n<p>\u51c6\u786e\u5730\u8bf4\uff0c&#8221;+&#8221;\u548c&#8221;-&#8220;\u5c06\u66ff\u6362\u4e3a&#8221;\u52a0&#8221;\u548c&#8221;\u51cf&#8221;\u3002\u21a9<\/p>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u662fTerraform\u516c\u5f0f\u6559\u7a0b\u7684\u65e5\u6587\u7ffb\u8bd1\u3002 \u8fd9\u662f\u4e00\u4e2a\u53ef\u4ee5\u901a\u8fc7\u5b9e\u9645\u64cd\u4f5c\u8fdb\u884c\u5b66\u4e60\u7684\u6559\u7a0b\u3002 \u5728\u3010AWS\u7bc7\u3011\u4e2d\uff0c\u6211\u4eec\u5c06 [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48404","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>\u3010AWS\u7f16\u3011Terraform\u5b98\u65b9\u6559\u7a0b\u3010\u4e2d\u6587\u7ffb\u8bd1\u3011 - 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\/\u3010aws\u7f16\u3011terraform\u5b98\u65b9\u6559\u7a0b\u3010\u4e2d\u6587\u7ffb\u8bd1\u3011\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u3010AWS\u7f16\u3011Terraform\u5b98\u65b9\u6559\u7a0b\u3010\u4e2d\u6587\u7ffb\u8bd1\u3011\" \/>\n<meta property=\"og:description\" content=\"\u8fd9\u662fTerraform\u516c\u5f0f\u6559\u7a0b\u7684\u65e5\u6587\u7ffb\u8bd1\u3002 \u8fd9\u662f\u4e00\u4e2a\u53ef\u4ee5\u901a\u8fc7\u5b9e\u9645\u64cd\u4f5c\u8fdb\u884c\u5b66\u4e60\u7684\u6559\u7a0b\u3002 \u5728\u3010AWS\u7bc7\u3011\u4e2d\uff0c\u6211\u4eec\u5c06 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u3010aws\u7f16\u3011terraform\u5b98\u65b9\u6559\u7a0b\u3010\u4e2d\u6587\u7ffb\u8bd1\u3011\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-02T06:22:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-28T18:01:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d84d5913a08637a6b74d5\/7-0.png\" \/>\n<meta name=\"author\" content=\"\u9038, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u9038, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 \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\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/\",\"name\":\"\u3010AWS\u7f16\u3011Terraform\u5b98\u65b9\u6559\u7a0b\u3010\u4e2d\u6587\u7ffb\u8bd1\u3011 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2024-02-02T06:22:27+00:00\",\"dateModified\":\"2024-04-28T18:01:06+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u3010AWS\u7f16\u3011Terraform\u5b98\u65b9\u6559\u7a0b\u3010\u4e2d\u6587\u7ffb\u8bd1\u3011\"}]},{\"@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\/85c1dae56e6ea1e695c73d33c684d487\",\"name\":\"\u9038, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"caption\":\"\u9038, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u3010AWS\u7f16\u3011Terraform\u5b98\u65b9\u6559\u7a0b\u3010\u4e2d\u6587\u7ffb\u8bd1\u3011 - 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\/\u3010aws\u7f16\u3011terraform\u5b98\u65b9\u6559\u7a0b\u3010\u4e2d\u6587\u7ffb\u8bd1\u3011\/","og_locale":"zh_CN","og_type":"article","og_title":"\u3010AWS\u7f16\u3011Terraform\u5b98\u65b9\u6559\u7a0b\u3010\u4e2d\u6587\u7ffb\u8bd1\u3011","og_description":"\u8fd9\u662fTerraform\u516c\u5f0f\u6559\u7a0b\u7684\u65e5\u6587\u7ffb\u8bd1\u3002 \u8fd9\u662f\u4e00\u4e2a\u53ef\u4ee5\u901a\u8fc7\u5b9e\u9645\u64cd\u4f5c\u8fdb\u884c\u5b66\u4e60\u7684\u6559\u7a0b\u3002 \u5728\u3010AWS\u7bc7\u3011\u4e2d\uff0c\u6211\u4eec\u5c06 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u3010aws\u7f16\u3011terraform\u5b98\u65b9\u6559\u7a0b\u3010\u4e2d\u6587\u7ffb\u8bd1\u3011\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2024-02-02T06:22:27+00:00","article_modified_time":"2024-04-28T18:01:06+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d84d5913a08637a6b74d5\/7-0.png"}],"author":"\u9038, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u9038, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"14 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/","name":"\u3010AWS\u7f16\u3011Terraform\u5b98\u65b9\u6559\u7a0b\u3010\u4e2d\u6587\u7ffb\u8bd1\u3011 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2024-02-02T06:22:27+00:00","dateModified":"2024-04-28T18:01:06+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u3010AWS\u7f16\u3011Terraform\u5b98\u65b9\u6559\u7a0b\u3010\u4e2d\u6587\u7ffb\u8bd1\u3011"}]},{"@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\/85c1dae56e6ea1e695c73d33c684d487","name":"\u9038, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","caption":"\u9038, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e3%80%90aws%e7%bc%96%e3%80%91terraform%e5%ae%98%e6%96%b9%e6%95%99%e7%a8%8b%e3%80%90%e4%b8%ad%e6%96%87%e7%bf%bb%e8%af%91%e3%80%91\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48404","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\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48404"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48404\/revisions"}],"predecessor-version":[{"id":73514,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48404\/revisions\/73514"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}