{"id":2343,"date":"2025-03-24T08:47:38","date_gmt":"2025-03-23T23:47:38","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2343"},"modified":"2025-03-24T08:48:01","modified_gmt":"2025-03-23T23:48:01","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91terraform-count%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bc%9a15%e5%80%8b%e3%81%ae%e5%ae%9f%e8%b7%b5%e7%9a%84","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2343","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Terraform count\u306e\u4f7f\u3044\u65b9\u5b8c\u5168\u30ac\u30a4\u30c9\uff1a15\u500b\u306e\u5b9f\u8df5\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3067\u5b66\u3076\u52b9\u7387\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Terraform count\u3068\u306f\uff1f\u5b9f\u52d9\u3067\u4f7f\u3048\u308b\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">count\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u57fa\u672c\u7684\u306a\u6a5f\u80fd\u3068\u7279\u5fb4<\/a>      <\/li>      <li>        <a href=\"#i-2\">count\u3092\u4f7f\u7528\u3059\u308b\u30e1\u30ea\u30c3\u30c8\uff1a\u30b3\u30fc\u30c9\u91cf\u524a\u6e1b\u3068\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u5411\u4e0a<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-3\">count\u3068for_each\u306e\u9055\u3044\u3068\u4f7f\u3044\u65b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-4\">Terraform count\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\uff1a\u30b9\u30c6\u30c3\u30d7\u30d0\u30a4\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-5\">count\u69cb\u6587\u306e\u57fa\u672c\u30d1\u30bf\u30fc\u30f3\u3068\u8a18\u8ff0\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-6\">count.index\u306e\u6d3b\u7528\u65b9\u6cd5\u3068\u6ce8\u610f\u70b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-7\">\u6761\u4ef6\u5206\u5c90\u3068count\u306e\u7d44\u307f\u5408\u308f\u305b\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">\u5b9f\u8df5\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3067\u5b66\u3076Terraform count\u6d3b\u7528\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">\u8907\u6570\u306eEC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u52b9\u7387\u7684\u306b\u30c7\u30d7\u30ed\u30a4<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u7570\u306a\u308bAZ\u306b\u540c\u3058\u30ea\u30bd\u30fc\u30b9\u3092\u5c55\u958b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-11\">\u74b0\u5883\u3054\u3068\u306e\u30ea\u30bd\u30fc\u30b9\u6570\u5236\u5fa1\u306e\u5b9f\u88c5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-12\">Terraform count\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3068\u6ce8\u610f\u70b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-13\">count\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04<\/a>      <\/li>      <li>        <a href=\"#i-14\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-15\">\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u3092\u8003\u616e\u3057\u305f\u30e2\u30b8\u30e5\u30fc\u30eb\u8a2d\u8a08<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-16\">\u5b9f\u8df5\u6f14\u7fd2\uff1a\u30ab\u30a6\u30f3\u30c8\u3092\u4f7f\u7528\u3057\u305f\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u4f8b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-17\">\u30de\u30eb\u30c1AZ\u69cb\u6210\u306eVPC\u30b5\u30d6\u30cd\u30c3\u30c8\u4f5c\u6210<\/a>      <\/li>      <li>        <a href=\"#i-18\">Auto Scaling\u7528\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7\u8a2d\u5b9a<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-19\">\u8907\u6570\u74b0\u5883\u5411\u3051IAM\u30ed\u30fc\u30eb\u306e\u4e00\u62ec\u4f5c\u6210<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Terraform count\u3068\u306f\uff1f\u5b9f\u52d9\u3067\u4f7f\u3048\u308b\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">count\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u57fa\u672c\u7684\u306a\u6a5f\u80fd\u3068\u7279\u5fb4<\/h3>\n\n\n\n<p>Terraform count\u306f\u3001\u540c\u4e00\u306e\u30ea\u30bd\u30fc\u30b9\u3092\u8907\u6570\u4f5c\u6210\u3059\u308b\u969b\u306b\u4f7f\u7528\u3059\u308b\u6a5f\u80fd\u3067\u3059\u3002count\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u540c\u3058\u8a2d\u5b9a\u306e\u30ea\u30bd\u30fc\u30b9\u3092\u6307\u5b9a\u3057\u305f\u6570\u3060\u3051\u7c21\u5358\u306b\u4f5c\u6210\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u69cb\u6587:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">resource \"aws_instance\" \"web\" {\n  count         = 3  # 3\u3064\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u4f5c\u6210\n  ami           = \"ami-0c55b159cbfafe1f0\"\n  instance_type = \"t2.micro\"\n\n  tags = {\n    Name = \"web-server-${count.index}\"  # 0\u304b\u3089\u59cb\u307e\u308b\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u4f7f\u7528\n  }\n}<\/pre>\n\n\n\n<p>count\u306e\u4e3b\u306a\u7279\u5fb4:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>0\u304b\u3089\u59cb\u307e\u308b\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\uff08count.index\uff09\u304c\u81ea\u52d5\u7684\u306b\u63d0\u4f9b\u3055\u308c\u308b<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u540d\u306f\u914d\u5217\u5f62\u5f0f\u3067\u53c2\u7167\uff08web[0], web[1], web[2]\uff09<\/li>\n\n\n\n<li>\u6570\u5024\u306b\u3088\u308b\u5236\u5fa1\u304c\u53ef\u80fd\uff08\u6761\u4ef6\u5206\u5c90\u3068\u306e\u7d44\u307f\u5408\u308f\u305b\uff09<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">count\u3092\u4f7f\u7528\u3059\u308b\u30e1\u30ea\u30c3\u30c8\uff1a\u30b3\u30fc\u30c9\u91cf\u524a\u6e1b\u3068\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u5411\u4e0a<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30c9\u306e\u7c21\u7d20\u5316<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u540c\u3058\u30ea\u30bd\u30fc\u30b9\u5b9a\u7fa9\u306e\u7e70\u308a\u8fd4\u3057\u3092\u9632\u6b62<\/li>\n\n\n\n<li>DRY\uff08Don\u2019t Repeat Yourself\uff09\u539f\u5247\u306e\u5b9f\u73fe<\/li>\n\n\n\n<li>\u5909\u66f4\u6642\u306e\u4f5c\u696d\u91cf\u524a\u6e1b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u52d5\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u74b0\u5883\u5909\u6570\u306b\u3088\u308b\u5236\u5fa1\u304c\u5bb9\u6613<\/li>\n\n\n\n<li>\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u304c\u7c21\u5358<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   variable \"instance_count\" {\n     description = \"Number of instances to create\"\n     type        = number\n     default     = 2\n   }\n\n   resource \"aws_instance\" \"app\" {\n     count = var.instance_count\n     # ... \u305d\u306e\u4ed6\u306e\u8a2d\u5b9a\n   }<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u306e\u5411\u4e0a<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e00\u62ec\u5909\u66f4\u304c\u53ef\u80fd<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u306e\u898b\u901a\u3057\u304c\u826f\u597d<\/li>\n\n\n\n<li>\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u304c\u3057\u3084\u3059\u3044<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">count\u3068for_each\u306e\u9055\u3044\u3068\u4f7f\u3044\u65b9<\/h3>\n\n\n<div id=\"id-d3c6277a-e623-4fb7-ad77-d1816772bed5\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6a5f\u80fd<\/th><th>count<\/th><th>for_each<\/th><\/tr><\/thead><tbody><tr><td>\u30c7\u30fc\u30bf\u578b<\/td><td>\u6570\u5024<\/td><td>\u30de\u30c3\u30d7\u307e\u305f\u306f\u30bb\u30c3\u30c8<\/td><\/tr><tr><td>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u53c2\u7167<\/td><td>\u6570\u5024\u30a4\u30f3\u30c7\u30c3\u30af\u30b9<\/td><td>\u30ad\u30fc\u306b\u3088\u308b\u53c2\u7167<\/td><\/tr><tr><td>\u30ea\u30bd\u30fc\u30b9\u524a\u9664\u6642\u306e\u52d5\u4f5c<\/td><td>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u304c\u8a70\u3081\u3089\u308c\u308b<\/td><td>\u30ad\u30fc\u306b\u57fa\u3065\u3044\u3066\u500b\u5225\u306b\u7ba1\u7406<\/td><\/tr><tr><td>\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9<\/td><td>\u540c\u4e00\u8a2d\u5b9a\u306e\u8907\u88fd<\/td><td>\u7570\u306a\u308b\u8a2d\u5b9a\u306e\u4e00\u62ec\u4f5c\u6210<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>for_each\u306e\u4f7f\u7528\u4f8b:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">resource \"aws_instance\" \"web\" {\n  for_each = {\n    \"prod\" = \"t2.medium\"\n    \"dev\"  = \"t2.micro\"\n  }\n\n  instance_type = each.value\n  tags = {\n    Name = \"web-${each.key}\"\n  }\n}<\/pre>\n\n\n\n<p>\u9078\u629e\u306e\u30dd\u30a4\u30f3\u30c8:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u540c\u4e00\u8a2d\u5b9a\u306e\u8907\u88fd \u2192 count<\/li>\n\n\n\n<li>\u500b\u5225\u306e\u8a2d\u5b9a\u304c\u5fc5\u8981 \u2192 for_each<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u306e\u8ffd\u52a0\/\u524a\u9664\u304c\u983b\u7e41 \u2192 for_each<\/li>\n\n\n\n<li>\u30b7\u30f3\u30d7\u30eb\u306a\u6570\u5024\u5236\u5fa1 \u2192 count<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">Terraform count\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\uff1a\u30b9\u30c6\u30c3\u30d7\u30d0\u30a4\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">count\u69cb\u6587\u306e\u57fa\u672c\u30d1\u30bf\u30fc\u30f3\u3068\u8a18\u8ff0\u65b9\u6cd5<\/h3>\n\n\n\n<p>count\u306e\u57fa\u672c\u69cb\u6587\u306b\u306f\u4ee5\u4e0b\u306e\u30d1\u30bf\u30fc\u30f3\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u57fa\u672c\u7684\u306a\u6570\u5024\u6307\u5b9a\nresource \"aws_subnet\" \"public\" {\n  count             = 3\n  vpc_id            = aws_vpc.main.id\n  cidr_block        = \"10.0.${count.index + 1}.0\/24\"\n  availability_zone = data.aws_availability_zones.available.names[count.index]\n}\n\n# \u5909\u6570\u306b\u3088\u308b\u5236\u5fa1\nresource \"aws_instance\" \"web\" {\n  count         = var.environment == \"production\" ? 3 : 1\n  instance_type = \"t2.micro\"\n}\n\n# \u30ea\u30b9\u30c8\u306e\u9577\u3055\u306b\u57fa\u3065\u304f\u6307\u5b9a\nresource \"aws_iam_user\" \"developers\" {\n  count = length(var.developer_names)\n  name  = var.developer_names[count.index]\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">count.index\u306e\u6d3b\u7528\u65b9\u6cd5\u3068\u6ce8\u610f\u70b9<\/h3>\n\n\n\n<p>count.index\u306e\u9ad8\u5ea6\u306a\u4f7f\u7528\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># CIDR\u30d6\u30ed\u30c3\u30af\u306e\u52d5\u7684\u751f\u6210\nresource \"aws_subnet\" \"private\" {\n  count             = 3\n  vpc_id            = aws_vpc.main.id\n  # 10.0.1.0\/24, 10.0.2.0\/24, 10.0.3.0\/24\n  cidr_block        = cidrsubnet(aws_vpc.main.cidr_block, 8, count.index)\n\n  tags = {\n    Name = format(\"private-subnet-%d\", count.index + 1)\n    Tier = count.index &lt; 2 ? \"app\" : \"db\"\n  }\n}\n\n# \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u30bf\u30a4\u30d7\u306e\u52d5\u7684\u5272\u308a\u5f53\u3066\nresource \"aws_instance\" \"cluster\" {\n  count = 3\n  instance_type = count.index == 0 ? \"t2.medium\" : \"t2.micro\"  # \u30de\u30b9\u30bf\u30fc\u30ce\u30fc\u30c9\u306f\u5927\u304d\u3081\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\n}<\/pre>\n\n\n\n<p>\u6ce8\u610f\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>index\u306f0\u304b\u3089\u59cb\u307e\u308b<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u524a\u9664\u6642\u306b\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u304c\u518d\u5272\u308a\u5f53\u3066<\/li>\n\n\n\n<li>\u53c2\u7167\u6642\u306f\u5fc5\u305a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u6307\u5b9a<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u6761\u4ef6\u5206\u5c90\u3068count\u306e\u7d44\u307f\u5408\u308f\u305b\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u74b0\u5883\u306b\u3088\u308b\u5236\u5fa1\uff1a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">resource \"aws_instance\" \"app\" {\n  count = var.environment == \"production\" ? 3 : 1\n\n  instance_type = var.environment == \"production\" ? \"t2.medium\" : \"t2.micro\"\n\n  tags = {\n    Environment = var.environment\n    Role        = count.index == 0 ? \"primary\" : \"secondary\"\n  }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9\u306e\u6761\u4ef6\u4ed8\u304d\u4f5c\u6210\uff1a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u304c\u5fc5\u8981\u306a\u5834\u5408\u306e\u307fS3\u30d0\u30b1\u30c3\u30c8\u3092\u4f5c\u6210\nresource \"aws_s3_bucket\" \"backup\" {\n  count  = var.enable_backup ? 1 : 0\n  bucket = \"backup-${var.environment}-${count.index}\"\n}\n\n# \u958b\u767a\u74b0\u5883\u3067\u306f\u4e0d\u8981\u306a\u30ea\u30bd\u30fc\u30b9\u3092\u30b9\u30ad\u30c3\u30d7\nresource \"aws_cloudwatch_metric_alarm\" \"high_cpu\" {\n  count = var.environment != \"development\" ? 1 : 0\n\n  alarm_name          = \"high-cpu-usage\"\n  comparison_operator = \"GreaterThanThreshold\"\n  threshold           = \"80\"\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u8907\u6570\u6761\u4ef6\u306e\u7d44\u307f\u5408\u308f\u305b\uff1a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">locals {\n  # \u672c\u756a\u74b0\u5883\u304b\u3064\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u6709\u52b9\u6642\u306e\u307f\u4f5c\u6210\n  backup_count = var.environment == \"production\" &amp;&amp; var.enable_backup ? 3 : 0\n}\n\nresource \"aws_ebs_volume\" \"backup\" {\n  count             = local.backup_count\n  availability_zone = data.aws_availability_zones.available.names[count.index]\n  size              = 100\n\n  tags = {\n    Name = \"backup-volume-${count.index + 1}\"\n  }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">\u5b9f\u8df5\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3067\u5b66\u3076Terraform count\u6d3b\u7528\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u8907\u6570\u306eEC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u52b9\u7387\u7684\u306b\u30c7\u30d7\u30ed\u30a4<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">locals {\n  instance_configs = {\n    small  = { count = 2, type = \"t2.micro\" }\n    medium = { count = 3, type = \"t2.medium\" }\n  }\n}\n\nresource \"aws_instance\" \"app_servers\" {\n  count         = local.instance_configs[var.size].count\n  ami           = data.aws_ami.amazon_linux_2.id\n  instance_type = local.instance_configs[var.size].type\n\n  user_data = &lt;&lt;-EOF\n              #!\/bin\/bash\n              echo \"Server ${count.index + 1}\" &gt; \/var\/www\/html\/index.html\n              EOF\n\n  tags = {\n    Name = \"app-server-${count.index + 1}\"\n    Role = count.index == 0 ? \"primary\" : \"secondary\"\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u7570\u306a\u308bAZ\u306b\u540c\u3058\u30ea\u30bd\u30fc\u30b9\u3092\u5c55\u958b<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">data \"aws_availability_zones\" \"available\" {\n  state = \"available\"\n}\n\nresource \"aws_subnet\" \"private\" {\n  count             = 3\n  vpc_id            = aws_vpc.main.id\n  cidr_block        = cidrsubnet(aws_vpc.main.cidr_block, 8, count.index)\n  availability_zone = data.aws_availability_zones.available.names[count.index]\n\n  tags = {\n    Name = \"private-subnet-${data.aws_availability_zones.available.names[count.index]}\"\n    Tier = \"application\"\n  }\n}\n\nresource \"aws_nat_gateway\" \"main\" {\n  count         = 3\n  allocation_id = aws_eip.nat[count.index].id\n  subnet_id     = aws_subnet.public[count.index].id\n\n  depends_on = [aws_internet_gateway.main]\n\n  tags = {\n    Name = \"nat-gateway-${data.aws_availability_zones.available.names[count.index]}\"\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u74b0\u5883\u3054\u3068\u306e\u30ea\u30bd\u30fc\u30b9\u6570\u5236\u5fa1\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">locals {\n  environments = {\n    dev     = { instance_count = 1, instance_type = \"t2.micro\" }\n    staging = { instance_count = 2, instance_type = \"t2.small\" }\n    prod    = { instance_count = 3, instance_type = \"t2.medium\" }\n  }\n\n  current_env = local.environments[var.environment]\n}\n\nresource \"aws_instance\" \"application\" {\n  count         = local.current_env.instance_count\n  ami           = data.aws_ami.amazon_linux_2.id\n  instance_type = local.current_env.instance_type\n\n  root_block_device {\n    volume_size = var.environment == \"prod\" ? 100 : 50\n  }\n\n  tags = {\n    Name        = \"${var.environment}-app-${count.index + 1}\"\n    Environment = var.environment\n  }\n}\n\nresource \"aws_ebs_volume\" \"data\" {\n  count             = var.environment == \"prod\" ? local.current_env.instance_count : 0\n  availability_zone = aws_instance.application[count.index].availability_zone\n  size              = 200\n  type              = \"gp3\"\n\n  tags = {\n    Name = \"${var.environment}-data-volume-${count.index + 1}\"\n  }\n}\n\nresource \"aws_cloudwatch_metric_alarm\" \"cpu_high\" {\n  count               = var.environment == \"prod\" ? local.current_env.instance_count : 0\n  alarm_name          = \"${var.environment}-cpu-utilization-high-${count.index + 1}\"\n  comparison_operator = \"GreaterThanThreshold\"\n  evaluation_periods  = \"2\"\n  metric_name         = \"CPUUtilization\"\n  namespace           = \"AWS\/EC2\"\n  period              = \"300\"\n  statistic           = \"Average\"\n  threshold           = \"80\"\n\n  dimensions = {\n    InstanceId = aws_instance.application[count.index].id\n  }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">Terraform count\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3068\u6ce8\u610f\u70b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">count\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># 1. \u5909\u6570\u306b\u3088\u308b\u5236\u5fa1\nvariable \"instance_count\" {\n  description = \"Number of instances to launch\"\n  type        = number\n  default     = 2\n\n  validation {\n    condition     = var.instance_count &gt; 0 &amp;&amp; var.instance_count &lt;= 10\n    error_message = \"Instance count must be between 1 and 10.\"\n  }\n}\n\n# 2. \u30ed\u30fc\u30ab\u30eb\u5909\u6570\u3067\u30ed\u30b8\u30c3\u30af\u3092\u6574\u7406\nlocals {\n  is_production = var.environment == \"production\"\n  server_count  = local.is_production ? var.instance_count : 1\n}\n\n# 3. \u547d\u540d\u898f\u5247\u306e\u7d71\u4e00\nresource \"aws_instance\" \"web\" {\n  count = local.server_count\n\n  tags = {\n    Name = format(\"web-%s-%02d\", var.environment, count.index + 1)\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u53c2\u7167\u30a8\u30e9\u30fc<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u554f\u984c\u306e\u3042\u308b\u30b3\u30fc\u30c9\nresource \"aws_eip\" \"lb\" {\n  count = var.create_eip ? 1 : 0\n}\n\nresource \"aws_instance\" \"web\" {\n  # \u6761\u4ef6\u304c\u6e80\u305f\u3055\u308c\u306a\u3044\u5834\u5408\u3001\u30a8\u30e9\u30fc\u767a\u751f\n  associate_public_ip_address = aws_eip.lb[0].id  \n}\n\n# \u4fee\u6b63\u4f8b\nresource \"aws_instance\" \"web\" {\n  associate_public_ip_address = var.create_eip ? aws_eip.lb[0].id : null\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>count.index\u306e\u8aa4\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u554f\u984c\u306e\u3042\u308b\u30b3\u30fc\u30c9\nresource \"aws_subnet\" \"private\" {\n  count             = 3\n  cidr_block        = \"10.0.${count.index}.0\/24\"  # 0\u304b\u3089\u59cb\u307e\u308b\u305f\u3081\u3001\u610f\u56f3\u3057\u306a\u3044CIDR\n}\n\n# \u4fee\u6b63\u4f8b\nresource \"aws_subnet\" \"private\" {\n  count             = 3\n  cidr_block        = \"10.0.${count.index + 1}.0\/24\"\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027\u3092\u8003\u616e\u3057\u305f\u30e2\u30b8\u30e5\u30fc\u30eb\u8a2d\u8a08<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u69cb\u9020\u4f8b\nvariable \"instances\" {\n  description = \"Map of instance configurations\"\n  type = map(object({\n    count         = number\n    instance_type = string\n    tags         = map(string)\n  }))\n}\n\nlocals {\n  # \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u8a2d\u5b9a\u306e\u5c55\u958b\n  instance_configs = flatten([\n    for name, config in var.instances : [\n      for i in range(config.count) : {\n        name         = name\n        index        = i\n        instance_type = config.instance_type\n        tags         = merge(config.tags, {\n          Name = format(\"%s-%02d\", name, i + 1)\n        })\n      }\n    ]\n  ])\n}\n\nresource \"aws_instance\" \"managed\" {\n  count         = length(local.instance_configs)\n  instance_type = local.instance_configs[count.index].instance_type\n\n  tags = local.instance_configs[count.index].tags\n\n  lifecycle {\n    create_before_destroy = true\n  }\n}\n\n# \u4f7f\u7528\u4f8b\nmodule \"instances\" {\n  source = \".\/modules\/instances\"\n\n  instances = {\n    web = {\n      count         = 2\n      instance_type = \"t2.micro\"\n      tags         = { Role = \"web\" }\n    }\n    app = {\n      count         = 3\n      instance_type = \"t2.small\"\n      tags         = { Role = \"app\" }\n    }\n  }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-16\">\u5b9f\u8df5\u6f14\u7fd2\uff1a\u30ab\u30a6\u30f3\u30c8\u3092\u4f7f\u7528\u3057\u305f\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u4f8b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30de\u30eb\u30c1AZ\u69cb\u6210\u306eVPC\u30b5\u30d6\u30cd\u30c3\u30c8\u4f5c\u6210<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># AZ\u306e\u53d6\u5f97\ndata \"aws_availability_zones\" \"available\" {\n  state = \"available\"\n}\n\n# VPC\u4f5c\u6210\nresource \"aws_vpc\" \"main\" {\n  cidr_block = \"10.0.0.0\/16\"\n\n  tags = {\n    Name = \"multi-az-vpc\"\n  }\n}\n\n# \u30d1\u30d6\u30ea\u30c3\u30af\u30b5\u30d6\u30cd\u30c3\u30c8\u4f5c\u6210\nresource \"aws_subnet\" \"public\" {\n  count             = 3\n  vpc_id            = aws_vpc.main.id\n  cidr_block        = cidrsubnet(aws_vpc.main.cidr_block, 8, count.index)\n  availability_zone = data.aws_availability_zones.available.names[count.index]\n\n  map_public_ip_on_launch = true\n\n  tags = {\n    Name = \"public-subnet-${data.aws_availability_zones.available.names[count.index]}\"\n    Type = \"Public\"\n  }\n}\n\n# \u30d7\u30e9\u30a4\u30d9\u30fc\u30c8\u30b5\u30d6\u30cd\u30c3\u30c8\u4f5c\u6210\nresource \"aws_subnet\" \"private\" {\n  count             = 3\n  vpc_id            = aws_vpc.main.id\n  cidr_block        = cidrsubnet(aws_vpc.main.cidr_block, 8, count.index + 3)\n  availability_zone = data.aws_availability_zones.available.names[count.index]\n\n  tags = {\n    Name = \"private-subnet-${data.aws_availability_zones.available.names[count.index]}\"\n    Type = \"Private\"\n  }\n}\n\n# \u30eb\u30fc\u30c8\u30c6\u30fc\u30d6\u30eb\u306e\u4f5c\u6210\nresource \"aws_route_table\" \"public\" {\n  vpc_id = aws_vpc.main.id\n\n  tags = {\n    Name = \"public-rt\"\n  }\n}\n\nresource \"aws_route_table\" \"private\" {\n  count  = 3\n  vpc_id = aws_vpc.main.id\n\n  tags = {\n    Name = \"private-rt-${count.index + 1}\"\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">Auto Scaling\u7528\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7\u8a2d\u5b9a<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">locals {\n  ports = {\n    http  = 80\n    https = 443\n    app   = 8080\n  }\n}\n\nresource \"aws_security_group\" \"asg\" {\n  name_prefix = \"asg-sg-\"\n  vpc_id      = aws_vpc.main.id\n\n  dynamic \"ingress\" {\n    for_each = local.ports\n    content {\n      from_port   = ingress.value\n      to_port     = ingress.value\n      protocol    = \"tcp\"\n      cidr_blocks = [\"0.0.0.0\/0\"]\n      description = \"Allow ${ingress.key} traffic\"\n    }\n  }\n\n  egress {\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n\n  tags = {\n    Name = \"asg-security-group\"\n  }\n}\n\nresource \"aws_launch_template\" \"app\" {\n  name_prefix   = \"app-template\"\n  image_id      = data.aws_ami.amazon_linux_2.id\n  instance_type = \"t2.micro\"\n\n  network_interfaces {\n    associate_public_ip_address = true\n    security_groups            = [aws_security_group.asg.id]\n  }\n\n  user_data = base64encode(&lt;&lt;-EOF\n              #!\/bin\/bash\n              yum update -y\n              yum install -y httpd\n              systemctl start httpd\n              systemctl enable httpd\n              EOF\n  )\n}\n\nresource \"aws_autoscaling_group\" \"app\" {\n  desired_capacity    = 3\n  max_size           = 6\n  min_size           = 1\n  target_group_arns  = [aws_lb_target_group.app.arn]\n  vpc_zone_identifier = aws_subnet.private[*].id\n\n  launch_template {\n    id      = aws_launch_template.app.id\n    version = \"$Latest\"\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u8907\u6570\u74b0\u5883\u5411\u3051IAM\u30ed\u30fc\u30eb\u306e\u4e00\u62ec\u4f5c\u6210<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">locals {\n  environments = [\"dev\", \"staging\", \"prod\"]\n\n  role_policies = {\n    dev = [\n      \"arn:aws:iam::aws:policy\/AWSCloudTrailReadOnlyAccess\",\n      \"arn:aws:iam::aws:policy\/AmazonS3ReadOnlyAccess\"\n    ]\n    staging = [\n      \"arn:aws:iam::aws:policy\/AWSCloudTrailReadOnlyAccess\",\n      \"arn:aws:iam::aws:policy\/AmazonS3ReadOnlyAccess\",\n      \"arn:aws:iam::aws:policy\/AmazonRDSReadOnlyAccess\"\n    ]\n    prod = [\n      \"arn:aws:iam::aws:policy\/AWSCloudTrailReadOnlyAccess\",\n      \"arn:aws:iam::aws:policy\/AmazonS3ReadOnlyAccess\",\n      \"arn:aws:iam::aws:policy\/AmazonRDSReadOnlyAccess\",\n      \"arn:aws:iam::aws:policy\/CloudWatchFullAccess\"\n    ]\n  }\n}\n\nresource \"aws_iam_role\" \"environment_role\" {\n  count = length(local.environments)\n  name  = \"${local.environments[count.index]}-application-role\"\n\n  assume_role_policy = jsonencode({\n    Version = \"2012-10-17\"\n    Statement = [\n      {\n        Action = \"sts:AssumeRole\"\n        Effect = \"Allow\"\n        Principal = {\n          Service = \"ec2.amazonaws.com\"\n        }\n      }\n    ]\n  })\n\n  tags = {\n    Environment = local.environments[count.index]\n  }\n}\n\nresource \"aws_iam_role_policy_attachment\" \"environment_policy\" {\n  count = length(flatten([\n    for env in local.environments : [\n      for policy in local.role_policies[env] : {\n        role = aws_iam_role.environment_role[index(local.environments, env)].name\n        policy = policy\n      }\n    ]\n  ]))\n\n  role       = flatten([\n    for env in local.environments : [\n      for policy in local.role_policies[env] : {\n        role = aws_iam_role.environment_role[index(local.environments, env)].name\n        policy = policy\n      }\n    ]\n  ])[count.index].role\n\n  policy_arn = flatten([\n    for env in local.environments : [\n      for policy in local.role_policies[env] : {\n        role = aws_iam_role.environment_role[index(local.environments, env)].name\n        policy = policy\n      }\n    ]\n  ])[count.index].policy\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":{"0":"post-2343","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-aws","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2343","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2343"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2343\/revisions"}],"predecessor-version":[{"id":2344,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2343\/revisions\/2344"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2343"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2343"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}