{"id":49147,"date":"2023-08-06T22:19:30","date_gmt":"2023-12-24T12:14:33","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82\/"},"modified":"2024-04-30T17:18:25","modified_gmt":"2024-04-30T09:18:25","slug":"%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82\/","title":{"rendered":"\u5f53\u6211\u5c1d\u8bd5\u5728Terraform\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u65f6\u9047\u5230\u4e86\u9519\u8bef"},"content":{"rendered":"<h1>\u524d\u63d0 t\u00ed)<\/h1>\n<p>\u5728\u516c\u53f8\u7684\u5de5\u4f5c\u4e2d\uff0c\u6211\u4eec\u7ecf\u5e38\u4f7f\u7528Terraform\u6765\u7ba1\u7406\u8d44\u6e90\u3002\u4f46\u662f\uff0c\u5f53\u6211\u4eec\u5c1d\u8bd5\u4f7f\u7528Terraform\u7684\u6a21\u5757\u5c06CloudWatch Alarms\u7ba1\u7406\u8d77\u6765\uff0c\u5e76\u4f7f\u7528for_each\u6765\u521b\u5efa\u7c7b\u4f3c\u7684CloudWatch Alarm\u65f6\uff0c\u51fa\u73b0\u4e86\u9519\u8bef\u3002<\/p>\n<p>\u5c0d\u65bcAPI Gateway + Lambda\u51fd\u6578\u7684REST API\u7d50\u69cb\uff0c\u6211\u5011\u8a66\u5716\u70ba\u6bcf\u500bLambda\u5275\u5efa\u4e00\u500bCloudWatch Alarm\u3002\u57fa\u672c\u4e0a\uff0c\u6211\u5011\u9700\u8981\u5275\u5efa\u4e00\u4e9b\u5177\u6709\u76f8\u540c\u6307\u6a19\u548c\u547d\u540d\u7a7a\u9593\u7684CloudWatch Alarm\uff0c\u53ea\u662f\u51fd\u6578\u540d\u7a31\u4e0d\u540c\u3002\u56e0\u6b64\uff0c\u6211\u5617\u8a66\u4f7f\u7528module\uff0bfor_each\u4f86\u7c21\u55ae\u5be6\u73fe\uff0c\u4f46\u537b\u9047\u5230\u4e86\u932f\u8aa4\u3002<\/p>\n<p>\u53e6\u5916\uff0c\u6211\u4eec\u5047\u8bbe\u8981\u76d1\u63a7\u7684Lambda\u51fd\u6570\u5177\u6709\u7279\u5b9a\u7684\u522b\u540d\uff0c\u4f8b\u5982\u53ea\u60f3\u76d1\u63a7\u751f\u4ea7\u73af\u5883\u4f7f\u7528\u7684Lambda\u51fd\u6570\u3002<\/p>\n<p>\u7531\u4e8e\u6211\u662f\u4e00\u4e2aTerraform\u521d\u5b66\u8005\uff0c\u5982\u679c\u6709\u4efb\u4f55\u9519\u8bef\u6216\u4e0d\u59a5\u4e4b\u5904\uff0c\u6211\u4f1a\u5f88\u611f\u6fc0\u60a8\u63d0\u4f9b\u8bc4\u8bba\u3002<\/p>\n<h1>\u7ed3\u8bba<\/h1>\n<p>\u5982\u679cTerraform\u7684\u7248\u672c\u662f0.12\u7cfb\u5217\uff0c\u5219\u65e0\u6cd5\u5728\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u5bf9\u8d44\u6e90\u8fdb\u884c\u5b9a\u4e49\u3002\u800c\u5982\u679c\u7248\u672c\u662f0.13\u7cfb\u5217\uff0c\u5219\u53ef\u4ee5\u5b9e\u73b0\u8be5\u529f\u80fd\u3002\u4e0b\u9762\u662f\u53c2\u8003\u6587\u732e\u94fe\u63a5\uff1a<br \/>\nhttps:\/\/www.hashicorp.com\/blog\/hashicorp-terraform-0-12-preview-for-and-for-each#module-count-and-for_each<\/p>\n<h1>\u6587\u4ef6\u7684\u7ed3\u6784 de<\/h1>\n<p>Terraform\u7684\u7248\u672c\u4e3a0.12.28\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">&gt;<\/span> terraform <span class=\"nt\">--version<\/span>\r\nTerraform v0.12.28\r\n\r\nYour version of Terraform is out of <span class=\"nb\">date<\/span><span class=\"o\">!<\/span> The latest version\r\nis 0.13.4. You can update by downloading from https:\/\/www.terraform.io\/downloads.html\r\n<\/code><\/pre>\n<p>\u5728module\/cloudwatch_alarm\/lambda\/\u6587\u4ef6\u5939\u4e0b\uff0c\u521b\u5efamain.tf\u548cvariables.tf\u6587\u4ef6\uff0c\u5185\u5bb9\u5982\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">provider<\/span> <span class=\"s2\">\"aws\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">region<\/span>                  <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span>\r\n  <span class=\"nx\">shared_credentials_file<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"~\/.aws\/credentials\"<\/span>\r\n  <span class=\"nx\">profile<\/span>                 <span class=\"p\">=<\/span> <span class=\"s2\">\"hogehoge\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">resource<\/span> <span class=\"s2\">\"aws_cloudwatch_metric_alarm\"<\/span> <span class=\"s2\">\"lambda_alarm\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">alarm_name<\/span>                <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">alarm_name<\/span>\r\n  <span class=\"nx\">comparison_operator<\/span>       <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">comparison_operator<\/span>\r\n  <span class=\"nx\">evaluation_periods<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">evaluation_periods<\/span>\r\n  <span class=\"nx\">metric_name<\/span>               <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">metric_name<\/span>\r\n  <span class=\"nx\">namespace<\/span>                 <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">namespace<\/span>  \r\n  <span class=\"nx\">period<\/span>                    <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">period<\/span>\r\n  <span class=\"nx\">statistic<\/span>                 <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">statistic<\/span>\r\n  <span class=\"nx\">threshold<\/span>                 <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">threshold<\/span>\r\n  <span class=\"nx\">insufficient_data_actions<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">insufficient_data_actions<\/span>\r\n  <span class=\"nx\">alarm_actions<\/span>             <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">alarm_actions<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nx\">variable<\/span> <span class=\"s2\">\"alarm_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"\"<\/span>\r\n  <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"The name of CloudWatch Alarm\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"comparison_operator\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"\"<\/span>\r\n  <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"The operator to evaluate the metrics\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"evaluation_periods\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"1\"<\/span>\r\n  <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"The number of the most recent periods, or data points, to evaluate when determining alarm state\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"metric_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"\"<\/span>\r\n  <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"metrics which you want to monitor\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"namespace\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\/Lambda\"<\/span>\r\n  <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"namespace which you want to monitor\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"period\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"300\"<\/span>\r\n  <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"The length of time to evaluate the metric or expression to create each individual data point for an alarm\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"statistic\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"\"<\/span>\r\n  <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"statistic to evaluate a metrics\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"threshold\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"\"<\/span>\r\n  <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"threshold to change the status of an alarm\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"alarm_description\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"\"<\/span>\r\n  <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"the explanation of an alarm\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"insufficient_data_actions\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"specify the actions when the data is not sufficient\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">type<\/span>    <span class=\"p\">=<\/span> <span class=\"nx\">list<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"dimensions\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span>     <span class=\"p\">=<\/span> <span class=\"p\">{}<\/span>\r\n  <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">map<\/span><span class=\"err\">(<\/span><span class=\"nx\">string<\/span><span class=\"err\">)<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"If you want to monitor specific resource in namespace, you can specify it\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">variable<\/span> <span class=\"s2\">\"alarm_actions\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[]<\/span>\r\n  <span class=\"nx\">type<\/span>    <span class=\"p\">=<\/span> <span class=\"nx\">list<\/span>\r\n  <span class=\"nx\">description<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Actions which are executed when the status of an alarm is changed\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u7136\u540e\uff0c\u4f7f\u7528module\u521b\u5efaCloudWatch Alarms\u3002\u5728config.tf\u4e2d\u8bb0\u5f55alarm\u7684\u914d\u7f6e\uff0c\u5e76\u5728main.tf\u4e2d\u4f7f\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">module<\/span> <span class=\"s2\">\"cloudwatch_for_lambda\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">source<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\".\/module\/cloudwatch_alarm\/lambda\"<\/span>\r\n\r\n  <span class=\"nx\">for_each<\/span>                  <span class=\"p\">=<\/span> <span class=\"nx\">local<\/span><span class=\"err\">.<\/span><span class=\"nx\">lambda_func_list<\/span>\r\n  <span class=\"nx\">alarm_name<\/span>                <span class=\"p\">=<\/span> <span class=\"s2\">\"${each.key}-${local.alarm_settings[\"<\/span><span class=\"nx\">metric<\/span><span class=\"s2\">\"]}-alarm\"<\/span>\r\n  <span class=\"nx\">comparison_operator<\/span>       <span class=\"p\">=<\/span> <span class=\"nx\">local<\/span><span class=\"err\">.<\/span><span class=\"nx\">alarm_settings<\/span><span class=\"p\">[<\/span><span class=\"s2\">\"comparison_operator\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">evaluation_periods<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">local<\/span><span class=\"err\">.<\/span><span class=\"nx\">alarm_settings<\/span><span class=\"p\">[<\/span><span class=\"s2\">\"evaluation_periods\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">metric_name<\/span>               <span class=\"p\">=<\/span> <span class=\"nx\">local<\/span><span class=\"err\">.<\/span><span class=\"nx\">alarm_settings<\/span><span class=\"p\">[<\/span><span class=\"s2\">\"metric\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">namespace<\/span>                 <span class=\"p\">=<\/span> <span class=\"nx\">local<\/span><span class=\"err\">.<\/span><span class=\"nx\">alarm_settings<\/span><span class=\"p\">[<\/span><span class=\"s2\">\"namespace\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">period<\/span>                    <span class=\"p\">=<\/span> <span class=\"nx\">local<\/span><span class=\"err\">.<\/span><span class=\"nx\">alarm_settings<\/span><span class=\"p\">[<\/span><span class=\"s2\">\"period\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">statistic<\/span>                 <span class=\"p\">=<\/span> <span class=\"nx\">local<\/span><span class=\"err\">.<\/span><span class=\"nx\">alarm_settings<\/span><span class=\"p\">[<\/span><span class=\"s2\">\"statistic\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">threshold<\/span>                 <span class=\"p\">=<\/span> <span class=\"nx\">local<\/span><span class=\"err\">.<\/span><span class=\"nx\">alarm_settings<\/span><span class=\"p\">[<\/span><span class=\"s2\">\"threshold\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">alarm_description<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"Detect errors from Lambda function ${each.key} \"<\/span>\r\n  <span class=\"nx\">insufficient_data_actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[]<\/span>\r\n  <span class=\"nx\">dimensions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">FunctionName<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"${each.key}\"<\/span><span class=\"err\">,<\/span>\r\n    <span class=\"nx\">Resource<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"${each.key}:${each.value}\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nx\">locals<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">lambda_func_list<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">func1<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"alias1\"<\/span><span class=\"err\">,<\/span>\r\n    <span class=\"nx\">func2<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"alias2\"<\/span><span class=\"err\">,<\/span>\r\n    <span class=\"nx\">func3<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"alias3\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">alarm_settings<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">comparison_operator<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"GreaterThanThreshold\"<\/span>\r\n    <span class=\"nx\">evaluation_periods<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"1\"<\/span>\r\n    <span class=\"nx\">metric<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"Errors\"<\/span>\r\n    <span class=\"nx\">namespace<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\/Lambda\"<\/span>\r\n    <span class=\"nx\">period<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"300\"<\/span>\r\n    <span class=\"nx\">statistic<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"Sum\"<\/span>\r\n    <span class=\"nx\">threshold<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"0.0\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h1>\u73b0\u5728\u8fdb\u884cterraform init\u548cterraform plan\u3002<\/h1>\n<p>\u5c1d\u8bd5\u8fdb\u884cterraform init\u7684\u65f6\u5019\uff0c\u9047\u5230\u4e86\u4e00\u4e9b\u95ee\u9898\u3002\u3002\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"o\">&gt;<\/span> terraform init\r\nInitializing modules...\r\n- cloudwatch_for_lambda <span class=\"k\">in <\/span>module\/cloudwatch_alarm\/lambda\r\n\r\nInitializing provider plugins...\r\n- Checking <span class=\"k\">for <\/span>available provider plugins...\r\n- Downloading plugin <span class=\"k\">for <\/span>provider <span class=\"s2\">\"aws\"<\/span> <span class=\"o\">(<\/span>hashicorp\/aws<span class=\"o\">)<\/span> 3.9.0...\r\n\r\nThe following providers <span class=\"k\">do <\/span>not have any version constraints <span class=\"k\">in <\/span>configuration,\r\nso the latest version was installed.\r\n\r\nTo prevent automatic upgrades to new major versions that may contain breaking\r\nchanges, it is recommended to add version <span class=\"o\">=<\/span> <span class=\"s2\">\"...\"<\/span> constraints to the\r\ncorresponding provider blocks <span class=\"k\">in <\/span>configuration, with the constraint strings\r\nsuggested below.\r\n\r\n<span class=\"k\">*<\/span> provider.aws: version <span class=\"o\">=<\/span> <span class=\"s2\">\"~&gt; 3.9\"<\/span>\r\n\r\n\r\nWarning: Skipping backend initialization pending configuration upgrade\r\n\r\nThe root module configuration contains errors that may be fixed by running the\r\nconfiguration upgrade tool, so Terraform is skipping backend initialization.\r\nSee below <span class=\"k\">for <\/span>more information.\r\n\r\n\r\nError: Reserved argument name <span class=\"k\">in <\/span>module block\r\n\r\n  on main.tf line 4, <span class=\"k\">in <\/span>module <span class=\"s2\">\"cloudwatch_for_lambda\"<\/span>:\r\n   4:   for_each                  <span class=\"o\">=<\/span> local.lambda_func_list\r\n\r\nThe name <span class=\"s2\">\"for_each\"<\/span> is reserved <span class=\"k\">for <\/span>use <span class=\"k\">in <\/span>a future version of Terraform.\r\n\r\n\r\nTerraform has initialized, but configuration upgrades may be needed.\r\n\r\nTerraform found syntax errors <span class=\"k\">in <\/span>the configuration that prevented full\r\ninitialization. If you<span class=\"s1\">'ve recently upgraded to Terraform v0.12, this may be\r\nbecause your configuration uses syntax constructs that are no longer valid,\r\nand so must be updated before full initialization is possible.\r\n\r\nTerraform has installed the required providers to support the configuration\r\nupgrade process. To begin upgrading your configuration, run the following:\r\n    terraform 0.12upgrade\r\n\r\nTo see the full set of errors that led to this message, run:\r\n    terraform validate\r\n<\/span><\/code><\/pre>\n<p>\u5728\u8c03\u67e5\u201cfor_each\u201d\u8fd9\u4e2a\u540d\u79f0\u662f\u4fdd\u7559\u7ed9\u672a\u6765\u7248\u672c\u7684\u4e00\u4e2aTerraform\u9519\u8bef\u65f6\uff0c\u6211\u627e\u5230\u4e86\u4ee5\u4e0b\u6587\u7ae0\u3002<br \/>\nhttps:\/\/www.hashicorp.com\/blog\/hashicorp-terraform-0-12-preview-for-and-for-each#module-count-and-for_each<br \/>\n\u4ee5\u4e0b\u662f\u4ece\u6587\u7ae0\u4e2d\u6458\u5f55\u7684\u5185\u5bb9\u3002<\/p>\n<blockquote><p>\u6a21\u5757\u8ba1\u6570\u548cfor_each<\/p>\n<p>\u957f\u671f\u4ee5\u6765\uff0c\u7528\u6237\u4e00\u76f4\u5e0c\u671b\u5728\u6a21\u5757\u5757\u4e2d\u80fd\u591f\u4f7f\u7528count\u5143\u53c2\u6570\uff0c\u4ee5\u4fbf\u66f4\u8f7b\u677e\u5730\u521b\u5efa\u591a\u4e2a\u76f8\u540c\u6a21\u5757\u7684\u5b9e\u4f8b\u3002<\/p>\n<p>\u5728Terraform 0.12\u7684\u5f00\u53d1\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u4e00\u76f4\u5728\u4e3a\u6b64\u505a\u51c6\u5907\u5de5\u4f5c\uff0c\u5e76\u5728\u4ee5\u540e\u7684\u7248\u672c\u4e2d\u5b8c\u6210\u8fd9\u9879\u5de5\u4f5c\u3002\u9664\u4e86count\uff0c\u6a21\u5757\u5757\u8fd8\u4f1a\u63a5\u53d7\u4e0a\u9762\u8d44\u6e90\u4e2d\u63cf\u8ff0\u7684\u65b0\u7684for_each\u53c2\u6570\uff0c\u5e76\u83b7\u5f97\u7c7b\u4f3c\u7684\u7ed3\u679c\u3002<\/p>\n<p>\u7531\u4e8e\u8be5\u529f\u80fd\u5728Terraform\u73b0\u6709\u7684\u67b6\u6784\u4e2d\u5b9e\u65bd\u8d77\u6765\u7279\u522b\u590d\u6742\uff0c\u6240\u4ee5\u6211\u4eec\u80af\u5b9a\u9700\u8981\u8fdb\u884c\u66f4\u591a\u7684\u5de5\u4f5c\uff0c\u4ee5\u652f\u6301\u6b64\u529f\u80fd\u3002\u4e3a\u4e86\u907f\u514d\u4ee5\u540e\u7684\u7248\u672c\u4e2d\u7684\u8fdb\u4e00\u6b65\u7834\u574f\u6027\u53d8\u66f4\uff0c0.12\u7248\u672c\u5c06\u4fdd\u7559\u6a21\u5757\u7684\u8f93\u5165\u53d8\u91cf\u540d\u79f0count\u548cfor_each\uff0c\u4e3a\u6b64\u529f\u80fd\u7684\u5b8c\u6210\u505a\u597d\u51c6\u5907\u3002<\/p><\/blockquote>\n<p>\u770b\u8d77\u6765\u662f\u7248\u672c\u7684\u95ee\u9898\u30020.12.xx\u7248\u672c\u4f3c\u4e4e\u65e0\u6cd5\u5bf9\u6a21\u5757\u4f7f\u7528count\u548cfor_each\u51fd\u6570\u3002\u6211\u5c06\u5c1d\u8bd5\u5347\u7ea7\u81f30.13.1\u5e76\u518d\u6b21\u5c1d\u8bd5\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">&gt;<\/span> tfenv list\r\n  0.13.1\r\n<span class=\"k\">*<\/span> 0.12.28 <span class=\"o\">(<\/span><span class=\"nb\">set <\/span>by \/usr\/local\/Cellar\/tfenv\/2.0.0\/version<span class=\"o\">)<\/span>\r\n\r\n<span class=\"o\">&gt;<\/span> tfenv use 0.13.1\r\nSwitching default version to v0.13.1\r\nSwitching completed\r\n\r\n<span class=\"o\">&gt;<\/span> terraform init\r\nInitializing modules...\r\nThere are some problems with the configuration, described below.\r\n\r\nThe Terraform configuration must be valid before initialization so that\r\nTerraform can determine which modules and providers need to be installed.\r\n\r\nError: Module does not support for_each\r\n\r\n  on main.tf line 4, <span class=\"k\">in <\/span>module <span class=\"s2\">\"cloudwatch_for_lambda\"<\/span>:\r\n   4:   for_each                  <span class=\"o\">=<\/span> local.lambda_func_list\r\n\r\nModule <span class=\"s2\">\"cloudwatch_for_lambda\"<\/span> cannot be used with for_each because it\r\ncontains a nested provider configuration <span class=\"k\">for<\/span> <span class=\"s2\">\"aws\"<\/span>, at\r\nmodule\/cloudwatch_alarm\/lambda\/main.tf:1,10-15.\r\n\r\nThis module can be made compatible with for_each by changing it to receive all\r\nof its provider configurations from the calling module, by using the\r\n<span class=\"s2\">\"providers\"<\/span> argument <span class=\"k\">in <\/span>the calling module block.\r\n<\/code><\/pre>\n<p>\u51fa\u73b0\u9519\u8bef\u3002\u770b\u8d77\u6765\u662f\u56e0\u4e3a\u5728\u6a21\u5757\u7684main.tf\u6587\u4ef6\u4e2d\u5305\u542b\u4e86\u63d0\u4f9b\u7a0b\u5e8f\u7684\u4fe1\u606f\u3002\u6211\u4eec\u9700\u8981\u5c06module\/cloudwatch_alarm\/lambda\/main.tf\u4e2d\u7684\u63d0\u4f9b\u7a0b\u5e8f\u90e8\u5206\u5206\u79bb\u5230provider.tf\u4e2d\uff0c\u50cf\u4e0b\u9762\u8fd9\u6837\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">provider<\/span> <span class=\"s2\">\"aws\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">region<\/span>                  <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span>\r\n  <span class=\"nx\">shared_credentials_file<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"~\/.aws\/credentials\"<\/span>\r\n  <span class=\"nx\">profile<\/span>                 <span class=\"p\">=<\/span> <span class=\"s2\">\"hogehoge\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nx\">resource<\/span> <span class=\"s2\">\"aws_cloudwatch_metric_alarm\"<\/span> <span class=\"s2\">\"lambda_alarm\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">alarm_name<\/span>                <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">alarm_name<\/span>\r\n  <span class=\"nx\">comparison_operator<\/span>       <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">comparison_operator<\/span>\r\n  <span class=\"nx\">evaluation_periods<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">evaluation_periods<\/span>\r\n  <span class=\"nx\">metric_name<\/span>               <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">metric_name<\/span>\r\n  <span class=\"nx\">namespace<\/span>                 <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">namespace<\/span>  \r\n  <span class=\"nx\">period<\/span>                    <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">period<\/span>\r\n  <span class=\"nx\">statistic<\/span>                 <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">statistic<\/span>\r\n  <span class=\"nx\">threshold<\/span>                 <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">threshold<\/span>\r\n  <span class=\"nx\">insufficient_data_actions<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">insufficient_data_actions<\/span>\r\n  <span class=\"nx\">alarm_actions<\/span>             <span class=\"p\">=<\/span> <span class=\"nx\">var<\/span><span class=\"err\">.<\/span><span class=\"nx\">alarm_actions<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8bf7\u518d\u6b21\u6267\u884cterraform init\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">&gt;<\/span> terraform init\r\nInitializing modules...\r\n\r\nInitializing the backend...\r\n\r\nInitializing provider plugins...\r\n- Finding latest version of hashicorp\/aws...\r\n- Installing hashicorp\/aws v3.9.0...\r\n- Installed hashicorp\/aws v3.9.0 <span class=\"o\">(<\/span>signed by HashiCorp<span class=\"o\">)<\/span>\r\n\r\nThe following providers <span class=\"k\">do <\/span>not have any version constraints <span class=\"k\">in <\/span>configuration,\r\nso the latest version was installed.\r\n\r\nTo prevent automatic upgrades to new major versions that may contain breaking\r\nchanges, we recommend adding version constraints <span class=\"k\">in <\/span>a required_providers block\r\n<span class=\"k\">in <\/span>your configuration, with the constraint strings suggested below.\r\n\r\n<span class=\"k\">*<\/span> hashicorp\/aws: version <span class=\"o\">=<\/span> <span class=\"s2\">\"~&gt; 3.9.0\"<\/span>\r\n\r\nTerraform has been successfully initialized!\r\n\r\nYou may now begin working with Terraform. Try running <span class=\"s2\">\"terraform plan\"<\/span> to see\r\nany changes that are required <span class=\"k\">for <\/span>your infrastructure. All Terraform commands\r\nshould now work.\r\n\r\nIf you ever <span class=\"nb\">set <\/span>or change modules or backend configuration <span class=\"k\">for <\/span>Terraform,\r\nrerun this <span class=\"nb\">command <\/span>to reinitialize your working directory. If you forget, other\r\ncommands will detect it and remind you to <span class=\"k\">do <\/span>so <span class=\"k\">if <\/span>necessary.\r\n<\/code><\/pre>\n<p>\u6211\u4f1a\u6267\u884cterraform plan\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">&gt;<\/span> terraform plan\r\nRefreshing Terraform state <span class=\"k\">in<\/span><span class=\"nt\">-memory<\/span> prior to plan...\r\nThe refreshed state will be used to calculate this plan, but will not be\r\npersisted to <span class=\"nb\">local <\/span>or remote state storage.\r\n\r\n\r\n<span class=\"nt\">------------------------------------------------------------------------<\/span>\r\n\r\nAn execution plan has been generated and is shown below.\r\nResource actions are indicated with the following symbols:\r\n  + create\r\n\r\nTerraform will perform the following actions:\r\n\r\n  <span class=\"c\"># module.cloudwatch_for_lambda[\"func1\"].aws_cloudwatch_metric_alarm.lambda_alarm will be created<\/span>\r\n  + resource <span class=\"s2\">\"aws_cloudwatch_metric_alarm\"<\/span> <span class=\"s2\">\"lambda_alarm\"<\/span> <span class=\"o\">{<\/span>\r\n      + actions_enabled                       <span class=\"o\">=<\/span> <span class=\"nb\">true<\/span>\r\n      + alarm_name                            <span class=\"o\">=<\/span> <span class=\"s2\">\"func1-Errors-alarm\"<\/span>\r\n      + arn                                   <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + comparison_operator                   <span class=\"o\">=<\/span> <span class=\"s2\">\"GreaterThanThreshold\"<\/span>\r\n      + evaluate_low_sample_count_percentiles <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + evaluation_periods                    <span class=\"o\">=<\/span> 1\r\n      + <span class=\"nb\">id<\/span>                                    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + metric_name                           <span class=\"o\">=<\/span> <span class=\"s2\">\"Errors\"<\/span>\r\n      + namespace                             <span class=\"o\">=<\/span> <span class=\"s2\">\"AWS\/Lambda\"<\/span>\r\n      + period                                <span class=\"o\">=<\/span> 300\r\n      + statistic                             <span class=\"o\">=<\/span> <span class=\"s2\">\"Sum\"<\/span>\r\n      + threshold                             <span class=\"o\">=<\/span> 0\r\n      + treat_missing_data                    <span class=\"o\">=<\/span> <span class=\"s2\">\"missing\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"c\"># module.cloudwatch_for_lambda[\"func2\"].aws_cloudwatch_metric_alarm.lambda_alarm will be created<\/span>\r\n  + resource <span class=\"s2\">\"aws_cloudwatch_metric_alarm\"<\/span> <span class=\"s2\">\"lambda_alarm\"<\/span> <span class=\"o\">{<\/span>\r\n      + actions_enabled                       <span class=\"o\">=<\/span> <span class=\"nb\">true<\/span>\r\n      + alarm_name                            <span class=\"o\">=<\/span> <span class=\"s2\">\"func2-Errors-alarm\"<\/span>\r\n      + arn                                   <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + comparison_operator                   <span class=\"o\">=<\/span> <span class=\"s2\">\"GreaterThanThreshold\"<\/span>\r\n      + evaluate_low_sample_count_percentiles <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + evaluation_periods                    <span class=\"o\">=<\/span> 1\r\n      + <span class=\"nb\">id<\/span>                                    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + metric_name                           <span class=\"o\">=<\/span> <span class=\"s2\">\"Errors\"<\/span>\r\n      + namespace                             <span class=\"o\">=<\/span> <span class=\"s2\">\"AWS\/Lambda\"<\/span>\r\n      + period                                <span class=\"o\">=<\/span> 300\r\n      + statistic                             <span class=\"o\">=<\/span> <span class=\"s2\">\"Sum\"<\/span>\r\n      + threshold                             <span class=\"o\">=<\/span> 0\r\n      + treat_missing_data                    <span class=\"o\">=<\/span> <span class=\"s2\">\"missing\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n  <span class=\"c\"># module.cloudwatch_for_lambda[\"func3\"].aws_cloudwatch_metric_alarm.lambda_alarm will be created<\/span>\r\n  + resource <span class=\"s2\">\"aws_cloudwatch_metric_alarm\"<\/span> <span class=\"s2\">\"lambda_alarm\"<\/span> <span class=\"o\">{<\/span>\r\n      + actions_enabled                       <span class=\"o\">=<\/span> <span class=\"nb\">true<\/span>\r\n      + alarm_name                            <span class=\"o\">=<\/span> <span class=\"s2\">\"func3-Errors-alarm\"<\/span>\r\n      + arn                                   <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + comparison_operator                   <span class=\"o\">=<\/span> <span class=\"s2\">\"GreaterThanThreshold\"<\/span>\r\n      + evaluate_low_sample_count_percentiles <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + evaluation_periods                    <span class=\"o\">=<\/span> 1\r\n      + <span class=\"nb\">id<\/span>                                    <span class=\"o\">=<\/span> <span class=\"o\">(<\/span>known after apply<span class=\"o\">)<\/span>\r\n      + metric_name                           <span class=\"o\">=<\/span> <span class=\"s2\">\"Errors\"<\/span>\r\n      + namespace                             <span class=\"o\">=<\/span> <span class=\"s2\">\"AWS\/Lambda\"<\/span>\r\n      + period                                <span class=\"o\">=<\/span> 300\r\n      + statistic                             <span class=\"o\">=<\/span> <span class=\"s2\">\"Sum\"<\/span>\r\n      + threshold                             <span class=\"o\">=<\/span> 0\r\n      + treat_missing_data                    <span class=\"o\">=<\/span> <span class=\"s2\">\"missing\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\nPlan: 3 to add, 0 to change, 0 to destroy.\r\n\r\n<span class=\"nt\">------------------------------------------------------------------------<\/span>\r\n\r\nNote: You didn<span class=\"s1\">'t specify an \"-out\" parameter to save this plan, so Terraform\r\ncan'<\/span>t guarantee that exactly these actions will be performed <span class=\"k\">if<\/span>\r\n<span class=\"s2\">\"terraform apply\"<\/span> is subsequently run.\r\n<\/code><\/pre>\n<p>\u770b\u8d77\u6765\u53ef\u4ee5\u521b\u5efa\u4e09\u4e2a\u540d\u5b57\u4e0d\u540c\u7684CloudWatch Alarm\uff0c\u6b63\u5982\u6240\u671f\u671b\u7684\u90a3\u6837\u3002<\/p>\n<h1>\u603b\u7ed3<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">0.12\u7cfb\u306eterraform\u3092\u4f7f\u7528\u3057\u3066\u3044\u3066\u3001module\u3067\u5b9a\u7fa9\u3055\u308c\u305f\u30ea\u30bd\u30fc\u30b9\u5bfe\u3057\u3066for_each\u3092\u4f7f\u304a\u3046\u3068\u3059\u308b\u3068\u30a8\u30e9\u30fc\u304c\u51fa\u308b\u3088\u3046\u3067\u3059\u30020.13\u7cfb\u3060\u3068\u3046\u307e\u304f\u3044\u304d\u307e\u3059\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u7121\u7406\u3084\u308amodule\u306e\u4e2d\u306b\u6301\u3063\u3066\u3044\u304f\u5fc5\u8981\u6027\u306f\u306a\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u304c\u3001\u305d\u308c\u306fterraform\u30d5\u30a1\u30a4\u30eb\u3092\u3069\u3046\u3084\u3063\u3066\u7ba1\u7406\u3057\u3066\u3044\u308b\u304b\u306b\u3082\u3088\u308b\u306e\u3067\u306f\u306a\u3044\u304b\u3068\u601d\u3044\u307e\u3059\u3002<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u63d0 t\u00ed) \u5728\u516c\u53f8\u7684\u5de5\u4f5c\u4e2d\uff0c\u6211\u4eec\u7ecf\u5e38\u4f7f\u7528Terraform\u6765\u7ba1\u7406\u8d44\u6e90\u3002\u4f46\u662f\uff0c\u5f53\u6211\u4eec\u5c1d\u8bd5\u4f7f\u7528Terraform [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-49147","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>\u5f53\u6211\u5c1d\u8bd5\u5728Terraform\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u65f6\u9047\u5230\u4e86\u9519\u8bef - 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\/\u5f53\u6211\u5c1d\u8bd5\u5728terraform\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u65f6\u9047\u5230\u4e86\u9519\u8bef\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5f53\u6211\u5c1d\u8bd5\u5728Terraform\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u65f6\u9047\u5230\u4e86\u9519\u8bef\" \/>\n<meta property=\"og:description\" content=\"\u524d\u63d0 t\u00ed) \u5728\u516c\u53f8\u7684\u5de5\u4f5c\u4e2d\uff0c\u6211\u4eec\u7ecf\u5e38\u4f7f\u7528Terraform\u6765\u7ba1\u7406\u8d44\u6e90\u3002\u4f46\u662f\uff0c\u5f53\u6211\u4eec\u5c1d\u8bd5\u4f7f\u7528Terraform [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5f53\u6211\u5c1d\u8bd5\u5728terraform\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u65f6\u9047\u5230\u4e86\u9519\u8bef\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-24T12:14:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T09:18:25+00:00\" \/>\n<meta name=\"author\" content=\"\u79d1, \u96c5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u96c5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 \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%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82\/\",\"name\":\"\u5f53\u6211\u5c1d\u8bd5\u5728Terraform\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u65f6\u9047\u5230\u4e86\u9519\u8bef - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-12-24T12:14:33+00:00\",\"dateModified\":\"2024-04-30T09:18:25+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5f53\u6211\u5c1d\u8bd5\u5728Terraform\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u65f6\u9047\u5230\u4e86\u9519\u8bef\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\",\"name\":\"\u79d1, \u96c5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u96c5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5f53\u6211\u5c1d\u8bd5\u5728Terraform\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u65f6\u9047\u5230\u4e86\u9519\u8bef - 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\/\u5f53\u6211\u5c1d\u8bd5\u5728terraform\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u65f6\u9047\u5230\u4e86\u9519\u8bef\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5f53\u6211\u5c1d\u8bd5\u5728Terraform\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u65f6\u9047\u5230\u4e86\u9519\u8bef","og_description":"\u524d\u63d0 t\u00ed) \u5728\u516c\u53f8\u7684\u5de5\u4f5c\u4e2d\uff0c\u6211\u4eec\u7ecf\u5e38\u4f7f\u7528Terraform\u6765\u7ba1\u7406\u8d44\u6e90\u3002\u4f46\u662f\uff0c\u5f53\u6211\u4eec\u5c1d\u8bd5\u4f7f\u7528Terraform [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5f53\u6211\u5c1d\u8bd5\u5728terraform\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u65f6\u9047\u5230\u4e86\u9519\u8bef\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-12-24T12:14:33+00:00","article_modified_time":"2024-04-30T09:18:25+00:00","author":"\u79d1, \u96c5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u96c5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"7 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82\/","name":"\u5f53\u6211\u5c1d\u8bd5\u5728Terraform\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u65f6\u9047\u5230\u4e86\u9519\u8bef - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-12-24T12:14:33+00:00","dateModified":"2024-04-30T09:18:25+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5f53\u6211\u5c1d\u8bd5\u5728Terraform\u6a21\u5757\u4e2d\u4f7f\u7528for_each\u65f6\u9047\u5230\u4e86\u9519\u8bef"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a","name":"\u79d1, \u96c5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","caption":"\u79d1, \u96c5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%bd%93%e6%88%91%e5%b0%9d%e8%af%95%e5%9c%a8terraform%e6%a8%a1%e5%9d%97%e4%b8%ad%e4%bd%bf%e7%94%a8for_each%e6%97%b6%e9%81%87%e5%88%b0%e4%ba%86%e9%94%99%e8%af%af%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\/49147","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=49147"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49147\/revisions"}],"predecessor-version":[{"id":93233,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49147\/revisions\/93233"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=49147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=49147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=49147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}