{"id":48833,"date":"2023-06-30T11:42:38","date_gmt":"2023-02-16T20:10:58","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/"},"modified":"2024-04-30T11:21:50","modified_gmt":"2024-04-30T03:21:50","slug":"%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/","title":{"rendered":"\u5347\u7ea7Terraform\u5e76\u5b89\u88c5Tflint"},"content":{"rendered":"<p>\u6211\u662fDMM\u7684yuua\u3002<br \/>\n\u7531\u65bc\u9032\u884c\u4e86terraform\u7684\u5347\u7d1a\u548ctflint\u7684\u5c0e\u5165\uff0c\u4ee5\u4e0b\u662f\u8a72\u904e\u7a0b\u7684\u6b65\u9a5f\u5099\u5fd8\u9304\u3002<\/p>\n<h1>\u5347\u7ea7<\/h1>\n<p>\u7531\u4e8e\u4f7f\u7528\u7684 Terraform \u7248\u672c\u662f 0.14 \u7cfb\u5217\uff0c\u6240\u4ee5\u5347\u7ea7\u5230\u4e86 1.1.x\u3002\u5982\u679c\u662f 0.13 \u4ee5\u524d\u7684\u7248\u672c\uff0c\u5219\u9700\u8981\u9010\u6b65\u5347\u7ea7\u5230 0.1 \u7cfb\u5217\uff0c\u4f46\u662f\u5728 0.14 \u4ee5\u540e\u7684\u7248\u672c\u53ef\u4ee5\u8df3\u8fc7\u4e00\u4e9b\u7248\u672c\u8fdb\u884c\u5347\u7ea7\u3002\u4e0d\u8fc7\uff0c\u5982\u679c\u662f\u4ece 0.14 \u7cfb\u5217\u5347\u7ea7\u5230 1.0.x \u7cfb\u5217\uff0c\u5219\u5728\u5347\u7ea7\u4e4b\u524d\u5e94\u5148\u67e5\u770b 0.15 \u7cfb\u5217\u7684\u5347\u7ea7\u6307\u5357\u3002<\/p>\n<p>\u5728\u6211\u7684\u56e2\u961f\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528Circle CI\u6765\u6267\u884cTerraform\u73af\u5883\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u4f1a\u521b\u5efa\u6bcf\u4e2a\u7248\u672c\u7684Docker\u955c\u50cf\uff0c\u5e76\u5728ECR\u4e0a\u8fdb\u884c\u7ba1\u7406\u3002<\/p>\n<p>\u8bf7\u4f7f\u7528 hashicorp\/terraform \u4f5c\u4e3a\u57fa\u7840 Docker \u955c\u50cf\u3002<\/p>\n<h2>1.0.x\u8f6c\u53d8\u4e3a\u591a\u5c11<\/h2>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> hashicorp\/terraform:1.0.x<\/span>\r\n\r\n<span class=\"c\"># aws cli<\/span>\r\n<span class=\"k\">RUN <\/span>apk <span class=\"nt\">--update<\/span> <span class=\"nt\">--no-cache<\/span> add python3 py3-pip curl <span class=\"o\">&amp;&amp;<\/span> pip3 <span class=\"nb\">install<\/span> <span class=\"nt\">--no-cache-dir<\/span> <span class=\"nt\">--upgrade<\/span> pip awscli\r\n\r\n<span class=\"c\"># tfnotify<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> TFNOTIFY_VERSION=0.7.0<\/span>\r\n<span class=\"k\">RUN <\/span>wget https:\/\/github.com\/mercari\/tfnotify\/releases\/download\/v<span class=\"k\">${<\/span><span class=\"nv\">TFNOTIFY_VERSION<\/span><span class=\"k\">}<\/span>\/tfnotify_linux_amd64.tar.gz <span class=\"nt\">-O<\/span> tfnotify.tar.gz <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">tar<\/span> <span class=\"nt\">-xf<\/span> tfnotify.tar.gz <span class=\"nt\">-C<\/span> \/usr\/local\/bin\/ <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">chmod <\/span>u+x \/usr\/local\/bin\/tfnotify <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">rm <\/span>tfnotify.tar.gz\r\n\r\n<span class=\"c\"># gcloud<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> GCLOUD_VERSION=337.0.0<\/span>\r\n<span class=\"k\">RUN <\/span>curl <span class=\"nt\">-o<\/span> google-cloud-sdk.tar.gz https:\/\/dl.google.com\/dl\/cloudsdk\/channels\/rapid\/downloads\/google-cloud-sdk-<span class=\"k\">${<\/span><span class=\"nv\">GCLOUD_VERSION<\/span><span class=\"k\">}<\/span><span class=\"nt\">-linux-x86_64<\/span>.tar.gz <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">tar<\/span> <span class=\"nt\">-xf<\/span> google-cloud-sdk.tar.gz <span class=\"nt\">-C<\/span> <span class=\"nv\">$HOME<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nv\">$HOME<\/span>\/google-cloud-sdk\/install.sh <span class=\"nt\">--quiet<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">rm <\/span>google-cloud-sdk.tar.gz\r\n\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> PATH $PATH:\/root\/google-cloud-sdk\/bin<\/span>\r\n<\/code><\/pre>\n<p>\u4f7f\u75281.0.x\u7248\u672c\u7684Docker\u955c\u50cf\uff0c\u521b\u5efa\u4e00\u4e2a\u5305\u542b\u5e94\u7528\u6240\u9700\u548c\u5176\u4ed6\u5fc5\u8981\u5de5\u5177\u7684\u955c\u50cf\uff0c\u5e76\u5728\u5176\u4e2d\u5b89\u88c5gcloud-sdk \/ tfnotify\u5de5\u5177\u3002<\/p>\n<p>\u53ef\u4ee5\u66f4\u6539 main.tf \u6587\u4ef6\u4e2d\u7684 required_version \u7248\u672c\uff0c\u5e76\u5bf9\u6b64\u8fdb\u884c\u660e\u786e\u8bf4\u660e\uff0c\u5373\u4f7f\u4e0d\u66f4\u6539\u7248\u672c\uff0c\u4e5f\u53ef\u4ee5\u6267\u884c plan\/apply \u64cd\u4f5c\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"nx\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"&gt;= instal\u3057\u305fterraform\u306eversion\u6307\u5b9a\"<\/span>\r\n\r\n  <span class=\"nx\">required_providers<\/span> <span class=\"p\">{<\/span>\r\n       <span class=\"err\">....<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"err\">.....<\/span>\r\n<span class=\"err\">....<\/span>\r\n<span class=\"err\">...<\/span>\r\n<span class=\"err\">..<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u6267\u884cterraform plan\u540e\u786e\u8ba4\u6ca1\u6709\u4efb\u4f55\u66f4\u6539\uff0c\u90a3\u4e48\u5c31\u6267\u884cterraform apply\u3002\u5982\u679c\u51fa\u73b0\u4e86\u66f4\u6539\u6216\u5e9f\u5f03\u7b49\u60c5\u51b5\uff0c\u90a3\u5c31\u8981\u8fdb\u884c\u76f8\u5e94\u7684\u5904\u7406\u3002<\/p>\n<h2>\u8f6c\u4e3a1.1.x\u7248\u672c<\/h2>\n<p>\u57fa\u672c\u4e0a\uff0c\u53ea\u9700\u8981\u5728\u56fe\u50cf\u4e0a\u5347\u7ea7terraform\uff0c\u5c31\u50cf1.0.x\u7248\u672c\u4e00\u6837\u3002\u7531\u4e8e\u6211\u4eec\u8fd8\u5305\u62ectflint\uff0c\u6240\u4ee5\u4e5f\u6dfb\u52a0\u4e86\u4ee3\u7801\u68c0\u67e5\u5de5\u5177\u3002<\/p>\n<p>\u8bf7\u5c06\u4e0eterraform\u7248\u672c\u517c\u5bb9\u7684\u7248\u672c\u5b89\u88c5\u5728tflint\u7684\u7248\u672c\u4e2d\u3002\u6b64\u5916\uff0c\u867d\u7136tflint\u63d0\u4f9b\u4e86\u5b89\u88c5\u811a\u672c\uff0c\u4f46\u662f\u5728hashicorp\/terraform:1.1.x\u7684\u955c\u50cf\u4e0a\u8fd0\u884c\u65f6\u4f1a\u51fa\u73b0\u89e3\u538b\u9519\u8bef\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u4f7f\u7528\u5b89\u88c5\u811a\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> hashicorp\/terraform:1.1.x<\/span>\r\n\r\n.....\r\n....\r\n...\r\n..\r\n\r\n# tflint\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> TFLINT_VERSION=v0.34.1<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> OS=linux_amd64<\/span>\r\n<span class=\"k\">RUN <\/span>curl <span class=\"nt\">--fail<\/span> <span class=\"nt\">--silent<\/span> <span class=\"nt\">-L<\/span> <span class=\"nt\">-o<\/span> \/tmp\/tflint.zip <span class=\"s2\">\"https:\/\/github.com\/terraform-linters\/tflint\/releases\/download\/<\/span><span class=\"k\">${<\/span><span class=\"nv\">TFLINT_VERSION<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/tflint_<\/span><span class=\"k\">${<\/span><span class=\"nv\">OS<\/span><span class=\"k\">}<\/span><span class=\"s2\">.zip\"<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> unzip \/tmp\/tflint.zip <span class=\"nt\">-d<\/span> \/tmp\/ <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">install<\/span> <span class=\"nt\">-c<\/span> <span class=\"nt\">-v<\/span> \/tmp\/tflint \/usr\/local\/bin\/ <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">rm<\/span> \/tmp\/tflint<span class=\"k\">*<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>\r\n<span class=\"nx\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"&gt;= instal\u3057\u305fterraform\u306eversion\u6307\u5b9a\"<\/span>\r\n\r\n  <span class=\"nx\">required_providers<\/span> <span class=\"p\">{<\/span>\r\n       <span class=\"err\">....<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"err\">.....<\/span>\r\n<span class=\"err\">....<\/span>\r\n<span class=\"err\">...<\/span>\r\n<span class=\"err\">..<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u6267\u884c terraform apply \u524d\uff0c\u6211\u4eec\u4e5f\u8981\u50cf\u4e4b\u524d\u4e00\u6837\u5148\u6267\u884c terraform plan\uff0c\u5e76\u786e\u8ba4\u6ca1\u6709\u4efb\u4f55\u53d8\u5316\u3002\u5982\u679c\u6709\u4efb\u4f55\u6539\u53d8\u6216\u5e9f\u5f03\u7684\u5185\u5bb9\u51fa\u73b0\uff0c\u6211\u4eec\u8981\u8fdb\u884c\u76f8\u5e94\u7684\u5904\u7406\u3002<\/p>\n<h1>\u5728\u4e2d\u56fd\uff0c\u53ea\u9700\u8981\u4e00\u79cd\u9009\u62e9\uff0c\u5c06\u4ee5\u4e0b\u5185\u5bb9\u4ee5\u4e2d\u6587\u8fdb\u884c\u6539\u5199\uff1a<\/h1>\n<p>\u4f7f\u7528tflint\u8fdb\u884c\u914d\u7f6e\u68c0\u67e5<\/p>\n<p>\u901a\u8fc7\u5f15\u5165tflint\u5de5\u5177\uff0c\u53ef\u4ee5\u5f3a\u5236\u6267\u884c\u89c4\u5219\u3002\u6b64\u5916\uff0c\u9488\u5bf9\u4e3b\u8981\u63d0\u4f9b\u5546\uff08\u5982aws\/gcp\/azure\uff09\u7684\u89c4\u5219\u96c6\u5df2\u5728GitHub\u4e0a\u53d1\u5e03\uff0c\u6240\u4ee5\u8bf7\u4f7f\u7528\u90a3\u4e9b\u89c4\u5219\u96c6\u3002<br \/>\n\uff08\u8bf7\u786e\u4fddtflint\u7684\u7248\u672c\u4e0eterraform\u517c\u5bb9\uff09<\/p>\n<p>\u5728\u8fc1\u79fb\u81f31.1.x\u7248\u672c\u65f6\uff0c\u5df2\u7ecf\u6dfb\u52a0\u4e86tflint\u7684Docker\u955c\u50cf\u3002<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">ENV<\/span><span class=\"s\"> TFLINT_VERSION=v0.34.1<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> OS=linux_amd64<\/span>\r\n<span class=\"k\">RUN <\/span>curl <span class=\"nt\">--fail<\/span> <span class=\"nt\">--silent<\/span> <span class=\"nt\">-L<\/span> <span class=\"nt\">-o<\/span> \/tmp\/tflint.zip <span class=\"s2\">\"https:\/\/github.com\/terraform-linters\/tflint\/releases\/download\/<\/span><span class=\"k\">${<\/span><span class=\"nv\">TFLINT_VERSION<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/tflint_<\/span><span class=\"k\">${<\/span><span class=\"nv\">OS<\/span><span class=\"k\">}<\/span><span class=\"s2\">.zip\"<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> unzip \/tmp\/tflint.zip <span class=\"nt\">-d<\/span> \/tmp\/ <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">install<\/span> <span class=\"nt\">-c<\/span> <span class=\"nt\">-v<\/span> \/tmp\/tflint \/usr\/local\/bin\/ <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">rm<\/span> \/tmp\/tflint<span class=\"k\">*<\/span>\r\n<\/code><\/pre>\n<h2>\u6dfb\u52a0\u63d2\u4ef6<\/h2>\n<p>\u4e3a\u4e86\u907f\u514d\u6bcf\u6b21\u90fd\u8981\u5b89\u88c5\u63d2\u4ef6\uff0c\u4f60\u53ef\u4ee5\u4e8b\u5148\u5c06\u63d2\u4ef6\u5b89\u88c5\u5728.tflint.d\u7684\u76ee\u5f55\u4e0b\u3002\u5728\u6211\u7684\u56e2\u961f\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86\u4e24\u4e2a\u4e91\u73af\u5883\uff0c\u5373aws\u548cgcp\uff0c\u56e0\u6b64\u6211\u4eec\u4e8b\u5148\u5b89\u88c5\u4e86tflint-ruleset-aws\u548ctflint-ruleset-google\u8fd9\u4e24\u4e2a\u63d2\u4ef6\u3002\u7531\u4e8e\u6211\u4eec\u662f\u5728docker\u955c\u50cf\u4e0a\u6267\u884c\uff0c\u5982\u679c\u4e0d\u63d0\u524d\u5b89\u88c5\uff0c\u6bcf\u6b21\u6267\u884ctflint &#8211;init\u65f6\u90fd\u4f1a\u8fdb\u884c\u5b89\u88c5\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># tflint bundle plugin<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> TFLINT_AWS_VERSION=0.12.0<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> TFLINT_GOOGLE_VERSION=0.15.0<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">mkdir<\/span> <span class=\"nt\">-p<\/span>  ~\/.tflint.d\/plugins\/github.com\/terraform-linters\/tflint-ruleset-aws\/<span class=\"k\">${<\/span><span class=\"nv\">TFLINT_AWS_VERSION<\/span><span class=\"k\">}<\/span>\/ <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> wget <span class=\"nt\">-O<\/span> \/tmp\/tflint-ruleset-aws.zip https:\/\/github.com\/terraform-linters\/tflint-ruleset-aws\/releases\/download\/v<span class=\"k\">${<\/span><span class=\"nv\">TFLINT_AWS_VERSION<\/span><span class=\"k\">}<\/span>\/tflint-ruleset-aws_linux_amd64.zip <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> unzip \/tmp\/tflint-ruleset-aws.zip <span class=\"nt\">-d<\/span> ~\/.tflint.d\/plugins\/github.com\/terraform-linters\/tflint-ruleset-aws\/<span class=\"k\">${<\/span><span class=\"nv\">TFLINT_AWS_VERSION<\/span><span class=\"k\">}<\/span>\/ <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">rm<\/span> \/tmp\/tflint-ruleset-aws.zip <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">mkdir<\/span> <span class=\"nt\">-p<\/span>  ~\/.tflint.d\/plugins\/github.com\/terraform-linters\/tflint-ruleset-google\/<span class=\"k\">${<\/span><span class=\"nv\">TFLINT_GOOGLE_VERSION<\/span><span class=\"k\">}<\/span>\/ <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> wget <span class=\"nt\">-O<\/span> \/tmp\/tflint-ruleset-google.zip https:\/\/github.com\/terraform-linters\/tflint-ruleset-google\/releases\/download\/v<span class=\"k\">${<\/span><span class=\"nv\">TFLINT_GOOGLE_VERSION<\/span><span class=\"k\">}<\/span>\/tflint-ruleset-google_linux_amd64.zip <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> unzip \/tmp\/tflint-ruleset-google.zip  <span class=\"nt\">-d<\/span> ~\/.tflint.d\/plugins\/github.com\/terraform-linters\/tflint-ruleset-google\/<span class=\"k\">${<\/span><span class=\"nv\">TFLINT_GOOGLE_VERSION<\/span><span class=\"k\">}<\/span>\/ <span class=\"se\">\\\r\n<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">rm<\/span> \/tmp\/tflint-ruleset-google.zip\r\n<\/code><\/pre>\n<h2>tflint\u7684\u914d\u7f6e<\/h2>\n<p>\u5728.tflint.chl\u6587\u4ef6\u4e2d\u8fdb\u884c\u89c4\u5219\u8bbe\u7f6e\u548c\u5176\u4ed6\u64cd\u4f5c\u3002<\/p>\n<p>.tflint.chl \u306f $HOME\u4e0b\u3082\u3057\u304f\u306f\u30ab\u30ec\u30f3\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u304a\u304f\u3068option\u3092\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u306a\u304f\u8aad\u307f\u8fbc\u307e\u308c\u307e\u3059\u3002<\/p>\n<p>\u5728\u6211\u7684\u56e2\u961f\u4e2d<\/p>\n<pre class=\"post-pre\"><code>\r\n\u251c\u2500\u2500 terraform                \r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 aws                \r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ap-northeast-1    \r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dev                                                                                                                                                                                                                                                             \r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 main.tf\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 prd\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u251c\u2500\u2500 main.tf\r\n....\r\n...\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 modules\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 hogehoge\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 google\r\n\u2502\u00a0\u00a0     \u251c\u2500\u2500 modules\r\n\u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u251c\u2500\u2500 hogehoge\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 shared\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u251c\u2500\u2500 dev\r\n\u2502\u00a0\u00a0     \u2502\u00a0\u00a0     \u251c\u2500\u2500 main.tf\r\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 prd\r\n\u2502   \u2502   \u2502       \u251c\u2500\u2500 main.tf\r\n....\r\n...\r\n<\/code><\/pre>\n<p>\u6211\u4eec\u4f7f\u7528\u8fd9\u6837\u7684\u76ee\u5f55\u7ed3\u6784\u6765\u7ba1\u7406terraform\uff0c\u5e76\u4e14\u5bf9\u591a\u4e2a\u4e91\u73af\u5883\u6267\u884capply\u64cd\u4f5c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u521b\u5efa\u4e86\u6bcf\u4e2a\u4e91\u7684.tflint.chl\uff0c\u5e76\u901a\u8fc7&#8211;config\u53c2\u6570\u4f20\u9012\u6267\u884c\u3002<\/p>\n<pre class=\"post-pre\"><code>plugin \"aws\" {\r\n    enabled = true\r\n    version = \"0.12.0\"\r\n    source  = \"github.com\/terraform-linters\/tflint-ruleset-aws\"\r\n    deep_check = true\r\n}\r\n\r\n\r\nconfig {\r\n    module = true\r\n}\r\n\r\nrule \"terraform_required_version\" {\r\n  enabled = true\r\n}\r\n\r\nrule \"terraform_unused_declarations\" {\r\n  enabled = true\r\n}\r\n\r\nrule \"terraform_unused_required_providers\" {\r\n  enabled = true\r\n}\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>plugin \"google\" {\r\n    enabled = true\r\n    version = \"0.15.0\"\r\n    source  = \"github.com\/terraform-linters\/tflint-ruleset-google\"\r\n}\r\n\r\nconfig {\r\n    module = true\r\n}\r\n\r\nrule \"terraform_required_version\" {\r\n  enabled = true\r\n}\r\n\r\nrule \"terraform_unused_declarations\" {\r\n  enabled = true\r\n}\r\n\r\nrule \"terraform_unused_required_providers\" {\r\n  enabled = true\r\n}\r\n\r\n<\/code><\/pre>\n<p>\u5c06.tflint.chl\u6587\u4ef6\u653e\u7f6e\u5728$HOME\u76ee\u5f55\u4e0b\uff0c\u6267\u884c\u4e5f\u53ef\u4ee5\uff0c\u4f46\u662f\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5982\u679c\u5bf9\u6bcf\u4e2a\u4e91\u7aef\u7684\u8bbe\u7f6e\u8fdb\u884c\u4e86 tflint \u7684 deep_check=true \uff0c\u5219\u9700\u8981gcp\u7684\u51ed\u636e\uff0c\u5118\u7ba1aws\u7684\u8d44\u6e90linter\u5374\u9700\u8981gcp\u7684\u51ed\u636e\u3002\uff08\u5728\u5e26\u4e0adeep_check\u6807\u5fd7\u7684\u60c5\u51b5\u4e0b\u6267\u884ctflint\u65f6\uff0c\u53ef\u80fd\u662f\u4e3a\u4e86\u5728\u68c0\u67e5\u8fde\u63a5\u5230api\u65f6\u4f7f\u7528\u51ed\u636e\u3002\u4e5f\u8bb8\u53ef\u4ee5\u901a\u8fc7\u7981\u7528\u89c4\u5219\u6765\u907f\u514d\u8fd9\u4e2a\u95ee\u9898\u3002\uff09<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">deep_check\u306f\u5916\u90e8\u306eAPI(aws\/gcp\u306a\u3069)\u3092\u4f7f\u7528\u3057\u3066\u53b3\u5bc6\u306a\u30c1\u30a7\u30c3\u30af\u3092\u884c\u3046\u3088\u3046\u306b\u3059\u308b\u30d5\u30e9\u30b0<\/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\">\u30eb\u30fc\u30eb\u306e\u5b9a\u7fa9\u306a\u3069\u306fDocument\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">default\u30eb\u30fc\u30eb<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">aws plugin\u306e\u30eb\u30fc\u30eb<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">gcp plugin\u306e\u30eb\u30fc\u30eb<\/ul>\n<h2>\u6267\u884c<\/h2>\n<p>\u5728\u5b8c\u6210\u4e86.tflint.hcl\u7684\u51c6\u5907\u4e4b\u540e\uff0c\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a<br \/>\n\u8fdb\u5165\u6bcf\u4e2a\u5f53\u524d\u76ee\u5f55\uff0c<br \/>\n\u6267\u884ctflint &#8211;config .aws_tflint.chl \u6216 tflint &#8211;config .gcp_tflint.chl\u3002<br \/>\n\u5728Circle CI\u4e0a\u4e5f\u662f\u4e00\u6837\u7684\u3002<\/p>\n<h1>\u603b\u7ed3<\/h1>\n<p>\u901a\u8fc7\u5347\u7ea7Terraform\uff0c\u53ef\u4ee5\u5229\u7528\u65b0\u529f\u80fd\uff0c\u5982Move Block\u7b49\u6765\u5b9a\u4e49\u57fa\u7840\u8bbe\u65bd\u5373\u4ee3\u7801\uff08IaC\uff09\u3002<br \/>\n\u901a\u8fc7\u5f15\u5165linter\uff0c\u53ef\u4ee5\u5f3a\u5236\u6267\u884c\u89c4\u5219\uff0c\u4ece\u800c\u5728\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u51cf\u8f7bTerraform\u7684\u7ba1\u7406\u6210\u672c\u7b49\u3002<\/p>\n<p>\u5728DMM\uff0c\u6211\u4eec\u8d1f\u8d23\u5927\u6570\u636e\u57fa\u7840\u8bbe\u65bd\u7684\u8fd0\u8425\uff0c\u5e76\u4e14\u4e5f\u8fdb\u884c\u4e86\u5229\u7528\u5404\u79cd\u8d44\u6e90\u8fdb\u884c\u4ea7\u54c1\u5f00\u53d1\u7684\u5de5\u4f5c\u3002\u6211\u4eec\u4e5f\u6b63\u5728\u8fdb\u884c\u4e2d\u9014\u62db\u8058\u7b49\u6d3b\u52a8\uff0c\u56e0\u6b64\u5982\u679c\u60a8\u6709\u5174\u8da3\uff0c\u8bf7\u901a\u8fc7\u6211\u4eec\u516c\u53f8\u7684\u7f51\u7ad9\u7b49\u6e20\u9053\uff0c\u5c3d\u5feb\u7533\u8bf7\u9762\u8c08\u7b49\uff0c\u671f\u5f85\u60a8\u7684\u5e94\u8058\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u662fDMM\u7684yuua\u3002 \u7531\u65bc\u9032\u884c\u4e86terraform\u7684\u5347\u7d1a\u548ctflint\u7684\u5c0e\u5165\uff0c\u4ee5\u4e0b\u662f\u8a72\u904e\u7a0b\u7684\u6b65\u9a5f\u5099\u5fd8\u9304\u3002 \u5347 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48833","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>\u5347\u7ea7Terraform\u5e76\u5b89\u88c5Tflint - 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\/\u5347\u7ea7terraform\u5e76\u5b89\u88c5tflint\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5347\u7ea7Terraform\u5e76\u5b89\u88c5Tflint\" \/>\n<meta property=\"og:description\" content=\"\u6211\u662fDMM\u7684yuua\u3002 \u7531\u65bc\u9032\u884c\u4e86terraform\u7684\u5347\u7d1a\u548ctflint\u7684\u5c0e\u5165\uff0c\u4ee5\u4e0b\u662f\u8a72\u904e\u7a0b\u7684\u6b65\u9a5f\u5099\u5fd8\u9304\u3002 \u5347 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5347\u7ea7terraform\u5e76\u5b89\u88c5tflint\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-02-16T20:10:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T03:21:50+00:00\" \/>\n<meta name=\"author\" content=\"\u79d1, \u9896\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u9896\" \/>\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\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/\",\"name\":\"\u5347\u7ea7Terraform\u5e76\u5b89\u88c5Tflint - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-02-16T20:10:58+00:00\",\"dateModified\":\"2024-04-30T03:21:50+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5347\u7ea7Terraform\u5e76\u5b89\u88c5Tflint\"}]},{\"@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\/8ca01ba7f7362ad4edb7da206a12f29e\",\"name\":\"\u79d1, \u9896\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u9896\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keying\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5347\u7ea7Terraform\u5e76\u5b89\u88c5Tflint - 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\/\u5347\u7ea7terraform\u5e76\u5b89\u88c5tflint\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5347\u7ea7Terraform\u5e76\u5b89\u88c5Tflint","og_description":"\u6211\u662fDMM\u7684yuua\u3002 \u7531\u65bc\u9032\u884c\u4e86terraform\u7684\u5347\u7d1a\u548ctflint\u7684\u5c0e\u5165\uff0c\u4ee5\u4e0b\u662f\u8a72\u904e\u7a0b\u7684\u6b65\u9a5f\u5099\u5fd8\u9304\u3002 \u5347 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5347\u7ea7terraform\u5e76\u5b89\u88c5tflint\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-02-16T20:10:58+00:00","article_modified_time":"2024-04-30T03:21:50+00:00","author":"\u79d1, \u9896","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u9896","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"3 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/","name":"\u5347\u7ea7Terraform\u5e76\u5b89\u88c5Tflint - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-02-16T20:10:58+00:00","dateModified":"2024-04-30T03:21:50+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5347\u7ea7Terraform\u5e76\u5b89\u88c5Tflint"}]},{"@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\/8ca01ba7f7362ad4edb7da206a12f29e","name":"\u79d1, \u9896","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g","caption":"\u79d1, \u9896"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keying\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8d%87%e7%ba%a7terraform%e5%b9%b6%e5%ae%89%e8%a3%85tflint%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48833","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\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48833"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48833\/revisions"}],"predecessor-version":[{"id":91606,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48833\/revisions\/91606"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48833"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48833"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48833"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}