{"id":48738,"date":"2023-05-24T17:46:21","date_gmt":"2023-11-01T08:14:13","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/"},"modified":"2024-01-15T12:42:12","modified_gmt":"2024-01-15T04:42:12","slug":"%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/","title":{"rendered":"\u5730\u7403\u5f62\u6210\u88c5\u7f6e\u7684\u5b89\u88c5\u548c\u4f7f\u7528\u65b9\u6cd5\uff08Google Cloud\u3001AWS\u3001Azure\u3001Datadog\uff09\uff0c\u4ee5\u53ca\u901a\u8fc7gcloud\u751f\u6210terraform\u4ee3\u7801"},"content":{"rendered":"<h2>\u9996\u5148<\/h2>\n<p>\u6709\u4e00\u6b3e\u540d\u4e3aTerraformer\u7684\u4e91\u5de5\u5177\uff0c\u53ef\u4ee5\u6839\u636e\u73b0\u6709\u72b6\u6001\u751f\u6210Terraform\u4ee3\u7801\uff08\u7531Google\u65d7\u4e0b\u7684Waze\u516c\u53f8SRE\u56e2\u961f\u5f00\u53d1\uff09\u3002<br \/>\n\u5728\u8fd9\u91cc\uff0c\u6211\u4eec\u5c06\u603b\u7ed3\u5b89\u88c5\u65b9\u6cd5\u5e76\u9a8c\u8bc1\u4e86\u5404\u4e2a\u4e91\u5e73\u53f0\uff08Google Cloud\u3001AWS\u3001Azure\u3001Datadog\uff09\u7684\u64cd\u4f5c\u7ed3\u679c\u3002<br \/>\n\u53e6\u5916\uff0cGoogle Cloud\u8fd8\u63d0\u4f9bgcloud\u9884\u89c8\u7248\uff0c\u53ef\u7528\u4e8e\u751f\u6210Terraform\u4ee3\u7801\uff0c\u4e5f\u4f1a\u5728\u6b64\u8fdb\u884c\u8bf4\u660e\u3002<\/p>\n<h2>\u5730\u7403\u6539\u9020\u8005 \u5b89\u88c5<\/h2>\n<p>\u8bf7\u53c2\u8003\u6587\u6863\u4e2d\u7684\u5b89\u88c5\u4f4d\u7f6e\u8fdb\u884c\u64cd\u4f5c\uff0c\u4ece GitHub \u4e0b\u8f7d\u6700\u65b0\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\u5e76\u5c06\u5176\u91cd\u547d\u540d\u540e\u653e\u7f6e\u5728\u6307\u5b9a\u8def\u5f84\u4e0a\u3002<\/p>\n<h3>\u64cd\u4f5c\u7cfb\u7edf<\/h3>\n<p>\u5ca9\u77f3Linux\u53d1\u5e039.1\u7248\uff08\u84dd\u739b\u7459\uff09<\/p>\n<h3>\u5b89\u88c5\u6b65\u9aa4 (Shell)<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nb\">export <\/span><span class=\"nv\">PROVIDER<\/span><span class=\"o\">=<\/span>all\r\ncurl <span class=\"nt\">-LO<\/span> https:\/\/github.com\/GoogleCloudPlatform\/terraformer\/releases\/download\/<span class=\"si\">$(<\/span>curl <span class=\"nt\">-s<\/span> https:\/\/api.github.com\/repos\/GoogleCloudPlatform\/terraformer\/releases\/latest | <span class=\"nb\">grep <\/span>tag_name | <span class=\"nb\">cut<\/span> <span class=\"nt\">-d<\/span> <span class=\"s1\">'\"'<\/span> <span class=\"nt\">-f<\/span> 4<span class=\"si\">)<\/span>\/terraformer-<span class=\"k\">${<\/span><span class=\"nv\">PROVIDER<\/span><span class=\"k\">}<\/span><span class=\"nt\">-linux-amd64<\/span>\r\n<span class=\"nb\">chmod<\/span> +x terraformer-<span class=\"k\">${<\/span><span class=\"nv\">PROVIDER<\/span><span class=\"k\">}<\/span><span class=\"nt\">-linux-amd64<\/span>\r\n<span class=\"nb\">sudo mv <\/span>terraformer-<span class=\"k\">${<\/span><span class=\"nv\">PROVIDER<\/span><span class=\"k\">}<\/span><span class=\"nt\">-linux-amd64<\/span> \/usr\/local\/bin\/terraformer\r\n<\/code><\/pre>\n<h3>Ansible Tasks\u7684\u5b89\u88c5\u65b9\u6cd5<\/h3>\n<pre class=\"post-pre\"><code><span class=\"c1\"># https:\/\/github.com\/GoogleCloudPlatform\/terraformer#installation<\/span>\r\n<span class=\"c1\">## 0.8.22 = tag_name \/ latest check \"curl -s https:\/\/api.github.com\/repos\/GoogleCloudPlatform\/terraformer\/releases\/latest | grep tag_name\"<\/span>\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">install terraformer 0.8.22<\/span>\r\n  <span class=\"na\">get_url<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">url<\/span><span class=\"pi\">:<\/span> <span class=\"s\">https:\/\/github.com\/GoogleCloudPlatform\/terraformer\/releases\/download\/0.8.22\/terraformer-all-linux-amd64<\/span>\r\n    <span class=\"na\">dest<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/usr\/local\/bin\/terraformer<\/span>\r\n    <span class=\"na\">mode<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">+x\"<\/span>\r\n  <span class=\"na\">become<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yes<\/span>\r\n<\/code><\/pre>\n<p>\u203b 0.8.22 \u662f\u6839\u636e\u5f53\u65f6\u8bb0\u5f55\u7684\u7248\u672c\u3002<\/p>\n<h3>\u8bf7\u786e\u8ba4\u662f\u5426\u5df2\u5b89\u88c5\u5730\u8868\u6539\u9020\u8005\u3002<\/h3>\n<p>\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u8bf7\u8f93\u5165\u547d\u4ee4\u4ee5\u786e\u8ba4\u662f\u5426\u5df2\u8fdb\u5165\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraformer <span class=\"nt\">-v<\/span>\r\nversion v0.8.22\r\n<\/code><\/pre>\n<h2>\u5b89\u88c5 Google Cloud \u7684 google-cloud-sdk-config-connector\uff08gcloud terraform \u4ee3\u7801\u751f\u6210\u6269\u5c55\uff09\u3002<\/h2>\n<p>\u5728\u5b89\u88c5\u811a\u672c\u548c\u5b58\u50a8\u5e93\u4e0a\u63d0\u4f9b\u4e86\u5b89\u88c5\u65b9\u6cd5\u3002<br \/>\n\u5728\u8fd9\u91cc\uff0c\u5c06\u4ecb\u7ecd\u4f7f\u7528\u5b58\u50a8\u5e93\u8fdb\u884c\u5b89\u88c5\u3002<\/p>\n<h3>\u624b\u52a8\u5b89\u88c5\u65b9\u6cd5<\/h3>\n<p>\u6839\u636e\u6587\u68631\u548c\u6587\u68632\u7684\u8bbe\u7f6e\u8fdb\u884c\u8bbe\u5b9a\u3002<br \/>\n\u7531\u4e8e\u670d\u52a1\u8d26\u53f7\u53ef\u80fd\u65e0\u6cd5\u81ea\u52a8\u521b\u5efa\uff0c\u56e0\u6b64\u6dfb\u52a0\u4e86\u751f\u6210\u547d\u4ee4\uff08\u6587\u6863\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">sudo tee<\/span> <span class=\"nt\">-a<\/span> \/etc\/yum.repos.d\/google-cloud-sdk.repo <span class=\"o\">&lt;&lt;<\/span> <span class=\"no\">EOM<\/span><span class=\"sh\">\r\n[google-cloud-cli]\r\nname=Google Cloud CLI\r\nbaseurl=https:\/\/packages.cloud.google.com\/yum\/repos\/cloud-sdk-el8-x86_64\r\nenabled=1\r\ngpgcheck=1\r\nrepo_gpgcheck=0\r\ngpgkey=https:\/\/packages.cloud.google.com\/yum\/doc\/rpm-package-key.gpg\r\n<\/span><span class=\"no\">EOM\r\n<\/span><span class=\"nb\">sudo <\/span>dnf <span class=\"nb\">install <\/span>google-cloud-cli\r\n\r\n<span class=\"nb\">export <\/span><span class=\"nv\">PROJECT_ID<\/span><span class=\"o\">=[]<\/span>\r\n<span class=\"nb\">export <\/span><span class=\"nv\">PROJECT_NUMBER<\/span><span class=\"o\">=[]<\/span>\r\ngcloud components <span class=\"nb\">install <\/span>config-connector\r\ngcloud services <span class=\"nb\">enable <\/span>cloudasset.googleapis.com <span class=\"nt\">--project<\/span> <span class=\"nv\">$PROJECT_ID<\/span>\r\ngcloud beta services identity create <span class=\"nt\">--service<\/span><span class=\"o\">=<\/span>cloudasset.googleapis.com <span class=\"nt\">--project<\/span> <span class=\"nv\">$PROJECT_ID<\/span>\r\ngcloud <span class=\"nt\">--project<\/span> <span class=\"nv\">$PROJECT_ID<\/span> projects add-iam-policy-binding <span class=\"nv\">$PROJECT_ID<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--member<\/span><span class=\"o\">=<\/span>serviceAccount:service-<span class=\"nv\">$PROJECT_NUMBER<\/span>@gcp-sa-cloudasset.iam.gserviceaccount.com <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--role<\/span><span class=\"o\">=<\/span>roles\/servicenetworking.serviceAgent\r\ngcloud <span class=\"nt\">--project<\/span> <span class=\"nv\">$PROJECT_ID<\/span> projects add-iam-policy-binding <span class=\"nv\">$PROJECT_ID<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--member<\/span><span class=\"o\">=<\/span>serviceAccount:service-<span class=\"nv\">$PROJECT_NUMBER<\/span>@gcp-sa-cloudasset.iam.gserviceaccount.com <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--role<\/span><span class=\"o\">=<\/span>roles\/storage.objectAdmin\r\n<\/code><\/pre>\n<h3>\u5b89\u88c5\u65b9\u6cd5\uff08Ansible\uff0cTerraform\uff09<\/h3>\n<p>\u5728\u672c\u5730\u4f7f\u7528Ansible\u8fdb\u884c\u5b89\u88c5\u914d\u7f6e\uff0c\u4f7f\u7528Terraform\u5728\u4e91\u7aef\u8fdb\u884c\u8bbe\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">install yum repository<\/span>\r\n  <span class=\"s\">yum_repository<\/span><span class=\"err\">:<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">google-cloud-sdk<\/span>\r\n    <span class=\"na\">description<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">Google<\/span> <span class=\"s\">Cloud<\/span> <span class=\"s\">SDK<\/span> <span class=\"s\">repo\"<\/span>\r\n    <span class=\"na\">baseurl<\/span><span class=\"pi\">:<\/span> <span class=\"s\">https:\/\/packages.cloud.google.com\/yum\/repos\/cloud-sdk-el8-x86_64<\/span>\r\n    <span class=\"na\">enabled<\/span><span class=\"pi\">:<\/span> <span class=\"s\">no<\/span>\r\n    <span class=\"na\">gpgcheck<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yes<\/span>\r\n    <span class=\"na\">repo_gpgcheck<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yes<\/span>\r\n    <span class=\"na\">gpgkey<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">https:\/\/packages.cloud.google.com\/yum\/doc\/yum-key.gpg<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">https:\/\/packages.cloud.google.com\/yum\/doc\/rpm-package-key.gpg<\/span>\r\n  <span class=\"na\">become<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span>\r\n\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">install google cloud sdk<\/span>\r\n  <span class=\"na\">dnf<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">google-cloud-sdk<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">latest<\/span>\r\n    <span class=\"na\">enablerepo<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">google-cloud-sdk\"<\/span>\r\n  <span class=\"na\">become<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span>\r\n\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">install google-cloud-sdk components<\/span>\r\n  <span class=\"na\">dnf<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">packages<\/span> <span class=\"s\">}}\"<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">latest<\/span>\r\n    <span class=\"na\">update_cache<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yes<\/span>\r\n    <span class=\"na\">enablerepo<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">google-cloud-sdk\"<\/span>\r\n  <span class=\"na\">vars<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">packages<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">google-cloud-sdk-config-connector<\/span>\r\n  <span class=\"na\">become<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span>\r\n\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"google_project_service\"<\/span> <span class=\"s2\">\"cloudasset_api_enable\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">project<\/span>                    <span class=\"p\">=<\/span> <span class=\"nx\">google_project<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">disable_dependent_services<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"nx\">service<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"cloudasset.googleapis.com\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"google_project_service_identity\"<\/span> <span class=\"s2\">\"cloudasset_sa\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">provider<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">google<\/span><span class=\"err\">-<\/span><span class=\"nx\">beta<\/span>\r\n  <span class=\"nx\">project<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">google_project<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n\r\n  <span class=\"nx\">service<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"cloudasset.googleapis.com\"<\/span>\r\n  <span class=\"nx\">depends_on<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"nx\">google_project_service<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudasset_api_enable<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"google_project_iam_binding\"<\/span> <span class=\"s2\">\"servicenetworking_serviceagent\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">project<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">google_project<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n\r\n  <span class=\"nx\">role<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"roles\/servicenetworking.serviceAgent\"<\/span>\r\n\r\n  <span class=\"nx\">members<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"s2\">\"serviceAccount:service-<\/span><span class=\"k\">${<\/span><span class=\"nx\">google_project<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">number<\/span><span class=\"k\">}<\/span><span class=\"s2\">@gcp-sa-cloudasset.iam.gserviceaccount.com\"<\/span>\r\n  <span class=\"p\">]<\/span>\r\n  <span class=\"nx\">depends_on<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"nx\">google_project_service_identity<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudasset_sa<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"google_project_iam_binding\"<\/span> <span class=\"s2\">\"storage_objectadmin\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">project<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">google_project<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n\r\n  <span class=\"nx\">role<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"roles\/storage.objectAdmin\"<\/span>\r\n\r\n  <span class=\"nx\">members<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"s2\">\"serviceAccount:service-<\/span><span class=\"k\">${<\/span><span class=\"nx\">google_project<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">number<\/span><span class=\"k\">}<\/span><span class=\"s2\">@gcp-sa-cloudasset.iam.gserviceaccount.com\"<\/span>\r\n  <span class=\"p\">]<\/span>\r\n  <span class=\"nx\">depends_on<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"nx\">google_project_service_identity<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudasset_sa<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u5728\u8c37\u6b4c\u4e91\u4e0a\u7684\u4f7f\u7528\u65b9\u5f0f<\/h2>\n<p>Google Cloud \u53ef\u4ee5\u4f7f\u7528 Terraformer \u548c gcloud \u4e24\u79cd\u65b9\u6cd5\u6765\u751f\u6210 Terraform \u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u5176\u5206\u5f00\u8bf4\u660e\u3002<\/p>\n<h3>\u9020\u5730\u8005<\/h3>\n<p>\u4e3a\u4e86\u914d\u7f6e Terraform \u6267\u884c\u73af\u5883\uff0c\u53ef\u4ee5\u5728 version.tf \u6587\u4ef6\u4e2d\u6307\u5b9a provider \u548c version\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">mkdir <\/span>google-terraformer\r\n<span class=\"nb\">cd <\/span>google-terraformer\r\nvi version.tf\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">required_providers<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">google<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">source<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"hashicorp\/google\"<\/span>\r\n      <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"4.52.0\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"&gt;= 0.13\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u901a\u8fc7\u5728\u73af\u5883\u53d8\u91cf\u4e2d\u521b\u5efa\u5305\u542b\u6240\u9700\u6267\u884c\u6743\u9650\u7684\u670d\u52a1\u8d26\u53f7\u5bc6\u94a5\u548c\u76ee\u6807\u9879\u76ee\uff0c\u5e76\u5728terraform init\u4e2d\u8fdb\u884c\u521d\u59cb\u5316\u3002\u7701\u7565\u4e86&#8221;GOOGLE_APPLICATION_CREDENTIALS&#8221;\u7684\u89e3\u91ca\uff08\u6587\u4ef6\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">export <\/span><span class=\"nv\">GOOGLE_APPLICATION_CREDENTIALS<\/span><span class=\"o\">=[<\/span>YOUR TERRORM SERVICE ACCOUT KEY JSON]\r\n<span class=\"nb\">export <\/span><span class=\"nv\">GCP_PROJECT<\/span><span class=\"o\">=[<\/span>YOUR GCP PROJECT ID]\r\nterraform init\r\n<\/code><\/pre>\n<p>\u5728\u4ee5\u4e0b\u4e2d\u5c1d\u8bd5\u4f7f\u7528Terraformer\u5bfc\u5165\uff1a<br \/>\n\u4e3aIAM\u6267\u884c\u9700\u8981\u5305\u542b\u8bbf\u95ee\u8005\u548c\u670d\u52a1\u8d26\u53f7\u7684\u53c2\u8003\u6743\u9650\u3002<\/p>\n<pre class=\"post-pre\"><code>terraformer import google <span class=\"nt\">-r<\/span> project,iam <span class=\"nt\">--projects<\/span><span class=\"o\">=<\/span><span class=\"nv\">$GCP_PROJECT<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u4e0d\u6307\u5b9a-z [\u5730\u533a]\u9009\u9879\uff0c\u5219\u4f1a\u751f\u6210\u5982\u4e0b\u6240\u793a\u7684Terraform\u4ee3\u7801\u7ed3\u6784\uff0c\u800c\u9ed8\u8ba4\u503c\u4e3aglobal\uff0c\u6240\u4ee5\u5fc5\u987b\u6dfb\u52a0\u7c7b\u4f3c-z asia-northeast1\u7684\u9009\u9879\u624d\u80fd\u83b7\u53d6\u5730\u533a\u8d44\u6e90\u3002<\/p>\n<pre class=\"post-pre\"><code>|-- generated\r\n|   <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> google\r\n|       <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> <span class=\"o\">[<\/span>GCP_PROJECT]\r\n|           |-- iam\r\n|           |   <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> global\r\n|           |       |-- outputs.tf\r\n|           |       |-- project_iam_member.tf\r\n|           |       |-- provider.tf\r\n|           |       <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> terraform.tfstate\r\n|           <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> project\r\n|               <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> global\r\n|                   |-- outputs.tf\r\n|                   |-- project.tf\r\n|                   |-- provider.tf\r\n|                   <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> terraform.tfstate\r\n<span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> version.tf\r\n<\/code><\/pre>\n<p>\u5982\u679c\u60f3\u8981\u5c06\u6240\u6709\u5185\u5bb9\u4f5c\u4e3a\u5bf9\u8c61\uff0c\u8bf7\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u8fdb\u884c -r=&#8221;*&#8221; \uff0c\u70b9\u51fb\u4e0b\u9762\u66f4\u8be6\u5c3d\u7684\u8bf4\u660e\uff08\u7136\u800c\uff0c\u8981\u8bbf\u95ee Terraformer \u652f\u6301\u7684\u6240\u6709\u670d\u52a1\u53ef\u80fd\u4f1a\u5bfc\u81f4\u9891\u7e41\u7684\u9519\u8bef\uff0c\u56e0\u6b64\u6700\u597d\u5728\u4f7f\u7528\u201c*\u201d\u65f6\u91c7\u7528 roles\/owner \u8fdb\u884c\u64cd\u4f5c\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code>terraformer import google -r=\"*\" --projects=$GCP_PROJECT\r\n<\/code><\/pre>\n<p>\u5982\u679c\u5728\u6240\u6709\u8d44\u6e90\u4e0a\u6267\u884c\uff0c\u5c06\u4f1a\u6309\u7167\u4ee5\u4e0b\u7684\u6587\u4ef6\u5939\u7ed3\u6784\u8fdb\u884c\u521b\u5efa<br \/>\n\uff08\u5982\u679c\u6ca1\u6709\u8d44\u6e90\uff0c\u5219\u53ea\u4f1a\u521b\u5efaprovider.tf\u548cterraform.tfstate\u8fd9\u4e24\u4e2a\u6587\u4ef6\uff0c\u5176\u4e2d\u53ea\u6307\u5b9aprovider\u548cversion\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">ls <\/span>generated\/google\/<span class=\"nv\">$GCP_PROJECT<\/span>\/\r\naddresses        dns                    healthChecks           instances                nodeGroups             regionHealthChecks           resourcePolicies  targetHttpProxies   vpnTunnels\r\nautoscalers      externalVpnGateways    httpHealthChecks       interconnectAttachments  nodeTemplates          regionInstanceGroupManagers  routers           targetHttpsProxies\r\nbackendBuckets   firewall               httpsHealthChecks      kms                      packetMirrorings       regionInstanceGroups         routes            targetInstances\r\nbackendServices  forwardingRules        iam                    logging                  project                regionSslCertificates        schedulerJobs     targetPools\r\nbigQuery         gcs                    images                 memoryStore              pubsub                 regionTargetHttpProxies      securityPolicies  targetSslProxies\r\ncloudFunctions   gke                    instanceGroupManagers  monitoring               regionAutoscalers      regionTargetHttpsProxies     sslCertificates   targetTcpProxies\r\ndataProc         globalAddresses        instanceGroups         networkEndpointGroups    regionBackendServices  regionUrlMaps                sslPolicies       targetVpnGateways\r\ndisks            globalForwardingRules  instanceTemplates      networks                 regionDisks            reservations                 subnetworks       urlMaps\r\n\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">ls <\/span>generated\/google\/<span class=\"nv\">$GCP_PROJECT<\/span>\/cloudFunctions\/global\/\r\nprovider.tf  terraform.tfstate\r\n<\/code><\/pre>\n<p>\u8981\u6267\u884c\u751f\u6210\u7684\u4ee3\u7801\uff0c\u9700\u8981\u5148\u5728\u76ee\u6807\u6587\u4ef6\u5939\u4e2d\u79fb\u52a8\u5230\u8be5\u4f4d\u7f6e\uff0c\u7136\u540e\u518d\u6267\u884c\u3002\u5982\u679c\u76f4\u63a5\u6267\u884c\uff0c\u4f1a\u51fa\u73b0\u5982\u4e0b\u9519\u8bef\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>generated\/google\/<span class=\"nv\">$GCP_PROJECT<\/span>\/iam\/global\/\r\n<span class=\"nv\">$ <\/span>terraform init\r\nInitializing the backend...\r\n\u2577\r\n\u2502 Error: Invalid legacy provider address\r\n\u2502 \r\n\u2502 This configuration or its associated state refers to the unqualified provider <span class=\"s2\">\"google\"<\/span><span class=\"nb\">.<\/span>\r\n\u2502 \r\n\u2502 You must <span class=\"nb\">complete <\/span>the Terraform 0.13 upgrade process before upgrading to later versions.\r\n<\/code><\/pre>\n<p>\u7531\u4e8e terraformer \u662f\u57fa\u4e8e terraform \u7248\u672c 0.13\uff0c\u6240\u4ee5\u6839\u636e\u6587\u6863\u6267\u884c replace \u547d\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform state replace-provider registry.terraform.io\/-\/google hashicorp\/google\r\nTerraform will perform the following actions:\r\n\r\n  ~ Updating provider:\r\n    - registry.terraform.io\/-\/google\r\n    + registry.terraform.io\/hashicorp\/google\r\n...\u7701\u7565...\r\n<\/code><\/pre>\n<p>\u518d\u6b21\u5b9e\u65bd\u540e\u53ef\u4ee5\u65e0\u95ee\u9898\u5730\u4f7f\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform init\r\nInitializing the backend...\r\n\r\nInitializing provider plugins...\r\n- Finding hashicorp\/google versions matching <span class=\"s2\">\"~&gt; 4.52.0\"<\/span>...\r\n- Installing hashicorp\/google v4.52.0...\r\n- Installed hashicorp\/google v4.52.0 <span class=\"o\">(<\/span>signed by HashiCorp<span class=\"o\">)<\/span>\r\n\r\nTerraform has created a lock file .terraform.lock.hcl to record the provider\r\nselections it made above. Include this file <span class=\"k\">in <\/span>your version control repository\r\nso that Terraform can guarantee to make the same selections by default when\r\nyou run <span class=\"s2\">\"terraform init\"<\/span> <span class=\"k\">in <\/span>the future.\r\n\r\nTerraform has been successfully initialized!\r\n\r\n...\u7701\u7565...\r\n\r\n<span class=\"nv\">$ <\/span>terraform plan\r\n...\u7701\u7565...\r\nNo changes. Your infrastructure matches the configuration.\r\n\r\nTerraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u662f\u8f93\u51fa\u4ee3\u7801\u793a\u4f8b\uff08\u9879\u76ee\uff0c\u7528\u6237\u57df\u540d\u5df2\u5c4f\u853d\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"google_project_iam_member\"<\/span> <span class=\"s2\">\"tfer--roles-002F-owneruser-003A-suzuyu-0040-xxxxx-002E-xxxxx-002E-xxxxx\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">member<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"user:suzuyu@xxxxx.xxxxx.xxx\"<\/span>\r\n  <span class=\"nx\">project<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"suzuyu-xxx-xxx-xxx\"<\/span>\r\n  <span class=\"nx\">role<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"roles\/owner\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u4f7f\u7528gcloud\u8d44\u6e90\u914d\u7f6ebulk-export\u547d\u4ee4\u8fdb\u884c\u6279\u91cf\u5bfc\u51fa\uff0c&#8211;resource-format=terraform\u683c\u5f0f\u3002<\/h3>\n<p>\u6309\u7167\u6587\u6863\u7684\u6307\u793a\uff0c\u60a8\u53ef\u4ee5\u6307\u5b9a\u8f93\u51fa\u6587\u4ef6\u5939\uff0c\u5e76\u9650\u5236\u751f\u6210\u8d44\u6e90\u7684\u8303\u56f4\uff0c\u4ee5\u8fdb\u884c\u6267\u884c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">mkdir <\/span>tf-output \r\n<span class=\"nb\">export <\/span><span class=\"nv\">GCP_PROJECT<\/span><span class=\"o\">=[<\/span>YOUR GCP PROJECT ID]\r\ngcloud auth activate-service-account <span class=\"o\">[<\/span>YOUR TERRAFORM SERVICE ACCOUNT] <span class=\"nt\">--key-file<\/span><span class=\"o\">=[<\/span>YOUR TERRAFORM SERVICE ACCOUNT KEY FILE]\r\ngcloud beta resource-config bulk-export <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--resource-types<\/span><span class=\"o\">=<\/span>Project,IAMServiceAccount <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--project<\/span><span class=\"o\">=<\/span><span class=\"nv\">$GCP_PROJECT<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--resource-format<\/span><span class=\"o\">=<\/span>terraform <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--path<\/span><span class=\"o\">=<\/span>tf-output\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>gcloud beta resource-config bulk-export <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--resource-types<\/span><span class=\"o\">=<\/span>Project,IAMServiceAccount <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--project<\/span><span class=\"o\">=<\/span><span class=\"nv\">$GCP_PROJECT<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--resource-format<\/span><span class=\"o\">=<\/span>terraform <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--path<\/span><span class=\"o\">=<\/span>tf-output\r\n\r\nExporting resource configurations to <span class=\"o\">[<\/span>tf-output]...done.                                                                                                                                \r\nExported resource configuration<span class=\"o\">(<\/span>s<span class=\"o\">)<\/span> to <span class=\"o\">[<\/span>tf-output].\r\n\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>tf-output<span class=\"p\">;<\/span> tree\r\n|-- <span class=\"o\">[<\/span>MASK Folder Number]\r\n|   <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> Project\r\n|       <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> <span class=\"o\">[<\/span>MASK PROJECT ID].tf\r\n<span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> projects\r\n    <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> <span class=\"o\">[<\/span>MASK PROJECT ID]\r\n        <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> IAMServiceAccount\r\n            |-- <span class=\"o\">[<\/span>MASK PROJECT NUMBER]-compute.tf\r\n            <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> <span class=\"o\">[<\/span>MASK ACCOUNT ID].tf\r\n<\/code><\/pre>\n<p>\u4e0e\u4e0a\u8ff0\u8f93\u51fa\u4e0d\u540c\uff0c\u751f\u6210\u7684\u4ee3\u7801\u4ec5\u4e3a.tf\u4ee3\u7801\uff0c\u4e0d\u4f1a\u751f\u6210\u7c7b\u4f3c\u4e8e state \u6587\u4ef6\u7684\u5185\u5bb9\u3002<\/p>\n<p>\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u6765\u786e\u8ba4\u652f\u6301\u7684\u8d44\u6e90\u7c7b\u578b\u548c\u7c7b\u578b\u540d\u79f0\u3002<\/p>\n<pre class=\"post-pre\"><code>% gcloud beta resource-config list-resource-types\r\n\r\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u2502               KRM KIND               \u2502 BULK EXPORT? \u2502 EXPORT? \u2502 IAM? \u2502\r\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 AccessContextManagerAccessLevel      \u2502              \u2502         \u2502      \u2502\r\n\u2502 AccessContextManagerAccessPolicy     \u2502              \u2502         \u2502 x    \u2502\r\n\u2502 AccessContextManagerServicePerimeter \u2502              \u2502         \u2502      \u2502\r\n\u2502 ArtifactRegistryRepository           \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 BigQueryDataset                      \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 BigQueryJob                          \u2502              \u2502 x       \u2502      \u2502\r\n\u2502 BigQueryTable                        \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 BigtableAppProfile                   \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 BigtableGCPolicy                     \u2502              \u2502         \u2502      \u2502\r\n\u2502 BigtableInstance                     \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 BigtableTable                        \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 CloudBuildTrigger                    \u2502              \u2502         \u2502      \u2502\r\n\u2502 CloudIdentityGroup                   \u2502              \u2502         \u2502      \u2502\r\n\u2502 ComputeAddress                       \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeAddress                       \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeBackendBucket                 \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 ComputeBackendService                \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeBackendService                \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeDisk                          \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 ComputeDisk                          \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 ComputeExternalVPNGateway            \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeFirewall                      \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeForwardingRule                \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeForwardingRule                \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeHTTPHealthCheck               \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeHTTPSHealthCheck              \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeHealthCheck                   \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeHealthCheck                   \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeImage                         \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 ComputeInstance                      \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 ComputeInstance                      \u2502 x            \u2502         \u2502 x    \u2502\r\n\u2502 ComputeInstanceGroup                 \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeInstanceTemplate              \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeInterconnectAttachment        \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeNetwork                       \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeNetworkEndpointGroup          \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeNetworkPeering                \u2502              \u2502         \u2502      \u2502\r\n\u2502 ComputeNodeGroup                     \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeNodeTemplate                  \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeProjectMetadata               \u2502              \u2502         \u2502      \u2502\r\n\u2502 ComputeRegionNetworkEndpointGroup    \u2502              \u2502         \u2502      \u2502\r\n\u2502 ComputeReservation                   \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeResourcePolicy                \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeRoute                         \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeRouter                        \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeRouterInterface               \u2502              \u2502         \u2502      \u2502\r\n\u2502 ComputeRouterNAT                     \u2502              \u2502         \u2502      \u2502\r\n\u2502 ComputeRouterPeer                    \u2502              \u2502         \u2502      \u2502\r\n\u2502 ComputeSSLCertificate                \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeSSLCertificate                \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeSSLPolicy                     \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeSecurityPolicy                \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeSharedVPCHostProject          \u2502              \u2502         \u2502      \u2502\r\n\u2502 ComputeSharedVPCServiceProject       \u2502              \u2502         \u2502      \u2502\r\n\u2502 ComputeSnapshot                      \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 ComputeSubnetwork                    \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 ComputeTargetGRPCProxy               \u2502              \u2502 x       \u2502      \u2502\r\n\u2502 ComputeTargetHTTPProxy               \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeTargetHTTPProxy               \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeTargetHTTPSProxy              \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeTargetHTTPSProxy              \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeTargetInstance                \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeTargetPool                    \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeTargetSSLProxy                \u2502              \u2502 x       \u2502      \u2502\r\n\u2502 ComputeTargetTCPProxy                \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeTargetVPNGateway              \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeURLMap                        \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeURLMap                        \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeVPNGateway                    \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ComputeVPNTunnel                     \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ContainerCluster                     \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 ContainerNodePool                    \u2502 x            \u2502         \u2502      \u2502\r\n\u2502 DataflowFlexTemplateJob              \u2502              \u2502         \u2502      \u2502\r\n\u2502 DataflowJob                          \u2502              \u2502         \u2502      \u2502\r\n\u2502 DNSManagedZone                       \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 DNSPolicy                            \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 DNSRecordSet                         \u2502              \u2502         \u2502      \u2502\r\n\u2502 FirestoreIndex                       \u2502              \u2502         \u2502      \u2502\r\n\u2502 IAMCustomRole                        \u2502 x            \u2502         \u2502      \u2502\r\n\u2502 IAMServiceAccount                    \u2502 x            \u2502         \u2502 x    \u2502\r\n\u2502 IAMServiceAccountKey                 \u2502              \u2502         \u2502      \u2502\r\n\u2502 KMSCryptoKey                         \u2502 x            \u2502         \u2502 x    \u2502\r\n\u2502 KMSKeyRing                           \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 LoggingLogSink                       \u2502 x            \u2502         \u2502      \u2502\r\n\u2502 MemcacheInstance                     \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 MonitoringAlertPolicy                \u2502 x            \u2502         \u2502      \u2502\r\n\u2502 MonitoringNotificationChannel        \u2502              \u2502         \u2502      \u2502\r\n\u2502 PubSubSchema                         \u2502              \u2502 x       \u2502      \u2502\r\n\u2502 PubSubSubscription                   \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 PubSubTopic                          \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 RedisInstance                        \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 Folder                               \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 Project                              \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 ResourceManagerLien                  \u2502              \u2502         \u2502      \u2502\r\n\u2502 ResourceManagerPolicy                \u2502              \u2502         \u2502      \u2502\r\n\u2502 SecretManagerSecret                  \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 SecretManagerSecretVersion           \u2502 x            \u2502         \u2502      \u2502\r\n\u2502 ServiceDirectoryEndpoint             \u2502              \u2502 x       \u2502      \u2502\r\n\u2502 ServiceDirectoryNamespace            \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 ServiceDirectoryService              \u2502              \u2502 x       \u2502 x    \u2502\r\n\u2502 ServiceNetworkingConnection          \u2502              \u2502         \u2502      \u2502\r\n\u2502 Service                              \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 SourceRepoRepository                 \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 SpannerDatabase                      \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 SpannerInstance                      \u2502 x            \u2502 x       \u2502 x    \u2502\r\n\u2502 SQLDatabase                          \u2502              \u2502 x       \u2502      \u2502\r\n\u2502 SQLInstance                          \u2502 x            \u2502 x       \u2502      \u2502\r\n\u2502 SQLSSLCert                           \u2502              \u2502         \u2502      \u2502\r\n\u2502 SQLUser                              \u2502              \u2502         \u2502      \u2502\r\n\u2502 StorageBucket                        \u2502 x            \u2502         \u2502 x    \u2502\r\n\u2502 StorageBucketAccessControl           \u2502              \u2502         \u2502      \u2502\r\n\u2502 StorageDefaultObjectAccessControl    \u2502              \u2502         \u2502      \u2502\r\n\u2502 StorageNotification                  \u2502              \u2502         \u2502      \u2502\r\n\u2502 StorageTransferJob                   \u2502              \u2502         \u2502      \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n<\/code><\/pre>\n<p>\u9700\u8981\u6267\u884c\u5bf9\u6240\u6709\u6b63\u5728\u652f\u6301\u7684\u8d44\u6e90\u6267\u884c\u64cd\u4f5c\uff0c\u5fc5\u987b\u6307\u5b9a\u201c&#8211;resource-types\u201d\uff0c\u4f46\u662f\u5982\u679c\u5c1d\u8bd5\u521b\u5efa Cloud Storage \u5b58\u50a8\u6876\uff0c\u5e76\u4e14\u7ec4\u7ec7\u7b56\u7565\u4e0d\u5141\u8bb8\u4f7f\u7528 us \u5730\u533a\uff0c\u5219\u4f1a\u4ea7\u751f\u4ee5\u4e0b\u9519\u8bef\u3002<\/p>\n<pre class=\"post-pre\"><code>Exporting resource configurations to <span class=\"o\">[<\/span>tf-output]...done.                                                                                                                                \r\nERROR: <span class=\"o\">(<\/span>gcloud.beta.resource-config.bulk-export<span class=\"o\">)<\/span> Error executing <span class=\"nb\">export<\/span>:: <span class=\"o\">[<\/span>error <span class=\"k\">in<\/span> <span class=\"s1\">'config-connector'<\/span> version <span class=\"s1\">'1.93.0'<\/span>: error creating temporary bucket and prefix: error creating bucket <span class=\"s1\">'export-cftg36ie05dncbtar7q0'<\/span>: googleapi: Error 412: <span class=\"s1\">'us'<\/span> violates constraint <span class=\"s1\">'constraints\/gcp.resourceLocations'<\/span>, conditionNotMet\r\n<span class=\"o\">]<\/span>\r\n<\/code><\/pre>\n<p>\u901a\u8fc7\u4e8b\u5148\u521b\u5efa\u5b58\u50a8\u6876\u5e76\u5728-storage-path\u4e2d\u6307\u5b9a\uff0c\u53ef\u4ee5\u907f\u514d\u8fd9\u4e2a\u95ee\u9898<br \/>\n\uff08\u5728\u5b58\u50a8\u6876\u4e2d\u6388\u4e88\u670d\u52a1\u5e10\u53f7&#8221;serviceAccount:service-${google_project.main.number}@gcp-sa-cloudasset.iam.gserviceaccount.com&#8221;\u5b58\u50a8\u4f20\u7edf\u5bf9\u8c61\/\u5b58\u50a8\u6876\u7684\u6240\u6709\u8005\u6743\u9650\u5e76\u6267\u884c\u64cd\u4f5c\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">export <\/span><span class=\"nv\">STORAGE_NAME<\/span><span class=\"o\">=[<\/span>YOUR STORAGE NAME]\r\n<span class=\"nv\">$ <\/span>gcloud beta resource-config bulk-export <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--project<\/span><span class=\"o\">=<\/span><span class=\"nv\">$GCP_PROJECT<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--resource-format<\/span><span class=\"o\">=<\/span>terraform <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--storage-path<\/span><span class=\"o\">=<\/span>gs:\/\/<span class=\"nv\">$STORAGE_NAME<\/span>\/ <span class=\"nt\">--path<\/span><span class=\"o\">=<\/span>tf-output\r\nExporting resource configurations to <span class=\"o\">[<\/span>tf-output]...done.                                                                                                                                \r\nExported resource configuration<span class=\"o\">(<\/span>s<span class=\"o\">)<\/span> to <span class=\"o\">[<\/span>tf-output].\r\n<\/code><\/pre>\n<h2>\u5728AWS\u4e0a\u7684\u4f7f\u7528\u65b9\u5f0f<\/h2>\n<p>\u4e3a\u4e86\u914d\u7f6e\u6267\u884c\u73af\u5883\uff0c\u53ef\u4ee5\u5728version.tf\u6587\u4ef6\u4e2d\u6307\u5b9aprovider\u548cversion\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">mkdir<\/span> ~\/aws-terraformer\r\n<span class=\"nb\">cd<\/span> ~\/aws-terraformer\r\nvi version.tf\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">required_providers<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">google<\/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\">\"4.56.0\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"&gt;= 0.13\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u73af\u5883\u53d8\u91cf\u4e2d\u521b\u5efa\u5305\u542b\u5fc5\u8981\u6267\u884c\u6743\u9650\u7684\u8bbf\u95eeID\u548c\u8bbf\u95ee\u79d8\u94a5\uff0c\u7136\u540e\u4f7f\u7528terraform init\u8fdb\u884c\u521d\u59cb\u5316\u3002\uff08\u7701\u7565\u4e86AWS_ACCESS_KEY_ID\u548cAWS_SECRET_ACCESS_KEY\u7684\u8bf4\u660e\uff09<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">export <\/span><span class=\"nv\">AWS_ACCESS_KEY_ID<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"anaccesskey\"<\/span>\r\n<span class=\"nb\">export <\/span><span class=\"nv\">AWS_SECRET_ACCESS_KEY<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"asecretkey\"<\/span>\r\nterraform init\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>terraformer import aws <span class=\"nt\">--resources<\/span><span class=\"o\">=<\/span>s3,vpc <span class=\"nt\">--regions<\/span><span class=\"o\">=<\/span>ap-northeast-1 <span class=\"nt\">--profile<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"\"<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>tree                                                                           \r\n<span class=\"nb\">.<\/span>\r\n|-- generated\r\n|   <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> aws\r\n|       |-- s3\r\n|       |   |-- outputs.tf\r\n|       |   |-- provider.tf\r\n|       |   |-- s3_bucket.tf\r\n|       |   <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> terraform.tfstate\r\n|       <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> vpc\r\n|           |-- outputs.tf\r\n|           |-- provider.tf\r\n|           |-- terraform.tfstate\r\n|           <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> vpc.tf\r\n<span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> version.tf\r\n<\/code><\/pre>\n<p>\u8fdb\u884c\u751f\u6210\u6587\u4ef6\u7684\u64cd\u4f5c\u786e\u8ba4<br \/>\n\u5728\u6267\u884c\u72b6\u6001\u6587\u4ef6\u8fc1\u79fb\u540e\u624d\u6267\u884c\uff08\u6587\u6863\uff09<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">cd<\/span> ~\/aws-terraformer\/generated\/aws\/s3\/\r\nterraform state replace-provider <span class=\"nt\">-auto-approve<\/span> <span class=\"s2\">\"registry.terraform.io\/-\/aws\"<\/span> <span class=\"s2\">\"hashicorp\/aws\"<\/span>\r\nterraform init\r\nterraform plan\r\n<\/code><\/pre>\n<p>\u8fd0\u884c\u65f6\u6ca1\u6709\u53d8\u5316\u3002\u4f60\u7684\u57fa\u7840\u8bbe\u65bd\u548c\u914d\u7f6e\u76f8\u5339\u914d\u3002\u5982\u679c\u51fa\u73b0\u8b66\u544a\uff1a\u6b64\u53c2\u6570\u5df2\u5f03\u7528\uff0c\u8bf4\u660e terraformer \u8f93\u51fa\u7684\u4ee3\u7801\u53ef\u80fd\u652f\u6301\u65e7\u7248\u672c\u3002<\/p>\n<p>\u6267\u884c\u5bf9\u6240\u6709\u8d44\u6e90\u7684\u64cd\u4f5c\u5c06\u751f\u6210\u4ee5\u4e0b\u8d44\u6e90<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraformer import aws <span class=\"nt\">--resources<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"*\"<\/span> <span class=\"nt\">--regions<\/span><span class=\"o\">=<\/span>ap-northeast-1 <span class=\"nt\">--profile<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"\"<\/span> \r\n...\u51fa\u529b\u7701\u7565...\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">ls <\/span>generated\/aws\/\r\nacm           cloud9          codecommit        devicefarm    ecs                emr       iot            msk           resourcegroups  ses     swf              waf_regional\r\nalb           cloudformation  codedeploy        docdb         efs                eni       kinesis        nacl          route53         sfn     transit_gateway  wafv2_regional\r\napi_gateway   cloudfront      codepipeline      dynamodb      eip                es        kms            nat           route_table     sg      vpc              workspaces\r\nappsync       cloudhsm        cognito           ebs           eks                firehose  lambda         opsworks      s3              sns     vpc_peering      xray\r\nauto_scaling  cloudtrail      config            ec2_instance  elastic_beanstalk  glue      logs           organization  secretsmanager  sqs     vpn_connection\r\nbatch         cloudwatch      customer_gateway  ecr           elasticache        iam       media_package  qldb          securityhub     ssm     vpn_gateway\r\nbudgets       codebuild       datapipeline      ecrpublic     elb                igw       media_store    rds           servicecatalog  subnet  waf\r\n<\/code><\/pre>\n<h2>\u5728Azure\u4e2d\u7684\u4f7f\u7528\u65b9\u6cd5<\/h2>\n<p>\u4e3a\u4e86\u914d\u7f6e\u6267\u884c\u73af\u5883\uff0c\u53ef\u4ee5\u5728version.tf\u6587\u4ef6\u4e2d\u6307\u5b9aprovider\u548cversion\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">mkdir<\/span> ~\/azure-terraformer\r\n<span class=\"nb\">cd<\/span> ~\/azure-terraformer\r\nvi version.tf\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">required_providers<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">azurerm<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">source<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"hashicorp\/azurerm\"<\/span>\r\n      <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"3.45.0\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"&gt;= 0.13\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8bf7\u5728\u73af\u5883\u53d8\u91cf\u4e2d\u521b\u5efa\u6267\u884c\u6240\u9700\u7684\u6743\u9650\uff0c\u5e76\u4f7f\u7528terraform init\u547d\u4ee4\u8fdb\u884c\u521d\u59cb\u5316\uff08\u8bf7\u53c2\u9605\u6587\u6863\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">export <\/span><span class=\"nv\">ARM_SUBSCRIPTION_ID<\/span><span class=\"o\">=<\/span>12345678-abcd-efgh-ijkl-123456789abc\r\n<span class=\"nb\">export <\/span><span class=\"nv\">ARM_CLIENT_ID<\/span><span class=\"o\">=<\/span>87654321-4321-abcd-efgh-123456789abc\r\n<span class=\"nb\">export <\/span><span class=\"nv\">ARM_CLIENT_SECRET<\/span><span class=\"o\">=<\/span>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r\n<span class=\"nb\">export <\/span><span class=\"nv\">ARM_TENANT_ID<\/span><span class=\"o\">=<\/span>abcdefgh-abcd-4321-efgh-123456789abc\r\nterraform init\r\n<\/code><\/pre>\n<p>\u5728\u6307\u5b9a\u7684\u8d44\u6e90\u7ec4\u4e2d\u9009\u62e9\u8d44\u6e90\uff0c\u6267\u884c terraformer import\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">export <\/span><span class=\"nv\">RGNAME<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"[YOUR RG NAME]\"<\/span>\r\nterraformer import azure <span class=\"nt\">-r<\/span> resource_group\r\nterraformer import azure <span class=\"nt\">-R<\/span> <span class=\"nv\">$RGNAME<\/span> <span class=\"nt\">-r<\/span> virtual_network,resource_group\r\nterraformer import azure <span class=\"nt\">-r<\/span> resource_group <span class=\"nt\">--filter<\/span><span class=\"o\">=<\/span><span class=\"nv\">resource_group<\/span><span class=\"o\">=<\/span>\/subscriptions\/<span class=\"nv\">$ARM_SUBSCRIPTION_ID<\/span>\/resourceGroups\/<span class=\"nv\">$RGNAME<\/span>\r\n<\/code><\/pre>\n<p>\u6309\u7167\u4ee5\u4e0b\u7684\u7ec4\u7ec7\u65b9\u5f0f\u751f\u6210<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>tree\r\n<span class=\"nb\">.<\/span>\r\n|-- generated\r\n|   <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> azurerm\r\n|       |-- resource_group\r\n|       |   |-- outputs.tf\r\n|       |   |-- provider.tf\r\n|       |   |-- resource_group.tf\r\n|       |   <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> terraform.tfstate\r\n|       <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> virtual_network\r\n|           |-- outputs.tf\r\n|           |-- provider.tf\r\n|           |-- terraform.tfstate\r\n|           |-- variables.tf\r\n|           <span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> virtual_network.tf\r\n<span class=\"sb\">`<\/span><span class=\"nt\">--<\/span> version.tf\r\n<\/code><\/pre>\n<p>\u5728\u6267\u884c\u6587\u4ef6\u751f\u6210\u7684\u52a8\u4f5c\u786e\u8ba4\u4e4b\u524d\uff0c\u8bf7\u5148\u8fdb\u884c\u6587\u4ef6\u8fc1\u79fb\u7684\u72b6\u6001\u786e\u8ba4\uff08\u8bf7\u53c2\u8003\u6587\u6863\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">cd<\/span> ~\/azure-terraformer\/generated\/azurerm\/resource_group\/\r\nterraform state replace-provider <span class=\"nt\">-auto-approve<\/span> <span class=\"s2\">\"registry.terraform.io\/-\/azurerm\"<\/span> <span class=\"s2\">\"hashicorp\/azurerm\"<\/span>\r\nterraform init\r\nterraform plan\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>\r\n\u2502 Error: Insufficient features blocks\r\n\u2502 \r\n\u2502   on provider.tf line 1, <span class=\"k\">in <\/span>provider <span class=\"s2\">\"azurerm\"<\/span>:\r\n\u2502    1: provider <span class=\"s2\">\"azurerm\"<\/span> <span class=\"o\">{<\/span>\r\n\u2502 \r\n\u2502 At least 1 <span class=\"s2\">\"features\"<\/span> blocks are required.\r\n\u2575\r\n<\/code><\/pre>\n<p>\u7531\u4e8e\u4e0a\u8ff0\u9519\u8bef\uff0c\u9700\u8981\u6dfb\u52a0\u529f\u80fd\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">provider<\/span> <span class=\"s2\">\"azurerm\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"~&gt; 3.45.0\"<\/span>\r\n<span class=\"hil\"><span class=\"o\">+ <\/span><span class=\"nx\">features<\/span> <span class=\"p\">{}<\/span>\r\n<\/span><span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">terraform<\/span> <span class=\"p\">{<\/span>\r\n\t<span class=\"nx\">required_providers<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"nx\">azurerm<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n\t    <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"~&gt; 3.45.0\"<\/span>\r\n\t\t<span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u518d\u6b21\u5b9e\u65bd\u540e\u5c06\u53d8\u5f97\u53ef\u6267\u884c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform plan\r\n\r\nNo changes. Your infrastructure matches the configuration.\r\n\r\nTerraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.\r\n\u2577\r\n\u2502 Warning: Version constraints inside provider configuration blocks are deprecated\r\n\u2502 \r\n\u2502   on provider.tf line 2, <span class=\"k\">in <\/span>provider <span class=\"s2\">\"azurerm\"<\/span>:\r\n\u2502    2:   version <span class=\"o\">=<\/span> <span class=\"s2\">\"~&gt; 3.45.0\"<\/span>\r\n\u2502 \r\n\u2502 Terraform 0.13 and earlier allowed provider version constraints inside the provider configuration block, but that is now deprecated and will be removed <span class=\"k\">in <\/span>a future version of\r\n\u2502 Terraform. To silence this warning, move the provider version constraint into the required_providers block.\r\n\u2575\r\n<\/code><\/pre>\n<p>\u8b66\u544a\u51fa\u73b0\uff0c\u4f46\u57fa\u672c\u4e0a\u8fd0\u4f5c\u6b63\u5e38\u3002<\/p>\n<p>\u5982\u679c\u5c06\u6240\u6709\u8d44\u6e90\u4f5c\u4e3a\u76ee\u6807\u8fdb\u884c\u8f93\u51fa\uff0c\u5c06\u4f1a\u8f93\u51fa\u5982\u4e0b\u6240\u793a\u7684\u8d44\u6e90<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraformer import azure <span class=\"nt\">-r<\/span> <span class=\"s2\">\"*\"<\/span>\r\n...\u51fa\u529b\u7701\u7565...\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">ls <\/span>generated\/azurerm\/\r\nanalysis             cosmosdb      disk      load_balancer           network_watcher   purview         security_center_contact               storage_container  virtual_network\r\napp_service          data_factory  dns       management_lock         private_dns       resource_group  security_center_subscription_pricing  subnet\r\napplication_gateway  database      eventhub  network_interface       private_endpoint  route_table     ssh_public_key                        synapse\r\ncontainer            databricks    keyvault  network_security_group  public_ip         scaleset        storage_account                       virtual_machine\r\n<\/code><\/pre>\n<h2>\u5728Datadog\u4e2d\u7684\u4f7f\u7528\u65b9\u6cd5<\/h2>\n<p>\u4e3a\u4e86\u51c6\u5907\u6267\u884c\u73af\u5883\uff0c\u53ef\u4ee5\u5728provider.tf\u6587\u4ef6\u4e2d\u6307\u5b9aprovider\u548cversion\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">mkdir<\/span> ~\/datadog-terraformer\r\n<span class=\"nb\">cd<\/span> ~\/datadog-terraformer\r\nvi provider.tf\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\"># https:\/\/github.com\/GoogleCloudPlatform\/terraformer\/blob\/master\/docs\/datadog.md#2-set-up-a-template-terraform-workspace<\/span>\r\n<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\">datadog<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">source<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"DataDog\/datadog\"<\/span>\r\n      <span class=\"c1\"># https:\/\/registry.terraform.io\/providers\/DataDog\/datadog\/latest<\/span>\r\n      <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"3.21.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\">\"datadog\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"c1\"># Configuration options<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8bf7\u5728\u73af\u5883\u53d8\u91cf\u4e2d\u521b\u5efa\u6267\u884c\u6240\u9700\u7684\u6743\u9650\uff0c\u5e76\u4f7f\u7528terraform init\u8fdb\u884c\u521d\u59cb\u5316\uff08\u8bf7\u53c2\u8003\u6587\u6863\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code>terraform init\r\n<\/code><\/pre>\n<p>\u8a2d\u5b9a\u74b0\u5883\u8b8a\u6578\uff0c\u4f7f\u7528 terraformer \u5728\u76ee\u6a19\u4e0a\u57f7\u884c\u6240\u6709\u8cc7\u6e90\u64cd\u4f5c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">export <\/span><span class=\"nv\">DATADOG_API_KEY<\/span><span class=\"o\">=[<\/span>Datadog API key] <span class=\"c\"># More information on this at https:\/\/docs.datadoghq.com\/account_management\/api-app-keys\/ <\/span>\r\n<span class=\"nb\">export <\/span><span class=\"nv\">DATADOG_HOST<\/span><span class=\"o\">=[<\/span>Datadog API host] <span class=\"c\"># https:\/\/api.datadoghq.eu which can be found at https:\/\/docs.datadoghq.com\/getting_started\/site\/#access-the-datadog-site<\/span>\r\n<span class=\"nb\">export <\/span><span class=\"nv\">DATADOG_APP_KEY<\/span><span class=\"o\">=[<\/span>Datadog APP key] <span class=\"c\"># More information on this at https:\/\/docs.datadoghq.com\/account_management\/api-app-keys\/<\/span>\r\n\r\nterraformer import datadog <span class=\"nt\">--resources<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"*\"<\/span>\r\n<\/code><\/pre>\n<p>\u5b9e\u65bd\u540e\u4f1a\u751f\u6210\u4ee5\u4e0b\u51e0\u79cd\u7c7b\u578b\u7684\u5185\u5bb9<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">ls <\/span>generated\/datadog\/                   \r\ndashboard       downtime                   logs_archive          logs_index                 logs_pipeline_order  role                        synthetics_private_location\r\ndashboard_json  integration_gcp            logs_archive_order    logs_index_order           metric_metadata      service_level_objective     synthetics_test\r\ndashboard_list  integration_slack_channel  logs_custom_pipeline  logs_integration_pipeline  monitor              synthetics_global_variable  user\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u662f\u751f\u6210\u4ee3\u7801\u793a\u4f8b\uff08\u624b\u52a8\u8bbe\u7f6e\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"datadog_monitor\"<\/span> <span class=\"s2\">\"tfer--monitor_25024807\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">escalation_message<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"\"<\/span>\r\n  <span class=\"nx\">evaluation_delay<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"0\"<\/span>\r\n  <span class=\"nx\">include_tags<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"true\"<\/span>\r\n  <span class=\"nx\">locked<\/span>             <span class=\"p\">=<\/span> <span class=\"s2\">\"false\"<\/span>\r\n  <span class=\"nx\">message<\/span>            <span class=\"p\">=<\/span> <span class=\"s2\">\"{{#is_alert}} BGP Neighbor down {{\/is_alert}}<\/span><span class=\"se\">\\n<\/span><span class=\"s2\">{{#is_alert_recovery}} BGP Neighbor Up {{\/is_alert_recovery}}<\/span><span class=\"se\">\\n<\/span><span class=\"s2\">@slack-HomeLab-datadog-monitoring\"<\/span>\r\n\r\n  <span class=\"nx\">monitor_thresholds<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">critical<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"1\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">name<\/span>                 <span class=\"p\">=<\/span> <span class=\"s2\">\"GCP BGP Session State Change Project Name [ {{project_id}} ]\"<\/span>\r\n  <span class=\"nx\">new_group_delay<\/span>      <span class=\"p\">=<\/span> <span class=\"s2\">\"0\"<\/span>\r\n  <span class=\"nx\">new_host_delay<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"300\"<\/span>\r\n  <span class=\"nx\">no_data_timeframe<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"0\"<\/span>\r\n  <span class=\"nx\">notify_audit<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"false\"<\/span>\r\n  <span class=\"nx\">notify_no_data<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"false\"<\/span>\r\n  <span class=\"nx\">priority<\/span>             <span class=\"p\">=<\/span> <span class=\"s2\">\"0\"<\/span>\r\n  <span class=\"nx\">query<\/span>                <span class=\"p\">=<\/span> <span class=\"s2\">\"min(last_5m):avg:gcp.router.bgp.session_up{project_id:suzuyu-project} &lt; 1\"<\/span>\r\n  <span class=\"nx\">renotify_interval<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"0\"<\/span>\r\n  <span class=\"nx\">renotify_occurrences<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"0\"<\/span>\r\n  <span class=\"nx\">require_full_window<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"false\"<\/span>\r\n  <span class=\"nx\">timeout_h<\/span>            <span class=\"p\">=<\/span> <span class=\"s2\">\"0\"<\/span>\r\n  <span class=\"nx\">type<\/span>                 <span class=\"p\">=<\/span> <span class=\"s2\">\"metric alert\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8fdb\u884c\u64cd\u4f5c\u9a8c\u8bc1\u3002<br \/>\n\u66ff\u6362state\u6587\u4ef6\u7684\u63d0\u4f9b\u8005\u5e76\u6dfb\u52a0provider.tf\u7684source\u53c2\u6570\uff0c\u5426\u5219\u4f1a\u51fa\u73b0\u9519\u8bef\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">cd<\/span> ~\/datadog-terraformer\/generated\/datadog\/monitor\/\r\nterraform state replace-provider <span class=\"nt\">-auto-approve<\/span>  <span class=\"s2\">\"registry.terraform.io\/-\/datadog\"<\/span> <span class=\"s2\">\"DataDog\/datadog\"<\/span>\r\nvi provider.tf \r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/span>\r\n\t<span class=\"nx\">required_providers<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"nx\">datadog<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n<span class=\"hil\"><span class=\"o\">+ <\/span>\t    <span class=\"nx\">source<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Datadog\/datadog\"<\/span>\r\n<\/span>\t    <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"~&gt; 3.21.0\"<\/span>\r\n\t\t<span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u786e\u8ba4 terraform plan \u662f\u5426\u80fd\u6b63\u5e38\u8fd0\u884c<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">export <\/span><span class=\"nv\">DD_API_KEY<\/span><span class=\"o\">=<\/span><span class=\"nv\">$DATADOG_API_KEY<\/span>\r\n<span class=\"nb\">export <\/span><span class=\"nv\">DD_HOST<\/span><span class=\"o\">=<\/span><span class=\"nv\">$DATADOG_HOST<\/span>\r\n<span class=\"nb\">export <\/span><span class=\"nv\">DD_APP_KEY<\/span><span class=\"o\">=<\/span><span class=\"nv\">$DATADOG_APP_KEY<\/span>\r\nterraform init\r\nterraform plan\r\n<\/code><\/pre>\n<h2>\u603b\u7ed3<\/h2>\n<p>\u5b89\u88c5\u5e76\u4f7f\u7528Terraformer \u5728\u6bcf\u4e2a\u4e91\u5e73\u53f0\u4e0a\u751f\u6210\u548c\u8fd0\u884c\u4ee3\u7801\uff0c\u76f4\u5230\u5b8c\u6210\u4fee\u590d\u3002<br \/>\n\u751f\u6210\u7684Terraformer \u4ee3\u7801\u662f\u57fa\u4e8e\u8f83\u65e7\u7248\u672c\u7684\u524d\u63d0\u6761\u4ef6\u751f\u6210\u7684\uff0c\u6240\u4ee5\u53ef\u80fd\u9700\u8981\u8fdb\u884c\u4fee\u590d\u3002<br \/>\n\u901a\u8fc7\u4f7f\u7528\u5b83\u4f5c\u4e3a\u53c2\u8003\u6216\u7528\u4e8e\u975eIaC\u4e91\u73af\u5883\uff0c\u53d1\u73b0\u5b83\u53ef\u80fd\u5bf9\u5904\u7406\u76f8\u5173\u4e91\u5e73\u53f0\u5f88\u6709\u7528\u3002<\/p>\n<p>gcloud\u751f\u6210\u7684\u8fc7\u7a0b\u4e0eTerraformer\u4e0d\u540c\uff0c\u9700\u8fdb\u884cAPI\u542f\u7528\u3001\u670d\u52a1\u8d26\u53f7\u751f\u6210\u3001\u6388\u6743\u5206\u914d\u3001\u533a\u57df\u914d\u7f6e\u5230\u4e34\u65f6\u5b58\u50a8\u6876\u7b49\u64cd\u4f5c\uff0c\u6839\u636e\u73af\u5883\u7684\u4e0d\u540c\u53ef\u80fd\u4f1a\u6709\u4e0d\u540c\u7684\u4f7f\u7528\u4f53\u9a8c\uff0c\u4f46\u7531\u4e8e\u662f\u9884\u89c8\u7248\uff0c\u6240\u4ee5\u6700\u597d\u5173\u6ce8\u4ee5\u540e\u7684\u66f4\u65b0\u3002<\/p>\n<h2>\u53ef\u4ee5\u8003\u8651<\/h2>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u6709\u4e00\u6b3e\u540d\u4e3aTerraformer\u7684\u4e91\u5de5\u5177\uff0c\u53ef\u4ee5\u6839\u636e\u73b0\u6709\u72b6\u6001\u751f\u6210Terraform\u4ee3\u7801\uff08\u7531Google\u65d7\u4e0b [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48738","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>\u5730\u7403\u5f62\u6210\u88c5\u7f6e\u7684\u5b89\u88c5\u548c\u4f7f\u7528\u65b9\u6cd5\uff08Google Cloud\u3001AWS\u3001Azure\u3001Datadog\uff09\uff0c\u4ee5\u53ca\u901a\u8fc7gcloud\u751f\u6210terraform\u4ee3\u7801 - 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\/\u5730\u7403\u5f62\u6210\u88c5\u7f6e\u7684\u5b89\u88c5\u548c\u4f7f\u7528\u65b9\u6cd5\uff08google-cloud\u3001aws\u3001azure\u3001datadog\uff09\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5730\u7403\u5f62\u6210\u88c5\u7f6e\u7684\u5b89\u88c5\u548c\u4f7f\u7528\u65b9\u6cd5\uff08Google Cloud\u3001AWS\u3001Azure\u3001Datadog\uff09\uff0c\u4ee5\u53ca\u901a\u8fc7gcloud\u751f\u6210terraform\u4ee3\u7801\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148 \u6709\u4e00\u6b3e\u540d\u4e3aTerraformer\u7684\u4e91\u5de5\u5177\uff0c\u53ef\u4ee5\u6839\u636e\u73b0\u6709\u72b6\u6001\u751f\u6210Terraform\u4ee3\u7801\uff08\u7531Google\u65d7\u4e0b [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5730\u7403\u5f62\u6210\u88c5\u7f6e\u7684\u5b89\u88c5\u548c\u4f7f\u7528\u65b9\u6cd5\uff08google-cloud\u3001aws\u3001azure\u3001datadog\uff09\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-01T08:14:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-15T04:42:12+00:00\" \/>\n<meta name=\"author\" content=\"\u6e05, \u626c\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6e05, \u626c\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 \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\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/\",\"name\":\"\u5730\u7403\u5f62\u6210\u88c5\u7f6e\u7684\u5b89\u88c5\u548c\u4f7f\u7528\u65b9\u6cd5\uff08Google Cloud\u3001AWS\u3001Azure\u3001Datadog\uff09\uff0c\u4ee5\u53ca\u901a\u8fc7gcloud\u751f\u6210terraform\u4ee3\u7801 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-11-01T08:14:13+00:00\",\"dateModified\":\"2024-01-15T04:42:12+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5730\u7403\u5f62\u6210\u88c5\u7f6e\u7684\u5b89\u88c5\u548c\u4f7f\u7528\u65b9\u6cd5\uff08Google Cloud\u3001AWS\u3001Azure\u3001Datadog\uff09\uff0c\u4ee5\u53ca\u901a\u8fc7gcloud\u751f\u6210terraform\u4ee3\u7801\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461\",\"name\":\"\u6e05, \u626c\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"caption\":\"\u6e05, \u626c\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5730\u7403\u5f62\u6210\u88c5\u7f6e\u7684\u5b89\u88c5\u548c\u4f7f\u7528\u65b9\u6cd5\uff08Google Cloud\u3001AWS\u3001Azure\u3001Datadog\uff09\uff0c\u4ee5\u53ca\u901a\u8fc7gcloud\u751f\u6210terraform\u4ee3\u7801 - 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\/\u5730\u7403\u5f62\u6210\u88c5\u7f6e\u7684\u5b89\u88c5\u548c\u4f7f\u7528\u65b9\u6cd5\uff08google-cloud\u3001aws\u3001azure\u3001datadog\uff09\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5730\u7403\u5f62\u6210\u88c5\u7f6e\u7684\u5b89\u88c5\u548c\u4f7f\u7528\u65b9\u6cd5\uff08Google Cloud\u3001AWS\u3001Azure\u3001Datadog\uff09\uff0c\u4ee5\u53ca\u901a\u8fc7gcloud\u751f\u6210terraform\u4ee3\u7801","og_description":"\u9996\u5148 \u6709\u4e00\u6b3e\u540d\u4e3aTerraformer\u7684\u4e91\u5de5\u5177\uff0c\u53ef\u4ee5\u6839\u636e\u73b0\u6709\u72b6\u6001\u751f\u6210Terraform\u4ee3\u7801\uff08\u7531Google\u65d7\u4e0b [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5730\u7403\u5f62\u6210\u88c5\u7f6e\u7684\u5b89\u88c5\u548c\u4f7f\u7528\u65b9\u6cd5\uff08google-cloud\u3001aws\u3001azure\u3001datadog\uff09\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-11-01T08:14:13+00:00","article_modified_time":"2024-01-15T04:42:12+00:00","author":"\u6e05, \u626c","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6e05, \u626c","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"11 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/","name":"\u5730\u7403\u5f62\u6210\u88c5\u7f6e\u7684\u5b89\u88c5\u548c\u4f7f\u7528\u65b9\u6cd5\uff08Google Cloud\u3001AWS\u3001Azure\u3001Datadog\uff09\uff0c\u4ee5\u53ca\u901a\u8fc7gcloud\u751f\u6210terraform\u4ee3\u7801 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-11-01T08:14:13+00:00","dateModified":"2024-01-15T04:42:12+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5730\u7403\u5f62\u6210\u88c5\u7f6e\u7684\u5b89\u88c5\u548c\u4f7f\u7528\u65b9\u6cd5\uff08Google Cloud\u3001AWS\u3001Azure\u3001Datadog\uff09\uff0c\u4ee5\u53ca\u901a\u8fc7gcloud\u751f\u6210terraform\u4ee3\u7801"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461","name":"\u6e05, \u626c","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","caption":"\u6e05, \u626c"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%b0%e7%90%83%e5%bd%a2%e6%88%90%e8%a3%85%e7%bd%ae%e7%9a%84%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%88google-cloud%e3%80%81aws%e3%80%81azure%e3%80%81datadog%ef%bc%89\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48738","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48738"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48738\/revisions"}],"predecessor-version":[{"id":59563,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48738\/revisions\/59563"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48738"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48738"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48738"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}