{"id":48665,"date":"2023-01-31T12:26:12","date_gmt":"2023-07-02T19:17:02","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/"},"modified":"2024-04-29T12:23:32","modified_gmt":"2024-04-29T04:23:32","slug":"%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/","title":{"rendered":"\u4e2d\u6587\uff1a\u4f7f\u7528VS Code Remote Container\u914d\u7f6eAzure + Terraform + GitHub Actions\u73af\u5883"},"content":{"rendered":"<h1>\u5f15\u8a00<\/h1>\n<p>\u6211\u4f7f\u7528 Fork \u548c Clone \u6765\u521b\u5efa\u4e86\u4e00\u4e2a\u80fd\u591f\u5feb\u901f\u5728 Azure \u4e0a\u4f7f\u7528 Terraform \u7684 devcontainer\u3002\u6211\u4f7f\u7528\u4e86 VS Code \u7684 Remote Development (Remote &#8211; Containers) \u529f\u80fd\uff0c\u56e0\u6b64\u53ea\u8981\u5728\u672c\u5730\u62e5\u6709 VS Code \u548c Docker Desktop \u7684\u73af\u5883\uff0c\u5c31\u53ef\u4ee5\u901a\u8fc7\u7b80\u5355\u7684\u51c6\u5907\u6765\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Terraform \u3067 Azure \u3092\u7ba1\u7406\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>terraform \u3084 Azure CLI az \u30b3\u30de\u30f3\u30c9\u304c\u3059\u3067\u306b Docker \u30b3\u30f3\u30c6\u30ca\u4e0a\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>GitHub Actions \u3067 Push \u3055\u308c\u305f\u5185\u5bb9\u3092\u81ea\u52d5\u3067\u53cd\u6620\u3059\u308b<\/p>\n<p>GitHub\u4ed3\u5e93\u5730\u5740\u5982\u4e0b\uff1a<br \/>\nhttps:\/\/github.com\/hoisjp\/terraform-azure-ghactions-devcontainer<\/p>\n<h1>\u6b65\u9aa4 (b\u00f9<\/h1>\n<h2>\u9700\u8981\u5728\u4e8b\u524d\u51c6\u5907\u7684\u7269\u54c1<\/h2>\n<p>\u8bf7\u51c6\u5907\u4ee5\u4e0b\u7269\u54c1\u3002\u53ea\u9700\u8981\u8fd9\u4e9b\uff01<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>Visual Studio Code\uff1ahttps:\/\/code.visualstudio.com\/download<\/ol>\n<\/li>\n<\/ol>\n<p>VS Code\u6269\u5c55\uff1aVS Code\u8fdc\u7a0b\u5f00\u53d1\uff08\u8fdc\u7a0b-\u5bb9\u5668\uff09<\/p>\n<p>Docker\u684c\u9762\u7248\uff1ahttps:\/\/www.docker.com\/get-started<br \/>\n\u65e0\u8bba\u662fWindows\u3001Mac\u8fd8\u662fLinux\u64cd\u4f5c\u7cfb\u7edf\u90fd\u53ef\u4ee5\u4f7f\u7528\u3002<\/p>\n<h2>\u6765\u5427\uff01\u8fdc\u7a0b\u5f00\u53d1\uff01<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8691913a08637a6bd80c\/9-1.png\" alt=\"Reopen in containers\" \/><\/div>\n<h1>\u4f7f\u7528Terraform\u64cd\u4f5cAzure<\/h1>\n<h2>Terraform\u540e\u7aef\u7528\u4e8eAzure\u5b58\u50a8\u3002<\/h2>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u5c1d\u8bd5\u521b\u5efa\u4e00\u4e2a\u7528\u4e8eTerraform\u540e\u7aef\u7684Azure\u5b58\u50a8\u3002\u8fd9\u4e2a\u5b58\u50a8\u662f\u5fc5\u9700\u7684\uff0c\u7528\u4e8e\u7ba1\u7406Terraform\u7684\u72b6\u6001\u3002<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u4f7f\u7528VS Code\u6253\u5f00\u7ec8\u7aef\u3002\u5e94\u8be5\u5728\u5b58\u50a8\u5e93\u7684\u4e3b\u76ee\u5f55\u4e2d\u3002<\/ol>\n<\/li>\n<\/ol>\n<p>$ pwd<br \/>\n\/workspace\/&lt;\u4f60\u7684\u5b58\u50a8\u5e93\u540d&gt;<\/p>\n<p>\u767b\u5f55\u5230Azure\u3002\u6253\u5f00\u767b\u5f55\u9875\u9762\u5e76\u8f93\u5165\u6307\u5b9a\u7684\u4ee3\u7801\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\u3002\u4e0b\u9762\u7684************\u90e8\u5206\u8fdb\u884c\u66ff\u6362\u3002<\/p>\n<p>$ az login<br \/>\nTo sign in, use a web browser to open the page https:\/\/microsoft.com\/devicelogin and enter the code ************ to authenticate.<\/p>\n<p>\u6210\u529f\u767b\u5f55\u540e\uff0c\u60a8\u5c06\u6536\u5230\u4ee5JSON\u683c\u5f0f\u8fd4\u56de\u7684\u62e5\u6709\u7684Azure\u8ba2\u9605\u5217\u8868\u3002<\/p>\n<p>\u9009\u62e9\u9002\u5f53\u7684\u8ba2\u9605\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u3002\u8bf7\u4f7f\u7528\u81ea\u5df1\u7684\u8ba2\u9605GUID\u66ff\u6362\u5148\u524dJSON\u7ed3\u679c\u7684id\u5c5e\u6027\u3002<\/p>\n<p>$ az account set &#8211;subscription &lt;\u4f60\u7684\u8ba2\u9605GUID&gt;<\/p>\n<p>\u7136\u540e\uff0c\u5207\u6362\u5230\u4ee5\u4e0b\u76ee\u5f55\u3002<\/p>\n<p>$ cd 00-create-azurerm-backend<\/p>\n<p>\u4e3a\u6267\u884cTerraform\u9700\u8981\u521d\u59cb\u5316\u72b6\u6001\u3002<br \/>\n\u6267\u884c\u4ee5\u4e0bterraform init\u547d\u4ee4\u3002<\/p>\n<p>$ terraform init<\/p>\n<p>\u6b63\u5728\u521d\u59cb\u5316\u540e\u7aef&#8230;<\/p>\n<p>\u6b63\u5728\u521d\u59cb\u5316\u63d0\u4f9b\u7a0b\u5e8f\u63d2\u4ef6&#8230;<\/p>\n<p>Terraform\u521d\u59cb\u5316\u6210\u529f\uff01<\/p>\n<p>\u73b0\u5728\u53ef\u4ee5\u5f00\u59cb\u4f7f\u7528Terraform\u8fdb\u884c\u64cd\u4f5c\u3002\u5c1d\u8bd5\u8fd0\u884c&#8221;terraform plan&#8221;\u4ee5\u67e5\u770b\u57fa\u7840\u67b6\u6784\u6240\u9700\u7684\u4efb\u4f55\u66f4\u6539\u3002\u73b0\u5728\uff0c\u5728Terraform\u4e0a\u8fd0\u884c\u7684\u6240\u6709\u547d\u4ee4\u90fd\u5e94\u8be5\u53ef\u4ee5\u5de5\u4f5c\u3002<\/p>\n<p>\u5982\u679c\u60a8\u66fe\u7ecf\u8bbe\u7f6e\u6216\u66f4\u6539\u8fc7Terraform\u7684\u6a21\u5757\u6216\u540e\u7aef\u914d\u7f6e\uff0c\u8bf7\u91cd\u65b0\u8fd0\u884c\u6b64\u547d\u4ee4\u4ee5\u91cd\u65b0\u521d\u59cb\u5316\u60a8\u7684\u5de5\u4f5c\u76ee\u5f55\u3002\u5982\u679c\u60a8\u5fd8\u8bb0\u4e86\uff0c\u5176\u4ed6\u547d\u4ee4\u5c06\u68c0\u6d4b\u5230\u5e76\u63d0\u9192\u60a8\u5fc5\u8981\u65f6\u91cd\u65b0\u8fd0\u884c\u8be5\u547d\u4ee4\u3002<\/p>\n<p>\u521d\u59cb\u5316\u6210\u529f\u540e\uff0c\u8bf7\u6267\u884cterraform plan\u3002<br \/>\n\u60a8\u5c06\u88ab\u8981\u6c42\u8f93\u5165\u5b58\u50a8\u5e10\u6237\u540d\u79f0\u3002\u5b83\u5fc5\u987b\u5728\u5168\u7403\u8303\u56f4\u5185\u662f\u552f\u4e00\u7684\u3002\u8f93\u5165\u4e00\u4e2a\u4e0d\u4e0e\u5176\u4ed6\u540d\u79f0\u91cd\u590d\u7684\u540d\u79f0\u3002<\/p>\n<p>$ terraform plan<\/p>\n<p>var.backend_storage_account_name<br \/>\n\u7528\u4e8eterraform\u540e\u7aef\u7684\u5b58\u50a8\u5e10\u6237\u540d\u79f0<\/p>\n<p>\u8f93\u5165\u503c\uff1a****<\/p>\n<p>\u5982\u679c\u8f93\u51fa\u4ee5\u4e0b\u7c7b\u4f3cterraform plan\u7684\u7ed3\u679c\uff0c\u5219\u8bf4\u660e\u6210\u529f\u3002<\/p>\n<p>\u2026<br \/>\n\u2026<br \/>\n\u8ba1\u5212\uff1a\u6dfb\u52a03\u4e2a\uff0c\u66f4\u65390\u4e2a\uff0c\u9500\u6bc10\u4e2a\u3002<\/p>\n<p>\u6ce8\u610f\uff1a\u5982\u679c\u6ca1\u6709\u767b\u5f55\u5230Azure\uff0c\u5219\u4f1a\u663e\u793a\u4ee5\u4e0b\u9519\u8bef\u6d88\u606f\u3002\u8bf7\u8fd4\u56de\u5e76\u7ee7\u7eed\u4eceaz login\u5f00\u59cb\u3002<\/p>\n<p>\u9519\u8bef\uff1a\u6784\u5efaAzureRM Client\u65f6\u51fa\u9519\uff1a\u4ec5\u652f\u6301\u4ee5\u7528\u6237\uff08\u800c\u4e0d\u662f\u670d\u52a1\u4e3b\u4f53\uff09\u7684\u65b9\u5f0f\u8fdb\u884cAzure CLI\u7684\u8eab\u4efd\u9a8c\u8bc1\u3002<\/p>\n<p>\u6267\u884cterraform apply\u4ee5\u521b\u5efa\u8d44\u6e90\u3002\u5c06\u518d\u6b21\u8981\u6c42\u8f93\u5165\u5b58\u50a8\u5e10\u6237\u540d\u79f0\uff0c\u56e0\u6b64\u8f93\u5165\u4e4b\u524d\u5728terraform plan\u4e2d\u786e\u8ba4\u7684\u540d\u79f0\u3002<\/p>\n<p>$ terraform apply<\/p>\n<p>var.backend_storage_account_name<br \/>\n\u7528\u4e8eTerraform\u540e\u7aef\u7684\u5b58\u50a8\u5e10\u6237\u540d\u79f0<\/p>\n<p>\u8f93\u5165\u503c\uff1a****<\/p>\n<p>\u60a8\u5c06\u6536\u5230\u786e\u8ba4\u6d88\u606f\uff0c\u5982\u679c\u540c\u610f\uff0c\u8bf7\u8f93\u5165yes\u3002<\/p>\n<p>\u2026<br \/>\n\u2026<br \/>\n\u8ba1\u5212\uff1a\u6dfb\u52a03\u4e2a\uff0c\u66f4\u65390\u4e2a\uff0c\u9500\u6bc10\u4e2a\u3002<\/p>\n<p>\u662f\u5426\u8981\u6267\u884c\u8fd9\u4e9b\u64cd\u4f5c\uff1f<br \/>\nTerraform\u5c06\u6267\u884c\u4e0a\u8ff0\u63cf\u8ff0\u7684\u64cd\u4f5c\u3002<br \/>\n\u53ea\u63a5\u53d7\u201cyes\u201d\u4ee5\u6279\u51c6\u3002<\/p>\n<p>\u8f93\u5165\u503c\uff1ayes<\/p>\n<p>\u521b\u5efa\u6210\u529f\u3002\u7a0d\u7b49\u7247\u523b\u3002<\/p>\n<p>azurerm_resource_group.rg: \u521b\u5efa\u4e2d&#8230;<br \/>\nazurerm_resource_group.rg: \u521b\u5efa\u5b8c\u6210\u540e\u7ecf\u8fc70\u79d2[ id=\/subscriptions\/****GUID****\/resourceGroups\/terraform-rg ]<br \/>\nazurerm_storage_account.strg: \u6b63\u5728\u521b\u5efa&#8230;<br \/>\nazurerm_storage_account.strg: \u6b63\u5728\u521b\u5efa&#8230; [\u5df2\u7ecf\u8fc7\u53bb10\u79d2]<br \/>\nazurerm_storage_account.strg: \u6b63\u5728\u521b\u5efa&#8230; [\u5df2\u7ecf\u8fc7\u53bb20\u79d2]<br \/>\nazurerm_storage_account.strg: \u521b\u5efa\u5b8c\u6210\u540e\u7ecf\u8fc720\u79d2 [ id=\/subscriptions\/****GUID****\/resourceGroups\/terraform-rg\/providers\/Microsoft.Storage\/storageAccounts\/****\u4f60\u7684\u5b58\u50a8\u5e10\u6237\u540d\u79f0**** ]<br \/>\nazurerm_storage_container.strg-container: \u521b\u5efa\u4e2d&#8230;<br \/>\nazurerm_storage_container.strg-container: \u521b\u5efa\u5b8c\u6210\u540e\u7ecf\u8fc70\u79d2 [ id=https:\/\/********.blob.core.windows.net\/tfstate ]<\/p>\n<p>\u5982\u679c\u663e\u793a\u4ee5\u4e0b\u6d88\u606f\uff0c\u5219\u8bf4\u660e\u5b8c\u6210\uff01<\/p>\n<p>Apply complete! Resources: 3 added, 0 changed, 0 destroyed.<\/p>\n<p>\u6700\u540e\uff0c\u786e\u8ba4\u4e00\u4e0b\u5b58\u50a8\u5e10\u6237\u662f\u5426\u5df2\u6210\u529f\u521b\u5efa\u3002<\/p>\n<p>$ az group show &#8211;name terraform-rg &#8211;out table<br \/>\n\uff08\u7ed3\u679c\uff09<\/p>\n<p>$ az storage account show &#8211;name &#8216;&lt;\u7528\u60a8\u7684\u540d\u79f0\u66ff\u6362&gt;&#8217; &#8211;out table<br \/>\n\uff08\u7ed3\u679c\uff09<\/p>\n<h1>\u4f7f\u7528GitHub Actions\u8fdb\u884c\u64cd\u4f5c<\/h1>\n<p>\u5982\u679c\u60a8\u4e86\u89e3\u673a\u5236\uff0c\u8bf7\u67e5\u770b\u4ee5\u4e0b\u6587\u4ef6\u7684\u9875\u9762\u6bd4\u8f83\u5feb\u901f\u3002<\/p>\n<h2>\u5728Blob\u5b58\u50a8\u4e2d\uff0c\u51c6\u5907\u8fdc\u7a0b\u72b6\u6001\u6587\u4ef6\u3002<\/h2>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5728GitHub\u7684\u79d8\u5bc6\u4f4d\u7f6e\u4e2d\u5b58\u50a8Azure\u7684\u8ba4\u8bc1\u4fe1\u606f\uff0c\u5373\u670d\u52a1\u4e3b\u4f53\u3002\u8bf7\u7528\u4ee5\u4e0b\u547d\u4ee4\u66ff\u6362:<\/ol>\n<\/li>\n<\/ol>\n<p>az ad sp create-for-rbac &#8211;name &#8220;&#8221; &#8211;role contributor &#8211;sdk-auth<\/p>\n<p>\u5f53\u6267\u884c\u4e0a\u8ff0\u547d\u4ee4\u540e\uff0c\u4f1a\u8fd4\u56de\u4ee5\u4e0bJSON\u7ed3\u679c\u3002\u5728\u540e\u7eed\u7684\u6b65\u9aa4\u4e2d\u4f1a\u4f7f\u7528\u5230\u3002<\/p>\n<p>{<br \/>\n&#8220;clientId&#8221;: &#8220;XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX&#8221;,<br \/>\n&#8220;clientSecret&#8221;: &#8220;XXXXXXXXXXXXXXXXXXXXXXXXXXXXX&#8221;,<br \/>\n&#8220;subscriptionId&#8221;: &#8220;XXXXXXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXXXX&#8221;,<br \/>\n&#8220;tenantId&#8221;: &#8220;XXXXXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXX&#8221;,<br \/>\n&#8230;<br \/>\n}<\/p>\n<p>\u5728GitHub\u7684\u5b58\u50a8\u5e93\u9875\u9762\u4e0a\uff0c\u9009\u62e9&#8221;\u8bbe\u7f6e&#8221;-&gt; &#8220;\u79d8\u5bc6&#8221;\u83dc\u5355\u3002\u4f7f\u7528\u4ee5\u4e0b\u79d8\u5bc6\u540d\u79f0\u6dfb\u52a04\u4e2a\u79d8\u5bc6\u3002<\/p>\n<p>ARM_CLIENT_ID<br \/>\nARM_CLIENT_SECRET<br \/>\nARM_SUBSCRIPTION_ID<br \/>\nARM_TENANT_ID<\/p>\n<p>\u4ece\u5b58\u50a8\u5e93\u4e2d\u768401-hello-azure.yml\u5de5\u4f5c\u6d41\u6587\u4ef6\u4e2d\u63d0\u53d6\u4e00\u90e8\u5206\u5982\u4e0b\u6240\u793a\u3002\u5c06\u4ee5\u4e0b4\u884c\u6dfb\u52a0\u5230env\u53d8\u91cf\u4e2d\u3002<\/p>\n<p>env:<br \/>\ntf_version: &#8216;latest&#8217;<br \/>\ntf_working_dir: &#8217;01-hello-azure&#8217;<br \/>\nGITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}<br \/>\n# add below 4 lines from the result of &#8220;az ad sp create-for-rbac &#8230;&#8221;<br \/>\nARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}<br \/>\nARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}<br \/>\nARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}<br \/>\nARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}<\/p>\n<p>\u7136\u540e\uff0c\u4f7f\u7528hashicorp\/setup-terraform@v1\u7684uses\u547d\u4ee4\u8bbe\u7f6eterraform\u547d\u4ee4\uff1a<\/p>\n<p>&#8211; name: &#8220;Terraform Setup&#8221;<br \/>\nuses: hashicorp\/setup-terraform@v1<br \/>\nwith:<br \/>\nterraform_version: ${{ env.tf_version }}<\/p>\n<p>\u6267\u884c\u5404\u79cdterraform\u547d\u4ee4\uff0c\u4f8b\u5982init, plan, apply\u3002\u5f53\u8fdb\u884cterraform apply\u65f6\uff0c\u6307\u5b9a\u63a8\u9001\u6761\u4ef6\u65f6\uff0c\u5728\u62c9\u53d6\u8bf7\u6c42\u65f6\u4e0d\u4f1a\u6267\u884capply\u64cd\u4f5c\u3002\u800c\u5728\u5408\u5e76\u5e76\u63a8\u9001\u65f6\u4f1a\u53cd\u6620\u914d\u7f6e\u3002\u6b64\u5916\uff0c\u91cd\u8981\u7684\u662f\u8981\u6dfb\u52a0-auto-approve\u9009\u9879\u3002\u5982\u679c\u6ca1\u6709\u8be5\u9009\u9879\uff0c\u5de5\u4f5c\u6d41\u7a0b\u6267\u884c\u65f6\u5c06\u7b49\u5f85yes\u8f93\u5165\u3002<\/p>\n<p>&#8211; if: github.event_name == &#8216;push&#8217;<br \/>\nname: &#8216;Terraform Apply&#8217;<br \/>\nrun: terraform apply -auto-approve<br \/>\nworking-directory: ${{ env.tf_working_dir }}<\/p>\n<h2>\u58f0\u660e\u6307\u5b9a\u6587\u4ef6\u3002<\/h2>\n<p>\u4ece\u4e0b\u6b21\u5f00\u59cb\uff0c\u5728\u6267\u884cterraform init\u65f6\uff0c\u6307\u5b9astate\u6587\u4ef6\u3002<\/p>\n<p>\u7528 HCL \u6587\u4ef6\u5b9a\u4e49\u6587\u4ef6\u7684\u6307\u5b9a\u3002<\/p>\n<pre class=\"post-pre\"><code>resource_group_name  = \"terraform-rg\"\r\nstorage_account_name = \"tfstatehoisjp\" # replace here by yours\r\ncontainer_name       = \"tfstate\"\r\nkey                  = \"terraform.tfstate.00-hello-azure\"\r\n<\/code><\/pre>\n<p>\u4f7f\u7528terraform init\u547d\u4ee4\uff0c\u6307\u5b9a\u6587\u4ef6\u8def\u5f84\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform init -backend-config=backend-prod.hcl\r\n\r\nInitializing the backend...\r\n\r\nSuccessfully configured the backend \"azurerm\"! Terraform will automatically\r\nuse this backend unless the backend configuration changes.\r\n\r\nInitializing provider plugins...\r\n- Finding hashicorp\/azurerm versions matching \"~&gt; 2.71.0\"...\r\n- Installing hashicorp\/azurerm v2.71.0...\r\n- Installed hashicorp\/azurerm v2.71.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>\u5728\u5de5\u4f5c\u6d41\u6587\u4ef6\u4e2d\uff0c\u521d\u59cb\u5316\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre class=\"post-pre\"><code>    - name: 'Terraform Init'\r\n      run: terraform init -backend-config=backend-prod.hcl\r\n      working-directory: ${{ env.tf_working_dir }}\r\n<\/code><\/pre>\n<h1>\u5b9a\u5236<\/h1>\n<p>\u4e00\u65e6\u5f00\u59cb\u52a8\u624b\uff0c\u60a8\u5c31\u4f1a\u60f3\u8981\u5bf9\u5404\u79cd\u73af\u5883\u8fdb\u884c\u81ea\u5b9a\u4e49\u8bbe\u7f6e\u3002\u60a8\u53ef\u4ee5\u901a\u8fc7\u66f4\u6539\u4ee5\u4e0b\u6587\u4ef6\u6765\u8fdb\u884c\u81ea\u5b9a\u4e49\u8bbe\u7f6e\u3002<br \/>\n\u66f4\u591a\u8be6\u60c5\u8bf7\u53c2\u8003VS Code\u7684\u6587\u6863\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">.devcontainer\/devcontainer.json<\/ul>\n<\/li>\n<\/ul>\n<p>.devcontainer\/Dockerfile<\/p>\n<p>Azure CLI \u306e\u30a4\u30e1\u30fc\u30b8 mcr.microsoft.com\/azure-cli:latest \u3092\u30d9\u30fc\u30b9\u306b\u3001Terraform \u5404\u7a2e\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<h2>\u4e2a\u4eba\u5316 dotfiles \u7684\u53e3\u5473\u8c03\u6574<\/h2>\n<p>\u5728\u56e2\u961f\u4e2d\u4f7f\u7528\u8fd9\u4e2a\u5b58\u50a8\u5e93\u975e\u5e38\u65b9\u4fbf\uff0c\u4f46\u53ef\u80fd\u4f1a\u6709\u4e2a\u522b\u504f\u597d\uff0c\u4f8b\u5982Shell\u914d\u7f6e\u3002\u5f53\u9047\u5230\u8fd9\u79cd\u60c5\u51b5\u65f6\uff0c\u6bcf\u4e2a\u7528\u6237\u53ef\u4ee5\u4f7f\u7528\u81ea\u5df1\u7684dotfiles\u5728\u5bb9\u5668\u4e2d\u4e2a\u6027\u5316\u8bbe\u7f6e\u3002\u8ba9\u6211\u4eec\u770b\u4e00\u4e0b\u4ee5\u4e0b\u6587\u4ef6\u7684\u76f8\u5173\u90e8\u5206\u3002<\/p>\n<p>.devcontainer\/devcontainer.json \u7684\u7ffb\u8b6f\u70ba\u4e2d\u6587<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"nl\">\"settings\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"err\">\/\/<\/span> <span class=\"err\">...<\/span>\r\n        <span class=\"err\">\/\/<\/span> <span class=\"err\">dotfiles<\/span>\r\n        <span class=\"nl\">\"dotfiles.repository\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"hoisjp\/terraform-azure-ghactions-devcontainer\"<\/span><span class=\"p\">,<\/span> <span class=\"err\">\/\/<\/span> <span class=\"err\">change<\/span> <span class=\"err\">here<\/span> <span class=\"err\">to<\/span> <span class=\"err\">your<\/span> <span class=\"err\">repository.<\/span>\r\n        <span class=\"nl\">\"dotfiles.targetPath\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"~\/.devcontainer\/dotfiles\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"nl\">\"dotfiles.installCommand\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"~\/.devcontainer\/dotfiles\/install.sh\"<\/span>\r\n    <span class=\"p\">}<\/span><span class=\"err\">,<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u60a8\u5728\u6b64\u66f4\u6539 dotfiles \u5b58\u50a8\u5e93\u7684\u5f15\u7528\u4f4d\u7f6e\uff0c\u5b83\u4f1a\u5728\u521b\u5efa\u5bb9\u5668\u65f6\u5e94\u7528\u3002<br \/>\n\u8bf7\u53c2\u8003\u6b64\u6587\u6863\u4ee5\u4e86\u89e3\u5176\u5de5\u4f5c\u539f\u7406\u3002 \u4f7f\u7528 dotfile \u5b58\u50a8\u5e93\u8fdb\u884c\u4e2a\u6027\u5316\u3002<\/p>\n<h1>\u603b\u7ed3<\/h1>\n<p>VS Code \u7684 Remote Development \u529f\u80fd\u975e\u5e38\u5f37\u5927\u3002\u901a\u904e\u9019\u500b\u529f\u80fd\uff0c\u5718\u968a\u6210\u54e1\u53ef\u4ee5\u8f15\u9b06\u81ea\u7136\u5730\u5171\u4eab\u5b8c\u5168\u76f8\u540c\u7684\u5bb9\u5668\u74b0\u5883\uff0c\u800c\u4e0d\u9700\u8981\u9032\u884c\u7279\u6b8a\u7684\u52aa\u529b\uff08\u9019\u662f\u975e\u5e38\u91cd\u8981\u7684\uff09\u3002<\/p>\n<p>\u4ee5\u5f80\uff0c\u5728\u5b89\u88dd Azure CLI \u548c Terraform \u7b49\u6e96\u5099\u5de5\u4f5c\u65b9\u9762\uff0c\u5718\u968a\u4e2d\u7684\u6bcf\u500b\u4eba\u90fd\u9700\u8981\u5206\u5225\u9032\u884c\u3002\u4f46\u662f\u73fe\u5728\uff0c\u901a\u904e\u4f7f\u7528 devcontainer \u7684\u6a5f\u5236\uff0c\u6211\u5011\u518d\u4e5f\u4e0d\u9700\u8981\u50cf\u300c\u74b0\u5883\u6e96\u5099\u624b\u518a\u300d\u90a3\u6a23\u7684\u6771\u897f\u4e86\u3002\u74b0\u5883\u8a2d\u7f6e\u90fd\u5728 Git \u4e0a\u9032\u884c\u7ba1\u7406\u3002\u5982\u679c\u6709\u4eba\u6539\u9032\u4e86\u74b0\u5883\uff0c\u9019\u4e9b\u6539\u9032\u6703\u7acb\u5373\u53cd\u6620\u5728\u6574\u500b\u5718\u968a\u8eab\u4e0a\u3002<\/p>\n<p>\u73fe\u5728\u53ef\u4ee5\u5c08\u6ce8\u65bc Azure \u548c Terraform \u4e86\uff01<\/p>\n<h1>\u8bf7\u53c2\u8003\u4ee5\u4e0a\u5185\u5bb9\u3002<\/h1>\n<h2>V S Code \u6587\u6863<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Developing inside a Container : https:\/\/code.visualstudio.com\/docs\/remote\/containers<\/ul>\n<\/li>\n<\/ul>\n<p>VS Code \u672c\u3092\u66f8\u304d\u307e\u3057\u305f\u306e\u3067\u3088\u304b\u3063\u305f\u3089\uff01 : https:\/\/www.amazon.co.jp\/dp\/4839970920\/<\/p>\n<h2>Azure \u7684 Terraform \u6587\u4ef6<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/docs.microsoft.com\/en-us\/azure\/developer\/terraform\/<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Terraform &#8211; Azure Provider : https:\/\/www.terraform.io\/docs\/providers\/azurerm\/index.html<\/ul>\n<\/li>\n<\/ul>\n<p>Terraform &#8211; Azure Provider &#8211; GitHub Repos<br \/>\nTerraform &#8211; Azure Provider &#8211; GitHub Repos &#8211; Examples<\/p>\n<h2>Azure\u7684GitHub Actions\u6587\u6863<\/h2>\n<ul class=\"post-ul\">https:\/\/docs.microsoft.com\/ja-jp\/azure\/developer\/github\/github-actions<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u5f15\u8a00 \u6211\u4f7f\u7528 Fork \u548c Clone \u6765\u521b\u5efa\u4e86\u4e00\u4e2a\u80fd\u591f\u5feb\u901f\u5728 Azure \u4e0a\u4f7f\u7528 Terraform \u7684 d [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48665","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>\u4e2d\u6587\uff1a\u4f7f\u7528VS Code Remote Container\u914d\u7f6eAzure + Terraform + GitHub Actions\u73af\u5883 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4e2d\u6587\uff1a\u4f7f\u7528vs-code-remote-container\u914d\u7f6eazure-terraform-github-actions\u73af\u5883\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4e2d\u6587\uff1a\u4f7f\u7528VS Code Remote Container\u914d\u7f6eAzure + Terraform + GitHub Actions\u73af\u5883\" \/>\n<meta property=\"og:description\" content=\"\u5f15\u8a00 \u6211\u4f7f\u7528 Fork \u548c Clone \u6765\u521b\u5efa\u4e86\u4e00\u4e2a\u80fd\u591f\u5feb\u901f\u5728 Azure \u4e0a\u4f7f\u7528 Terraform \u7684 d [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4e2d\u6587\uff1a\u4f7f\u7528vs-code-remote-container\u914d\u7f6eazure-terraform-github-actions\u73af\u5883\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-07-02T19:17:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T04:23:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8691913a08637a6bd80c\/9-1.png\" \/>\n<meta name=\"author\" content=\"\u5b87, \u534e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u5b87, \u534e\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/\",\"name\":\"\u4e2d\u6587\uff1a\u4f7f\u7528VS Code Remote Container\u914d\u7f6eAzure + Terraform + GitHub Actions\u73af\u5883 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-07-02T19:17:02+00:00\",\"dateModified\":\"2024-04-29T04:23:32+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4e2d\u6587\uff1a\u4f7f\u7528VS Code Remote Container\u914d\u7f6eAzure + Terraform + GitHub Actions\u73af\u5883\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\",\"name\":\"\u5b87, \u534e\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"caption\":\"\u5b87, \u534e\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4e2d\u6587\uff1a\u4f7f\u7528VS Code Remote Container\u914d\u7f6eAzure + Terraform + GitHub Actions\u73af\u5883 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4e2d\u6587\uff1a\u4f7f\u7528vs-code-remote-container\u914d\u7f6eazure-terraform-github-actions\u73af\u5883\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4e2d\u6587\uff1a\u4f7f\u7528VS Code Remote Container\u914d\u7f6eAzure + Terraform + GitHub Actions\u73af\u5883","og_description":"\u5f15\u8a00 \u6211\u4f7f\u7528 Fork \u548c Clone \u6765\u521b\u5efa\u4e86\u4e00\u4e2a\u80fd\u591f\u5feb\u901f\u5728 Azure \u4e0a\u4f7f\u7528 Terraform \u7684 d [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4e2d\u6587\uff1a\u4f7f\u7528vs-code-remote-container\u914d\u7f6eazure-terraform-github-actions\u73af\u5883\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-07-02T19:17:02+00:00","article_modified_time":"2024-04-29T04:23:32+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8691913a08637a6bd80c\/9-1.png"}],"author":"\u5b87, \u534e","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u5b87, \u534e","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"3 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/","name":"\u4e2d\u6587\uff1a\u4f7f\u7528VS Code Remote Container\u914d\u7f6eAzure + Terraform + GitHub Actions\u73af\u5883 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-07-02T19:17:02+00:00","dateModified":"2024-04-29T04:23:32+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4e2d\u6587\uff1a\u4f7f\u7528VS Code Remote Container\u914d\u7f6eAzure + Terraform + GitHub Actions\u73af\u5883"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458","name":"\u5b87, \u534e","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","caption":"\u5b87, \u534e"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%b8%ad%e6%96%87%ef%bc%9a%e4%bd%bf%e7%94%a8vs-code-remote-container%e9%85%8d%e7%bd%aeazure-terraform-github-actions%e7%8e%af%e5%a2%83\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48665","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\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48665"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48665\/revisions"}],"predecessor-version":[{"id":85255,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48665\/revisions\/85255"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48665"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48665"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48665"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}