{"id":48722,"date":"2023-02-01T03:45:25","date_gmt":"2023-12-29T12:58:36","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/"},"modified":"2024-04-29T12:30:41","modified_gmt":"2024-04-29T04:30:41","slug":"terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/","title":{"rendered":"Terraform\u516c\u5f0f\u6559\u7a0b\u5373\u65f6\u64ad\u653e"},"content":{"rendered":"<h3>\u2460\u5b89\u88c5\u6307\u4ee4<\/h3>\n<p>\u6211\u80fd\u591f\u7528homebrew\u8fdb\u884c\u5b89\u88c5\u3002<\/p>\n<pre class=\"post-pre\"><code>brew tap hashicorp\/tap\r\nbrew install hashicorp\/tap\/terraform\r\n<\/code><\/pre>\n<h3>\u8bbe\u7f6e\u547d\u4ee4\u884c\u914d\u7f6e<\/h3>\n<p>\u5728\u6559\u7a0b\u4e2d\uff0c\u6211\u4eec\u4f1a\u8bbe\u7f6e\u8def\u5f84\u5e76\u8fdb\u884c\u547d\u4ee4\u8865\u5168\u3002\u4f46\u662f\u6211\u4e2a\u4eba\u4f7f\u7528zsh\uff0c\u5e76\u901a\u8fc7\u5386\u53f2\u8bb0\u5f55\u6765\u663e\u793a\u9884\u6d4b\u5019\u9009\u9879\uff0c\u6240\u4ee5\u8fd9\u91cc\u662f\u8def\u5f84\u3002<\/p>\n<h3>\u7528Terraform\u5728Docker\u4e0a\u8fd0\u884c<\/h3>\n<p>\u5728\u8fd9\u91cc\u5f00\u59cb\u4ee5\u5b9e\u9645\u7684\u65b9\u5f0f\uff0c\u7528Terraform\u5b9e\u9645\u8fd0\u884cDocker\u8fdb\u884c\u8bd5\u9a8c\u3002\u9996\u5148\u521b\u5efa\u4e00\u4e2a\u76ee\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code>open -a Docker\r\nmkdir learn-terraform-docker-container\r\ncd learn-terraform-docker-container\r\n<\/code><\/pre>\n<p>\u7136\u540e\uff0c\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a main.tf \u7684\u6587\u4ef6\u3002\u8fd9\u5c06\u6210\u4e3a Terraform \u7684\u4e3b\u8981\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\">docker<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">source<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"kreuzwerker\/docker\"<\/span>\r\n      <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"~&gt; 2.13.0\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">provider<\/span> <span class=\"s2\">\"docker\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"docker_image\"<\/span> <span class=\"s2\">\"nginx\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"nginx:latest\"<\/span>\r\n  <span class=\"nx\">keep_locally<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"docker_container\"<\/span> <span class=\"s2\">\"nginx\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">image<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">docker_image<\/span><span class=\"p\">.<\/span><span class=\"nx\">nginx<\/span><span class=\"p\">.<\/span><span class=\"nx\">latest<\/span>\r\n  <span class=\"nx\">name<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"tutorial\"<\/span>\r\n  <span class=\"nx\">ports<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">internal<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">80<\/span>\r\n    <span class=\"nx\">external<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">8000<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u7136\u540e\uff0c\u5728\u5199\u4e86\u8fd9\u4e2a\u7684\u72b6\u6001\u4e0b\uff0c\u8fd0\u884c\u4e0b\u9762\u7684\u6307\u4ee4\uff0c\u9879\u76ee\u5c31\u4f1a\u542f\u52a8\u8d77\u6765\uff08\u5728\u8fd9\u79cd\u72b6\u6001\u4e0b\uff0c\u8d44\u6e90\u8fd8\u6ca1\u6709\u8fd0\u884c\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code>terraform init\r\n<\/code><\/pre>\n<p>\u6240\u4ee5\uff0c\u5f53\u6267\u884c\u2193\u65f6\uff0c\u5b9e\u9645\u4e0a\u4f1a\u542f\u52a8\u8d44\u6e90\u3002<\/p>\n<pre class=\"post-pre\"><code>terraform apply\r\n<\/code><\/pre>\n<p>\u672c\u6b21\u60c5\u51b5\u4e0b\u8fdb\u884c\u4e86\u5982\u4e0b\u914d\u7f6e\uff0c\u542f\u52a8\u4e86\u4e00\u4e2a\u5177\u6709nginx\u955c\u50cf\u7684Docker\u5bb9\u5668\u3002\u540c\u65f6\u5c06\u7aef\u53e3\u8bbe\u7f6e\u4e3a80:8000\uff0c\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7localhost:8000\u8fde\u63a5\u5230nginx\u670d\u52a1\u5668\u3002<\/p>\n<p>\u8981\u505c\u6b62\u542f\u52a8\u7684\u8d44\u6e90\uff0c\u8bf7\u6267\u884c\u4ee5\u4e0b\u6b65\u9aa4\u2193<\/p>\n<pre class=\"post-pre\"><code>terraform destroy\r\n<\/code><\/pre>\n<h3>\u4f7f\u7528Terraform\u5728AWS\u4e0a\u521b\u5efa\u8d44\u6e90\u3002<\/h3>\n<p>\u4f7f\u7528Terraform\u542f\u52a8AWS\u8d44\u6e90\u5e76\u67e5\u770b\u3002<\/p>\n<p>\u4e0eDocker\u65f6\u4e00\u6837\uff0c\u5728main.tf\u6587\u4ef6\u4e2d\u7f16\u5199\u914d\u7f6e\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\r\n<\/code><\/pre>\n<p>\u5927\u6982\u6765\u8bf4\uff0c\u4ece\u6559\u7a0b\u6587\u4ef6\u6765\u770b\uff0c\u6bcf\u4e2a\u8bbe\u7f6e\u9879\u76ee\u7684\u610f\u56fe\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<p>required_providers&#8230;Terraform\u3092\u4f7f\u3046\u4e0a\u3067\u5fc5\u9808\u3068\u306a\u308bprovider\u3002source\u3067provider\u306e\u5b58\u5728\u3059\u308b\u5834\u6240\u3001version\u3067\u5229\u7528\u3059\u308bpvovider\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u6307\u5b9a\u3057\u3066\u3044\u308b<\/p>\n<p>provider&#8230;Terraform\u3067\u30ea\u30bd\u30fc\u30b9\u3092\u7ba1\u7406\u3059\u308b\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u7684\u306a\u4f55\u304b\u3002Docker\u3001AWS\u3001GCP\u307f\u305f\u3044\u306a\u7c92\u5ea6\u306e\u5024\u304c\u5165\u308b\u3002<\/p>\n<p>resources&#8230;provider\u4e0a\u3067\u5b9f\u969b\u306b\u7acb\u3061\u4e0a\u3052\u308b\u30ea\u30bd\u30fc\u30b9\u3002\u3053\u308c\u306f\u30b7\u30f3\u30d7\u30eb\u3060\u306d<\/p>\n<p>\u5f53\u60a8\u7f16\u5199\u5b8c\u8bbe\u5b9a\u6587\u4ef6\u540e\uff0c\u53ef\u4ee5\u50cf\u5148\u524d\u4e00\u6837\u901a\u8fc7\u2193\u6765\u542f\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code>terraform init\r\nterraform apply\r\n<\/code><\/pre>\n<p>\u987a\u4fbf\u63d0\u4e00\u4e0b\uff0c\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u53ef\u4ee5\u8fdb\u884c\u683c\u5f0f\u548c\u63cf\u8ff0\u9519\u8bef\u7684\u68c0\u67e5\uff0c\u53ef\u4ee5\u5728CI\u7b49\u65b9\u9762\u4f7f\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code>terraform fmt\r\nterraform validate\r\n<\/code><\/pre>\n<p>\u9047\u5230\u9519\u8bef\uff0c\u6240\u4ee5\u8bb0\u4e0b\u6765\u4e86\u3002<\/p>\n<pre class=\"post-pre\"><code>terraform apply\r\n<\/code><\/pre>\n<p>\u6267\u884c\u3002\u3002\u3002\u4f1a\u51fa\u73b0\u4ee5\u4e0b\u9519\u8bef\u3002<\/p>\n<pre class=\"post-pre\"><code>aws_instance.app_server: Creating...\r\n\u2577\r\n\u2502 Error: creating EC2 Instance: InvalidAMIID.NotFound: The image id '[ami-830c94e3]' does not exist\r\n\u2502 \tstatus code: 400, request id: 24596a32-6f55-49d6-b205-94a0bf5078f1\r\n\u2502 \r\n\u2502   with aws_instance.app_server,\r\n\u2502   on main.tf line 16, in resource \"aws_instance\" \"app_server\":\r\n\u2502   16: resource \"aws_instance\" \"app_server\" {\r\n\u2502 \r\n\u2575\r\n\r\n<\/code><\/pre>\n<p>\u542c\u8d77\u6765\u597d\u50cf\u627e\u4e0d\u5230AMI\uff01\u6211\u770b\u5230\u8fd9\u4e2a\u6d88\u606f\u4e4b\u540e\u5f00\u59cb\u505a\u4e86\u4e00\u4e9b\u8c03\u67e5\uff0c\u53d1\u73b0AMl\u7684ID\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u5730\u533a\u800c\u4e0d\u540c\u3002<br \/>\n\u5728\u6559\u7a0b\u7684 main.tf \u6587\u4ef6\u4e2d\u4f7f\u7528\u4e86 us-west-2 \u8fd9\u4e2a\u5730\u533a\uff0c\u4f46\u662f\u6211\u5f53\u7136\u4e0d\u60f3\u82b1\u94b1\uff0c\u6240\u4ee5\u6539\u6210\u4e86 ap-northeast-1\u3002\u7136\u800c\uff0c\u6211\u6ca1\u6709\u6539\u53d8AMI\u7684ID\uff0c\u6240\u4ee5\u51fa\u73b0\u4e86\u9519\u8bef\u3002<\/p>\n<pre class=\"post-pre\"><code>aws ec2 describe-images --owners self amazon --region ap-northeast-1\r\n<\/code><\/pre>\n<p>\u5f53\u4f7f\u7528AWS CLI\u6267\u884c\u7c7b\u4f3c\u7684\u547d\u4ee4\u65f6\uff0c\u53ef\u4ee5\u5728\u4e1c\u4eac\u533a\u57df\u83b7\u53d6\u5230\u7531awsm\u5b98\u65b9\u6240\u62e5\u6709\u7684AMI\u3002\u6211\u8ba4\u4e3a\u5982\u6b64\uff0c\u4f46\u7531\u4e8e\u83b7\u53d6\u7ed3\u679c\u4e0d\u76f4\u89c2\uff0c\u6240\u4ee5\u6211\u5c06\u5728\u63a7\u5236\u53f0\u4e0a\u67e5\u770b\u5b83\u3002<\/p>\n<p>\u5f53\u60a8\u542f\u52a8EC2\u5b9e\u4f8b\u65f6\uff0c\u5c06\u4f1a\u663e\u793a\u5982\u4e0b\u5c4f\u5e55\uff0c\u60a8\u53ef\u4ee5\u5728\u8fd9\u91cc\u9009\u62e9\u9002\u7528\u4e8e\u514d\u8d39\u4f7f\u7528\u914d\u989d\u7684\u6620\u50cf\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d86c5913a08637a6be155\/35-0.png\" alt=\"Cursor_\u3068_\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u8d77\u52d5___EC2_Management_Console.png\" \/><\/div>\n<p>\u7531\u4e8e\u6709AMI ID\uff0c\u5c06\u5176\u590d\u5236\u5230 main.tf \u6587\u4ef6\u4e2d\u8fdb\u884c\u67e5\u770b\u3002<\/p>\n<p>\u597d\u7684\u3002terrafrom apply\u6210\u529f\u4e86\uff0c\u592a\u68d2\u4e86\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d86c5913a08637a6be155\/38-0.png\" alt=\"Cursor_\u3068_\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9___EC2_Management_Console.png\" \/><\/div>\n<p>\u5f53\u6211\u771f\u6b63\u67e5\u770b\u63a7\u5236\u53f0\u65f6\uff0c\u5b83\u5df2\u7ecf\u542f\u52a8\u4e86\u3002\u771f\u5389\u5bb3\u3002<\/p>\n<p>\u987a\u4fbf\u8bf4\u4e00\u53e5\uff0c\u8981\u67e5\u770b\u5df2\u542f\u52a8\u8d44\u6e90\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\u2193\u3002<\/p>\n<pre class=\"post-pre\"><code>terraform show\r\n<\/code><\/pre>\n<p>\u5982\u679c\u663e\u793a\u51fa\u7c7b\u4f3c\u7684\u7ed3\u679c\uff0c\u90a3\u5c31\u53ef\u4ee5\u4e86\u3002<\/p>\n<pre class=\"post-pre\"><code>resource \"aws_instance\" \"app_server\" {\r\n    ami                                  = \"ami-078296f82eb463377\"\r\n    arn                                  = \"...\"\r\n    associate_public_ip_address          = true\r\n    availability_zone                    = \"ap-northeast-1c\"\r\n    cpu_core_count                       = 1\r\n    cpu_threads_per_core                 = 1\r\n    disable_api_stop                     = false\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-0413a991b88bc950e\"\r\n    instance_initiated_shutdown_behavior = \"stop\"\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-04ae1cf226d4d833d\"\r\n    private_dns                          = \"ip-172-31-3-118.ap-northeast-1.compute.internal\"\r\n    private_ip                           = \"172.31.3.118\"\r\n    public_dns                           = \"ec2-43-206-106-51.ap-northeast-1.compute.amazonaws.com\"\r\n    public_ip                            = \"43.206.106.51\"\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-0a658c50\"\r\n    tags                                 = {\r\n        \"Name\" = \"ExampleAppServerInstance\"\r\n    }\r\n    tags_all                             = {\r\n        \"Name\" = \"ExampleAppServerInstance\"\r\n    }\r\n    tenancy                              = \"default\"\r\n    user_data_replace_on_change          = false\r\n    vpc_security_group_ids               = [\r\n        \"sg-759f0a37\",\r\n    ]\r\n\r\n    capacity_reservation_specification {\r\n        capacity_reservation_preference = \"open\"\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    maintenance_options {\r\n        auto_recovery = \"default\"\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        instance_metadata_tags      = \"disabled\"\r\n    }\r\n\r\n    private_dns_name_options {\r\n        enable_resource_name_dns_a_record    = false\r\n        enable_resource_name_dns_aaaa_record = false\r\n        hostname_type                        = \"ip-name\"\r\n    }\r\n\r\n    root_block_device {\r\n        delete_on_termination = true\r\n        device_name           = \"\/dev\/xvda\"\r\n        encrypted             = false\r\n        iops                  = 100\r\n        tags                  = {}\r\n        throughput            = 0\r\n        volume_id             = \"vol-026751c2ae22eb49d\"\r\n        volume_size           = 8\r\n        volume_type           = \"gp2\"\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>\u6211\u4eec\u73b0\u5728\u5728\u8fd9\u91cc\u63d0\u4ea4\u5427\u3002<\/p>\n<p>\u987a\u4fbf\u63d0\u4e00\u4e0b\uff0c\u5f53\u60f3\u8981\u66f4\u65b0\u914d\u7f6e\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528 terraform apply \u8fdb\u884c\u786e\u8ba4\u3002<\/p>\n<h3>\u505c\u6b62\u57fa\u7840\u8bbe\u65bd<\/h3>\n<p>\u5982\u679c\u60f3\u8981\u505c\u6b62\u5df2\u542f\u52a8\u7684\u8d44\u6e90\uff0c\u8bf7\u6267\u884c\u2193<\/p>\n<pre class=\"post-pre\"><code>terraform destroy\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d86c5913a08637a6be155\/49-0.png\" alt=\"Cursor_\u3068_\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9___EC2_Management_Console.png\" \/><\/div>\n<p>\u521a\u624d\u6b63\u5728\u542f\u52a8\u7684\u8d44\u6e90\u5df2\u7ecf\u7ed3\u675f\u4e86\u3002<\/p>\n<h3>\u4f20\u9012\u53d8\u91cf<\/h3>\n<p>\u53ef\u4ee5\u5728 Terraform \u7684\u914d\u7f6e\u6587\u4ef6\u4e2d\u4f20\u9012\u53d8\u91cf\uff0c\u5e76\u4e14\u53ef\u4ee5\u5728\u6bcf\u6b21\u547d\u4ee4\u6267\u884c\u65f6\u4f20\u9012\u4e0d\u540c\u7684\u503c\u3002<\/p>\n<p>\u521b\u5efavariables.tf\uff0c\u5e76\u6309\u7167\u4e0b\u9762\u7684\u65b9\u5f0f\u8fdb\u884c\u63cf\u8ff0\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<p>\u5f53\u5c06\u53d8\u91cf\u4f20\u9012\u7ed9\u8bbe\u7f6e\u6587\u4ef6\u65f6\uff0c\u8bf7\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u7f16\u5199\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-078296f82eb463377\"<\/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<p>\u5982\u679c\u4f7f\u7528var.instance_name\uff0c\u53ef\u4ee5\u5c06\u540d\u4e3ainstance_name\u7684\u53d8\u91cf\u7684\u503c\u4f20\u9012\u7ed9tags\u7684\u540d\u79f0\u3002<\/p>\n<p>\u5982\u679c\u6ca1\u6709\u4f20\u9012\u4efb\u4f55\u503c\uff0c\u5219\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u8d44\u6e90\u5c06\u4ee5&#8221;default&#8221;\u7684\u503c\u542f\u52a8\uff0c\u56e0\u4e3a\u53d8\u91cf\u8bbe\u7f6e\u4e3a &#8220;ExampleAppServerInstance&#8221;\u3002<\/p>\n<p>\u9806\u4fbf\u63d0\u4e00\u4e0b\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u8fd9\u91cc\u6ca1\u6709\u660e\u786e\u6307\u5b9a\u5b9e\u4f8bID\uff0c\u6240\u4ee5\u521a\u624d\u548c\u73b0\u5728\u542f\u52a8\u7684\u5b9e\u4f8b\u4e0d\u540c\u3002\uff08\u5982\u679c\u5df2\u7ecf\u9500\u6bc1\u8fc7\u4e00\u6b21\uff0c\u4f1a\u91cd\u65b0\u542f\u52a8\u4e00\u4e2a\u4e0d\u540c\u7684\u8d44\u6e90\u5417\uff1f\uff09<\/p>\n<p>\u63a5\u4e0b\u6765\u5728\u547d\u4ee4\u6267\u884c\u65f6\u4f20\u9012\u53d8\u91cf\u3002<\/p>\n<pre class=\"post-pre\"><code>terraform apply -var \"instance_name=YetAnotherName\"\r\n<\/code><\/pre>\n<p>\u8fd9\u6837\u505a\u53ef\u4ee5\u770b\u5230\u4ee5\u4e0b\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u663e\u793a\u4e86Name\u7684\u503c\u5df2\u7ecf\u53d8\u5316\u3002<\/p>\n<pre class=\"post-pre\"><code>Terraform 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-07106c4743876f6cb\"\r\n      ~ tags                                 = {\r\n          ~ \"Name\" = \"ExampleAppServerInstance\" -&gt; \"YetAnotherName\"\r\n        }\r\n      ~ tags_all                             = {\r\n          ~ \"Name\" = \"ExampleAppServerInstance\" -&gt; \"YetAnotherName\"\r\n        }\r\n        # (29 unchanged attributes hidden)\r\n\r\n        # (7 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<\/code><\/pre>\n<p>\u6211\u4eec\u53ef\u4ee5\u5728\u63a7\u5236\u53f0\u4e0a\u770b\u5230\u5b9e\u9645\u7684\u6570\u503c\u5df2\u7ecf\u53d1\u751f\u53d8\u5316\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d86c5913a08637a6be155\/65-0.png\" alt=\"Cursor_\u3068_\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9___EC2_Management_Console.png\" \/><\/div>\n<h3>\u4f7f\u5176\u80fd\u591f\u8f93\u51fa\u8d44\u6e90\u4fe1\u606f<\/h3>\n<p>\u4f7f\u4e91\u8ba1\u7b97\u57fa\u5efa\u5de5\u5177Terraform\u901a\u8fc7\u547d\u4ee4\u884c\u53ef\u9a8c\u8bc1\u6240\u521b\u5efa\u7684\u8d44\u6e90\u3002<br \/>\n\u8fd9\u6837\u4e00\u6765\uff0c\u534f\u4f5c\u8005\u53ef\u66f4\u65b9\u4fbf\u5730\u4f7f\u7528\uff0c\u4e5f\u4fbf\u4e8e\u4eceAWS\u63a7\u5236\u53f0\u4e2d\u67e5\u627e\uff0c\u5177\u5907\u4e00\u4e9b\u4f18\u70b9\u3002<\/p>\n<p>\u521b\u5efa outputs.tf \u6587\u4ef6\uff0c\u5e76\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u8fdb\u884c\u63cf\u8ff0\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<p>\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u6765\u786e\u8ba4\u8bbe\u7f6e\u5185\u5bb9\u3002<\/p>\n<pre class=\"post-pre\"><code>terraform output\r\n<\/code><\/pre>\n<p>\u8fd0\u884c\u7ed3\u679c<\/p>\n<pre class=\"post-pre\"><code>tomolico@mourifuyusatorunoMacBook-Air learn-terraform-aws-instance % terraform output\r\ninstance_id = \"i-07106c4743876f6cb\"\r\ninstance_public_ip = \"54.65.225.171\"\r\n<\/code><\/pre>\n<h3>\u5c06\u8d44\u6e90\u4fe1\u606f\u4fdd\u5b58\u5728 Terraform Cloud \u4e2d<\/h3>\n<p>\u53ef\u4ee5\u5c06\u901a\u8fc7Terraform\u4ee3\u7801\u521b\u5efa\u7684\u8d44\u6e90\u4fe1\u606f\u5b58\u50a8\u5728\u4e91\u7aef\u8fdb\u884c\u7ba1\u7406\u3002\u770b\u8d77\u6765\u53ef\u4ee5\u901a\u8fc7GUI\u754c\u9762\u8fdb\u884c\u67e5\u770b\uff0c\u975e\u5e38\u65b9\u4fbf\u3002<\/p>\n<p>\u6dfb\u52a0\u4ee5\u4e0b\u63cf\u8ff0\u5230 maim.tf<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">cloud<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">organization<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"organization-name\"<\/span>\r\n    <span class=\"nx\">workspaces<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"learn-tfc-aws\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u7ec4\u7ec7\u4e2d\uff0c\u5f53\u8fdb\u884c\u767b\u5f55\u65f6\u9700\u8981\u8fdb\u884c\u8bbe\u7f6e\u3002\u59d3\u540d\u53ef\u4ee5\u4f7f\u7528\u4efb\u610f\u7684\u540d\u79f0\u3002<\/p>\n<p>\u6211\u5011\u8981\u5c07 CLI \u548c Terraform Cloud \u9032\u884c\u6574\u5408\uff0c\u57f7\u884c\u4e0b\u9762\u7684\u6307\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code>terraform login\r\n<\/code><\/pre>\n<p>\u56e0\u6b64\uff0c\u60a8\u9700\u8981\u5728\u7f51\u9875\u4e0a\u8f93\u5165\u751f\u6210\u7684API\u4ee4\u724c\uff0c\u5c31\u50cf\u4e0b\u65b9\u6240\u793a\u3002<\/p>\n<pre class=\"post-pre\"><code>Generate a token using your browser, and copy-paste it into this prompt.\r\n\r\nTerraform will store the token in plain text in the following file\r\nfor use by subsequent commands:\r\n    \/Users\/tomolico\/.terraform.d\/credentials.tfrc.json\r\n\r\nToken for app.terraform.io:\r\n  Enter a value: \r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d86c5913a08637a6be155\/83-0.png\" alt=\"Cursor_\u3068_Tokens___Account___Terraform_Cloud.png\" \/><\/div>\n<p>\u987a\u4fbf\u8bf4\u4e00\u4e0b\uff0c\u53ef\u4ee5\u5728\u7f51\u7edc\u4e0a\u5355\u72ec\u53d1\u884c\u4ee4\u724c\u3002<\/p>\n<p>\u5982\u679c\u5c1d\u8bd5\u76f4\u63a5\u542f\u52a8\uff0c\u4f1a\u9047\u5230\u4ee5\u4e0b\u9519\u8bef\u3002\u4f3c\u4e4e\u9700\u8981\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u4f20\u9012AWS\u51ed\u8bc1\u3002<\/p>\n<pre class=\"post-pre\"><code>Initializing plugins and modules...\r\n\u2577\r\n\u2502 Error: error configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.\r\n\u2502 \r\n\u2502 Please see https:\/\/registry.terraform.io\/providers\/hashicorp\/aws\r\n\u2502 for more information about providing credentials.\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d86c5913a08637a6be155\/87-0.png\" alt=\"Cursor_\u3068_Variables___aws-tutorial___moritania___Terraform_Cloud.png\" \/><\/div>\n<p>\u5728workspace\u7684variables\u8bbe\u7f6e\u4e2d\u8fdb\u884c\u914d\u7f6e\u5e76\u4fdd\u5b58\u3002\u987a\u4fbf\u63d0\u4e00\u4e0b\uff0c\u8981\u8fdb\u5165\u8fd9\u4e2a\u9875\u9762\u9700\u8981\u5148\u542f\u52a8\u4e00\u4e2a\u7a7a\u7684\u5de5\u4f5c\u7a7a\u95f4\u3002\u53ef\u80fd\u5f53\u6ca1\u6709\u8fde\u63a5\u5230\u4e91\u7aef\u65f6\uff0c\u9ed8\u8ba4\u4f1a\u5728\u547d\u4ee4\u884c\u4e2d\u8bfb\u53d6\u5df2\u914d\u7f6e\u7684\u73af\u5883\u53d8\u91cf\uff0c\u4f46\u662f\u5e94\u8be5\u662f\u7531\u4e8e\u4e0e\u4e91\u7aef\u7684\u8fde\u63a5\u800c\u6539\u53d8\u4e86\u8bfb\u53d6\u4f4d\u7f6e\u3002<\/p>\n<p>\u987a\u4fbf\u63d0\u4e00\u4e0b\uff0c\u5982\u679c\u5c1d\u8bd5\u76f4\u63a5\u542f\u52a8\u5b9e\u4f8b\uff0c\u4f1a\u51fa\u73b0\u7c7b\u4f3c\u4e0b\u9762\u7684\u8b66\u544a\u3002<\/p>\n<pre class=\"post-pre\"><code>Changes to Outputs:\r\n  + instance_id        = (known after apply)\r\n  + instance_public_ip = (known after apply)\r\n\u2577\r\n\u2502 Warning: Value for undeclared variable\r\n\u2502 \r\n\u2502 The root module does not declare a variable named \"AWS_SECRET_ACCESS_KEY\"\r\n\u2502 but a value was found in file\r\n\u2502 \"\/home\/tfc-agent\/.tfc-agent\/component\/terraform\/runs\/run-ufJR9wYcwnidho6D\/terraform.tfvars\".\r\n\u2502 If you meant to use this value, add a \"variable\" block to the\r\n\u2502 configuration.\r\n\u2502 \r\n\u2502 To silence these warnings, use TF_VAR_... environment variables to provide\r\n\u2502 certain \"global\" settings to all configurations in your organization. To\r\n\u2502 reduce the verbosity of these warnings, use the -compact-warnings option.\r\n\u2575\r\n\u2577\r\n\u2502 Warning: Value for undeclared variable\r\n\u2502 \r\n\u2502 The root module does not declare a variable named \"AWS_ACCESS_KEY_ID\" but a\r\n\u2502 value was found in file\r\n\u2502 \"\/home\/tfc-agent\/.tfc-agent\/component\/terraform\/runs\/run-ufJR9wYcwnidho6D\/terraform.tfvars\".\r\n\u2502 If you meant to use this value, add a \"variable\" block to the\r\n\u2502 configuration.\r\n\u2502 \r\n\u2502 To silence these warnings, use TF_VAR_... environment variables to provide\r\n\u2502 certain \"global\" settings to all configurations in your organization. To\r\n\u2502 reduce the verbosity of these warnings, use the -compact-warnings option.\r\n\u2575\r\n<\/code><\/pre>\n<p>\u653e\u7f6e\u7740\u4e5f\u4f1a\u8fd0\u52a8\uff0c\u4f46\u662f\u662f\u5426\u6700\u597d\u8fd8\u662f\u5148\u4ece\u73af\u5883\u53d8\u91cf\u6587\u4ef6\u7b49\u8bfb\u53d6\u6bd4\u8f83\u597d\u5462\u3002<\/p>\n<p>\u5f53\u5728\u4e91\u7aef\u96c6\u6210\u7684\u60c5\u51b5\u4e0b\u542f\u52a8\u8d44\u6e90\uff0c\u4f1a\u53d8\u5f97\u50cf\u2193\u8fd9\u6837\u7684\u72b6\u6001\u3002\u8fd9\u4e2a\u6bd4\u8f83\u6e05\u695a\u6613\u61c2\uff0c\u662f\u5427\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d86c5913a08637a6be155\/93-0.png\" alt=\"Cursor_\u3068_Overview___aws-tutorial___moritania___Terraform_Cloud.png\" \/><\/div>\n<p>\u987a\u4fbf\u63d0\u4e00\u4e0b\uff0c\u5f53\u4f60\u7ec8\u6b62\u8d44\u6e90\u65f6\uff0c\u4f1a\u6709\u4ee5\u4e0b\u663e\u793a\u3002\u4e0d\u53ef\u601d\u8bae\u7684\u662f\uff0c\u5b83\u5728\u547d\u4ee4\u884c\u6267\u884c\u65f6\u4ee5\u5f02\u6b65\u65b9\u5f0f\u62c9\u53d6\u7ed9\u4e86\u6211\u3002\u592a\u5389\u5bb3\u4e86\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d86c5913a08637a6be155\/95-0.png\" alt=\"Cursor_\u3068_Overview___aws-tutorial___moritania___Terraform_Cloud.png\" \/><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u2460\u5b89\u88c5\u6307\u4ee4 \u6211\u80fd\u591f\u7528homebrew\u8fdb\u884c\u5b89\u88c5\u3002 brew tap hashicorp\/tap brew ins [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48722","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>Terraform\u516c\u5f0f\u6559\u7a0b\u5373\u65f6\u64ad\u653e - 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\/terraform\u516c\u5f0f\u6559\u7a0b\u5373\u65f6\u64ad\u653e\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Terraform\u516c\u5f0f\u6559\u7a0b\u5373\u65f6\u64ad\u653e\" \/>\n<meta property=\"og:description\" content=\"\u2460\u5b89\u88c5\u6307\u4ee4 \u6211\u80fd\u591f\u7528homebrew\u8fdb\u884c\u5b89\u88c5\u3002 brew tap hashicorp\/tap brew ins [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/terraform\u516c\u5f0f\u6559\u7a0b\u5373\u65f6\u64ad\u653e\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-29T12:58:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T04:30:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d86c5913a08637a6be155\/35-0.png\" \/>\n<meta name=\"author\" content=\"\u79d1, \u96c5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u96c5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 \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\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/\",\"name\":\"Terraform\u516c\u5f0f\u6559\u7a0b\u5373\u65f6\u64ad\u653e - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-12-29T12:58:36+00:00\",\"dateModified\":\"2024-04-29T04:30:41+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Terraform\u516c\u5f0f\u6559\u7a0b\u5373\u65f6\u64ad\u653e\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\",\"name\":\"\u79d1, \u96c5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u96c5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Terraform\u516c\u5f0f\u6559\u7a0b\u5373\u65f6\u64ad\u653e - 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\/terraform\u516c\u5f0f\u6559\u7a0b\u5373\u65f6\u64ad\u653e\/","og_locale":"zh_CN","og_type":"article","og_title":"Terraform\u516c\u5f0f\u6559\u7a0b\u5373\u65f6\u64ad\u653e","og_description":"\u2460\u5b89\u88c5\u6307\u4ee4 \u6211\u80fd\u591f\u7528homebrew\u8fdb\u884c\u5b89\u88c5\u3002 brew tap hashicorp\/tap brew ins [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/terraform\u516c\u5f0f\u6559\u7a0b\u5373\u65f6\u64ad\u653e\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-12-29T12:58:36+00:00","article_modified_time":"2024-04-29T04:30:41+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d86c5913a08637a6be155\/35-0.png"}],"author":"\u79d1, \u96c5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u96c5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"5 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/","name":"Terraform\u516c\u5f0f\u6559\u7a0b\u5373\u65f6\u64ad\u653e - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-12-29T12:58:36+00:00","dateModified":"2024-04-29T04:30:41+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"Terraform\u516c\u5f0f\u6559\u7a0b\u5373\u65f6\u64ad\u653e"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a","name":"\u79d1, \u96c5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","caption":"\u79d1, \u96c5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/terraform%e5%85%ac%e5%bc%8f%e6%95%99%e7%a8%8b%e5%8d%b3%e6%97%b6%e6%92%ad%e6%94%be\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48722"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48722\/revisions"}],"predecessor-version":[{"id":85288,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48722\/revisions\/85288"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}