{"id":2297,"date":"2025-03-24T08:47:46","date_gmt":"2025-03-23T23:47:46","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2297"},"modified":"2025-03-24T08:48:10","modified_gmt":"2025-03-23T23:48:10","slug":"%e3%80%90%e4%bf%9d%e5%ae%88%e6%80%a7%e7%88%86%e4%b8%8a%e3%81%92%e3%80%91terraform-locals%e3%81%ae5%e3%81%a4%e3%81%ae%e5%ae%9f%e8%b7%b5%e7%9a%84%e3%81%aa%e4%bd%bf%e3%81%84%e6%96%b9%e3%81%a8%e3%83%99","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2297","title":{"rendered":"\u3010\u4fdd\u5b88\u6027\u7206\u4e0a\u3052\u3011Terraform locals\u306e5\u3064\u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9"},"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 locals\u3068\u306f\uff1fDRY\u539f\u5247\u3092\u5b9f\u73fe\u3059\u308b\u5f37\u529b\u306a\u6a5f\u80fd<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">locals\u30d6\u30ed\u30c3\u30af\u306e\u57fa\u672c\u7684\u306a\u69cb\u6587\u3068\u5f79\u5272<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">\u5909\u6570(variable)\u3084output\u3068\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-3\">Terraform locals\u306e5\u3064\u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-4\">1. \u5171\u901a\u30bf\u30b0\u306e\u4e00\u5143\u7ba1\u7406\u3067\u30b3\u30fc\u30c9\u91cd\u8907\u3092\u524a\u6e1b<\/a>      <\/li>      <li>        <a href=\"#i-5\">2. \u6761\u4ef6\u4ed8\u304d\u30ea\u30bd\u30fc\u30b9\u4f5c\u6210\u306e\u5236\u5fa1\u3092\u7c21\u6f54\u306b<\/a>      <\/li>      <li>        <a href=\"#i-6\">3. \u8907\u96d1\u306a\u8a08\u7b97\u3084\u30c7\u30fc\u30bf\u5909\u63db\u306e\u4e2d\u9593\u51e6\u7406<\/a>      <\/li>      <li>        <a href=\"#i-7\">4. \u30e2\u30b8\u30e5\u30fc\u30eb\u9593\u3067\u5171\u6709\u3059\u308b\u5024\u306e\u96c6\u7d04<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-8\">5. \u540d\u524d\u4ed8\u3051\u30eb\u30fc\u30eb\u306e\u7d71\u4e00\u5316\u3068\u7ba1\u7406<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-9\">Terraform locals\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-10\">\u9069\u5207\u306a\u547d\u540d\u898f\u5247\u3067\u30b3\u30fc\u30c9\u306e\u53ef\u8aad\u6027\u3092\u5411\u4e0a<\/a>      <\/li>      <li>        <a href=\"#i-11\">locals\u5206\u5272\u306b\u3088\u308b\u7ba1\u7406\u6027\u306e\u5411\u4e0a\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-12\">\u30c6\u30b9\u30c8\u5bb9\u6613\u6027\u3092\u8003\u616e\u3057\u305flocals\u8a2d\u8a08<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-13\">Terraform locals\u306e\u6d3b\u7528\u4e8b\u4f8b\u3068\u5b9f\u88c5\u4f8b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-14\">\u30de\u30eb\u30c1\u74b0\u5883\u69cb\u6210\u306b\u304a\u3051\u308b\u5171\u901a\u8a2d\u5b9a\u306e\u7ba1\u7406<\/a>      <\/li>      <li>        <a href=\"#i-15\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a2d\u5b9a\u306e\u4e00\u5143\u5316\u306b\u3088\u308b\u904b\u7528\u52b9\u7387\u5316<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-16\">\u30b3\u30b9\u30c8\u7ba1\u7406\u306e\u305f\u3081\u306e\u8a2d\u5b9a\u96c6\u7d04\u5316<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-17\">\u3088\u304f\u3042\u308blocals\u6d3b\u7528\u6642\u306e\u5931\u6557\u30d1\u30bf\u30fc\u30f3\u3068\u5bfe\u7b56<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-18\">\u904e\u5ea6\u306a\u96c6\u7d04\u306b\u3088\u308b\u53ef\u8aad\u6027\u4f4e\u4e0b\u3092\u9632\u3050<\/a>      <\/li>      <li>        <a href=\"#i-21\">\u5faa\u74b0\u53c2\u7167\u3092\u907f\u3051\u308b\u305f\u3081\u306e\u8a2d\u8a08\u65b9\u91dd<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-24\">\u30c7\u30d0\u30c3\u30b0\u6642\u306e\u52b9\u7387\u7684\u306a\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/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 locals\u3068\u306f\uff1fDRY\u539f\u5247\u3092\u5b9f\u73fe\u3059\u308b\u5f37\u529b\u306a\u6a5f\u80fd<\/h2>\n\n\n\n<p>Terraform\u3067\u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u3092\u7ba1\u7406\u3059\u308b\u969b\u3001\u540c\u3058\u5024\u3084\u5f0f\u3092\u8907\u6570\u7b87\u6240\u3067\u7e70\u308a\u8fd4\u3057\u4f7f\u7528\u3059\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u306e\u3088\u3046\u306a\u7e70\u308a\u8fd4\u3057\u306f\u4fdd\u5b88\u6027\u3092\u4f4e\u4e0b\u3055\u305b\u3001\u5909\u66f4\u6642\u306e\u30df\u30b9\u3092\u8a98\u767a\u3059\u308b\u539f\u56e0\u3068\u306a\u308a\u307e\u3059\u3002\u3053\u306e\u8ab2\u984c\u3092\u89e3\u6c7a\u3059\u308b\u306e\u304c<code>locals<\/code>\u30d6\u30ed\u30c3\u30af\u3067\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">locals\u30d6\u30ed\u30c3\u30af\u306e\u57fa\u672c\u7684\u306a\u69cb\u6587\u3068\u5f79\u5272<\/h3>\n\n\n\n<p><code>locals<\/code>\u30d6\u30ed\u30c3\u30af\u306f\u3001Terraform\u30b3\u30fc\u30c9\u5185\u3067\u518d\u5229\u7528\u53ef\u80fd\u306a\u4e2d\u9593\u5024\u3092\u5b9a\u7fa9\u3059\u308b\u305f\u3081\u306e\u6a5f\u80fd\u3067\u3059\u3002\u57fa\u672c\u7684\u306a\u69cb\u6587\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\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=\"\">locals {\n  project_name    = \"example-project\"\n  environment     = \"production\"\n  resource_prefix = \"${local.project_name}-${local.environment}\"\n}\n\n# locals\u306e\u5024\u3092\u53c2\u7167\u3059\u308b\nresource \"aws_s3_bucket\" \"example\" {\n  bucket = \"${local.resource_prefix}-bucket\"\n  tags = {\n    Project     = local.project_name\n    Environment = local.environment\n  }\n}<\/pre>\n\n\n\n<p>locals\u306e\u4e3b\u306a\u7279\u5fb4\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d6\u30ed\u30c3\u30af\u5185\u3067\u8907\u6570\u306e\u5024\u3092\u5b9a\u7fa9\u53ef\u80fd<\/li>\n\n\n\n<li>\u4ed6\u306elocals\u5024\u3092\u53c2\u7167\u53ef\u80fd<\/li>\n\n\n\n<li>\u30e2\u30b8\u30e5\u30fc\u30eb\u5185\u3067\u306e\u307f\u6709\u52b9\uff08\u30e2\u30b8\u30e5\u30fc\u30eb\u9593\u3067\u306f\u5171\u6709\u3055\u308c\u306a\u3044\uff09<\/li>\n\n\n\n<li>\u5b9f\u884c\u6642\u306b\u5024\u304c\u78ba\u5b9a\uff08\u52d5\u7684\u306a\u5024\u306e\u8a08\u7b97\u304c\u53ef\u80fd\uff09<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u5909\u6570(variable)\u3084output\u3068\u306e\u9055\u3044\u3092\u7406\u89e3\u3059\u308b<\/h3>\n\n\n\n<p>Terraform\u306b\u306f\u4f3c\u305f\u3088\u3046\u306a\u6a5f\u80fd\u3068\u3057\u3066<code>variable<\/code>\u3068<code>output<\/code>\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u305d\u308c\u305e\u308c\u7570\u306a\u308b\u7528\u9014\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n<div id=\"id-be8e2eba-8189-4188-8efd-f788651c2b1c\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6a5f\u80fd<\/th><th>\u4e3b\u306a\u7528\u9014<\/th><th>\u30b9\u30b3\u30fc\u30d7<\/th><th>\u5024\u306e\u5909\u66f4<\/th><th>\u5916\u90e8\u304b\u3089\u306e\u8a2d\u5b9a<\/th><\/tr><\/thead><tbody><tr><td>locals<\/td><td>\u30e2\u30b8\u30e5\u30fc\u30eb\u5185\u3067\u306e\u5024\u306e\u518d\u5229\u7528<\/td><td>\u30e2\u30b8\u30e5\u30fc\u30eb\u5185\u306e\u307f<\/td><td>\u30b3\u30fc\u30c9\u5909\u66f4\u304c\u5fc5\u8981<\/td><td>\u4e0d\u53ef<\/td><\/tr><tr><td>variable<\/td><td>\u30e2\u30b8\u30e5\u30fc\u30eb\u3078\u306e\u5165\u529b\u5024\u5b9a\u7fa9<\/td><td>\u30e2\u30b8\u30e5\u30fc\u30eb\u5185<\/td><td>\u5b9f\u884c\u6642\u306b\u5909\u66f4\u53ef\u80fd<\/td><td>\u53ef\u80fd<\/td><\/tr><tr><td>output<\/td><td>\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u3089\u306e\u51fa\u529b\u5024\u5b9a\u7fa9<\/td><td>\u30e2\u30b8\u30e5\u30fc\u30eb\u9593\u3067\u5171\u6709\u53ef\u80fd<\/td><td>\u2013<\/td><td>\u2013<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>locals\u3092\u4f7f\u7528\u3059\u3079\u304d\u30b1\u30fc\u30b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8907\u6570\u306e\u30ea\u30bd\u30fc\u30b9\u3067\u5171\u901a\u3057\u3066\u4f7f\u7528\u3055\u308c\u308b\u5024<\/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     common_tags = {\n       Owner       = \"DevOps Team\"\n       Project     = \"Infrastructure\"\n       CostCenter  = \"IT-123\"\n     }\n   }<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u8907\u96d1\u306a\u8a08\u7b97\u3084\u6761\u4ef6\u5206\u5c90\u306e\u7d50\u679c<\/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     instance_type = terraform.workspace == \"prod\" ? \"t3.large\" : \"t3.small\"\n     backup_enabled = contains([\"prod\", \"staging\"], terraform.workspace)\n   }<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u6587\u5b57\u5217\u306e\u52a0\u5de5\u3084\u7d50\u5408<\/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     domain_name = \"${var.service_name}.${var.environment}.example.com\"\n     full_name   = join(\"-\", [var.project, var.environment, var.region])\n   }<\/pre>\n\n\n\n<p>locals\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001DRY\uff08Don\u2019t Repeat Yourself\uff09\u539f\u5247\u306b\u5f93\u3063\u305f\u4fdd\u5b88\u6027\u306e\u9ad8\u3044Terraform\u30b3\u30fc\u30c9\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u5024\u306e\u5909\u66f4\u304c\u5fc5\u8981\u306a\u5834\u5408\u3082\u3001locals\u30d6\u30ed\u30c3\u30af\u5185\u306e\u5b9a\u7fa9\u3092\u5909\u66f4\u3059\u308b\u3060\u3051\u3067\u3001\u305d\u306e\u5024\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u5168\u3066\u306e\u30ea\u30bd\u30fc\u30b9\u306b\u5909\u66f4\u304c\u53cd\u6620\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">Terraform locals\u306e5\u3064\u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<p>Terraform locals\u306f\u3001\u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u30b3\u30fc\u30c9\u306e\u7ba1\u7406\u3092\u52b9\u7387\u5316\u3059\u308b\u5f37\u529b\u306a\u30c4\u30fc\u30eb\u3067\u3059\u3002\u4ee5\u4e0b\u3067\u306f\u3001\u5b9f\u8df5\u7684\u306a\u6d3b\u7528\u65b9\u6cd5\u3092\u5177\u4f53\u7684\u306a\u30b3\u30fc\u30c9\u4f8b\u3068\u5171\u306b\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">1. \u5171\u901a\u30bf\u30b0\u306e\u4e00\u5143\u7ba1\u7406\u3067\u30b3\u30fc\u30c9\u91cd\u8907\u3092\u524a\u6e1b<\/h3>\n\n\n\n<p>AWS\u30ea\u30bd\u30fc\u30b9\u306b\u30bf\u30b0\u3092\u4ed8\u4e0e\u3059\u308b\u969b\u3001\u7d44\u7e54\u5171\u901a\u306e\u30bf\u30b0\u3092\u5168\u3066\u306e\u30ea\u30bd\u30fc\u30b9\u306b\u9069\u7528\u3057\u305f\u3044\u30b1\u30fc\u30b9\u304c\u591a\u3005\u3042\u308a\u307e\u3059\u3002<\/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=\"\">locals {\n  common_tags = {\n    Environment = terraform.workspace\n    Owner       = \"Platform Team\"\n    ManagedBy   = \"Terraform\"\n    Project     = var.project_name\n    CostCenter  = var.cost_center\n  }\n\n  # \u30ea\u30bd\u30fc\u30b9\u56fa\u6709\u306e\u30bf\u30b0\u3068\u30de\u30fc\u30b8\u3059\u308b\u95a2\u6570\n  merged_tags = { for key, value in merge(\n    local.common_tags,\n    var.resource_specific_tags\n  ) : key =&gt; value }\n}\n\nresource \"aws_instance\" \"web\" {\n  ami           = var.ami_id\n  instance_type = var.instance_type\n\n  tags = local.merged_tags\n}\n\nresource \"aws_s3_bucket\" \"logs\" {\n  bucket = \"${var.project_name}-logs\"\n\n  tags = local.merged_tags\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">2. \u6761\u4ef6\u4ed8\u304d\u30ea\u30bd\u30fc\u30b9\u4f5c\u6210\u306e\u5236\u5fa1\u3092\u7c21\u6f54\u306b<\/h3>\n\n\n\n<p>\u74b0\u5883\u3084\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u306b\u5fdc\u3058\u3066\u3001\u30ea\u30bd\u30fc\u30b9\u306e\u8a2d\u5b9a\u3092\u52d5\u7684\u306b\u5909\u66f4\u3059\u308b\u5834\u5408\u306b\u6d3b\u7528\u3067\u304d\u307e\u3059\u3002<\/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=\"\">locals {\n  # \u74b0\u5883\u5225\u306e\u8a2d\u5b9a\n  env_config = {\n    dev = {\n      instance_count = 1\n      instance_type  = \"t3.small\"\n      backup_enabled = false\n    }\n    prod = {\n      instance_count = 3\n      instance_type  = \"t3.large\"\n      backup_enabled = true\n    }\n  }\n\n  # \u73fe\u5728\u306e\u74b0\u5883\u306e\u8a2d\u5b9a\u3092\u9078\u629e\n  current_config = local.env_config[terraform.workspace]\n\n  # \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u304c\u6709\u52b9\u306a\u5834\u5408\u306e\u307f\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30dd\u30ea\u30b7\u30fc\u3092\u4f5c\u6210\n  create_backup_policy = local.current_config.backup_enabled\n}\n\nresource \"aws_instance\" \"app\" {\n  count         = local.current_config.instance_count\n  instance_type = local.current_config.instance_type\n  # ... \u305d\u306e\u4ed6\u306e\u8a2d\u5b9a\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">3. \u8907\u96d1\u306a\u8a08\u7b97\u3084\u30c7\u30fc\u30bf\u5909\u63db\u306e\u4e2d\u9593\u51e6\u7406<\/h3>\n\n\n\n<p>\u8907\u96d1\u306a\u30c7\u30fc\u30bf\u69cb\u9020\u306e\u5909\u63db\u3084\u8a08\u7b97\u7d50\u679c\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u3059\u308b\u969b\u306b\u4fbf\u5229\u3067\u3059\u3002<\/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=\"\">locals {\n  # \u30b5\u30d6\u30cd\u30c3\u30c8\u306eCIDR\u8a08\u7b97\n  vpc_cidr = \"10.0.0.0\/16\"\n  subnet_newbits = 8\n\n  subnet_cidrs = {\n    public = [\n      cidrsubnet(local.vpc_cidr, local.subnet_newbits, 0),\n      cidrsubnet(local.vpc_cidr, local.subnet_newbits, 1)\n    ]\n    private = [\n      cidrsubnet(local.vpc_cidr, local.subnet_newbits, 2),\n      cidrsubnet(local.vpc_cidr, local.subnet_newbits, 3)\n    ]\n  }\n\n  # \u30ea\u30b9\u30c8\u3092\u30de\u30c3\u30d7\u306b\u5909\u63db\n  availability_zones = {\n    for idx, az in data.aws_availability_zones.available.names :\n    az =&gt; idx\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">4. \u30e2\u30b8\u30e5\u30fc\u30eb\u9593\u3067\u5171\u6709\u3059\u308b\u5024\u306e\u96c6\u7d04<\/h3>\n\n\n\n<p>\u30e2\u30b8\u30e5\u30fc\u30eb\u5185\u3067\u4f7f\u7528\u3055\u308c\u308b\u5171\u901a\u306e\u8a2d\u5b9a\u5024\u3084\u8a08\u7b97\u7d50\u679c\u3092\u96c6\u7d04\u3057\u307e\u3059\u3002<\/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=\"\">locals {\n  # \u30b7\u30b9\u30c6\u30e0\u5168\u4f53\u3067\u4f7f\u7528\u3059\u308b\u8a2d\u5b9a\u306e\u96c6\u7d04\n  system_config = {\n    app_name        = var.application_name\n    domain_name     = \"${var.application_name}.${var.domain_suffix}\"\n    container_port  = 8080\n    health_check_path = \"\/health\"\n\n    # \u74b0\u5883\u56fa\u6709\u306e\u8a2d\u5b9a\n    environment_config = {\n      min_capacity = terraform.workspace == \"prod\" ? 2 : 1\n      max_capacity = terraform.workspace == \"prod\" ? 10 : 3\n      cpu_target   = terraform.workspace == \"prod\" ? 75 : 60\n    }\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">5. \u540d\u524d\u4ed8\u3051\u30eb\u30fc\u30eb\u306e\u7d71\u4e00\u5316\u3068\u7ba1\u7406<\/h3>\n\n\n\n<p>\u30ea\u30bd\u30fc\u30b9\u540d\u306e\u751f\u6210\u30ed\u30b8\u30c3\u30af\u3092\u4e00\u5143\u7ba1\u7406\u3057\u3001\u4e00\u8cab\u6027\u306e\u3042\u308b\u547d\u540d\u898f\u5247\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002<\/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=\"\">locals {\n  # \u540d\u524d\u751f\u6210\u306e\u305f\u3081\u306e\u57fa\u672c\u60c5\u5831\n  naming = {\n    company     = \"example\"\n    environment = terraform.workspace\n    region      = data.aws_region.current.name\n\n    # \u30ea\u30bd\u30fc\u30b9\u30bf\u30a4\u30d7\u3054\u3068\u306e\u63a5\u5c3e\u8f9e\u30eb\u30fc\u30eb\n    suffix = {\n      vpc      = \"vpc\"\n      subnet   = \"subnet\"\n      instance = \"ec2\"\n      bucket   = \"s3\"\n    }\n  }\n\n  # \u30ea\u30bd\u30fc\u30b9\u540d\u751f\u6210\u95a2\u6570\n  name_prefix = \"${local.naming.company}-${local.naming.environment}-${local.naming.region}\"\n\n  # \u30ea\u30bd\u30fc\u30b9\u30bf\u30a4\u30d7\u3054\u3068\u306e\u540d\u524d\u751f\u6210\n  resource_names = {\n    vpc      = \"${local.name_prefix}-${local.naming.suffix.vpc}\"\n    instance = \"${local.name_prefix}-${local.naming.suffix.instance}\"\n    bucket   = \"${local.name_prefix}-${local.naming.suffix.bucket}\"\n  }\n}\n\nresource \"aws_vpc\" \"main\" {\n  cidr_block = local.vpc_cidr\n\n  tags = merge(local.common_tags, {\n    Name = local.resource_names.vpc\n  })\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u4fdd\u5b88\u6027\u304c\u9ad8\u304f\u3001\u518d\u5229\u7528\u53ef\u80fd\u306aTerraform\u30b3\u30fc\u30c9\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u7279\u306b\u5927\u898f\u6a21\u306a\u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u7ba1\u7406\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u30d1\u30bf\u30fc\u30f3\u3092\u9069\u5207\u306b\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30b3\u30fc\u30c9\u306e\u54c1\u8cea\u3068\u7ba1\u7406\u52b9\u7387\u3092\u5927\u304d\u304f\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-9\">Terraform locals\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<p>\u52b9\u679c\u7684\u306alocals\u306e\u6d3b\u7528\u306b\u306f\u3001\u9069\u5207\u306a\u8a2d\u8a08\u3068\u7ba1\u7406\u304c\u4e0d\u53ef\u6b20\u3067\u3059\u3002\u4ee5\u4e0b\u3067\u306f\u3001\u5b9f\u52d9\u3067\u6d3b\u7528\u3067\u304d\u308b\u5177\u4f53\u7684\u306a\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u9069\u5207\u306a\u547d\u540d\u898f\u5247\u3067\u30b3\u30fc\u30c9\u306e\u53ef\u8aad\u6027\u3092\u5411\u4e0a<\/h3>\n\n\n\n<p>locals\u306e\u547d\u540d\u306f\u3001\u30b3\u30fc\u30c9\u306e\u53ef\u8aad\u6027\u3068\u4fdd\u5b88\u6027\u306b\u5927\u304d\u306a\u5f71\u97ff\u3092\u4e0e\u3048\u307e\u3059\u3002\u4ee5\u4e0b\u306e\u547d\u540d\u898f\u5247\u3092\u63a8\u5968\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u76ee\u7684\u3092\u660e\u78ba\u306b\u793a\u3059\u547d\u540d<\/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=\"\"># Good Example\nlocals {\n  vpc_resource_tags = {\n    Name = \"main-vpc\"\n    Type = \"network\"\n  }\n  security_group_rules = {\n    ssh = {\n      port   = 22\n      cidr   = [\"10.0.0.0\/8\"]\n      protocol = \"tcp\"\n    }\n  }\n}\n\n# Bad Example - \u610f\u5473\u304c\u4e0d\u660e\u78ba\nlocals {\n  tags1 = { \/* ... *\/ }\n  rules = { \/* ... *\/ }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u6d3b\u7528\u3057\u305f\u95a2\u9023\u5024\u306e\u30b0\u30eb\u30fc\u30d7\u5316<\/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  # \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u95a2\u9023\u306e\u8a2d\u5b9a\u3092\u30b0\u30eb\u30fc\u30d7\u5316\n  network_vpc_cidr = \"10.0.0.0\/16\"\n  network_subnet_bits = 8\n  network_public_subnets = [\"10.0.1.0\/24\", \"10.0.2.0\/24\"]\n\n  # \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u95a2\u9023\u306e\u8a2d\u5b9a\u3092\u30b0\u30eb\u30fc\u30d7\u5316\n  security_allowed_ips = [\"192.168.1.0\/24\"]\n  security_admin_users = [\"admin1\", \"admin2\"]\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">locals\u5206\u5272\u306b\u3088\u308b\u7ba1\u7406\u6027\u306e\u5411\u4e0a\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u306aTerraform\u30b3\u30fc\u30c9\u3067\u306f\u3001locals\u3092\u8ad6\u7406\u7684\u306b\u5206\u5272\u3059\u308b\u3053\u3068\u3067\u7ba1\u7406\u6027\u3092\u5411\u4e0a\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d5\u30a1\u30a4\u30eb\u5206\u5272\u306b\u3088\u308b\u6574\u7406<\/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.tf - \u57fa\u672c\u8a2d\u5b9a\nlocals {\n  project     = \"example\"\n  environment = terraform.workspace\n}\n\n# locals.network.tf - \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u95a2\u9023\nlocals {\n  network = {\n    vpc_cidr    = \"10.0.0.0\/16\"\n    subnet_mask = 24\n  }\n}\n\n# locals.compute.tf - \u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u95a2\u9023\nlocals {\n  compute = {\n    instance_type = terraform.workspace == \"prod\" ? \"t3.large\" : \"t3.small\"\n    volume_size   = terraform.workspace == \"prod\" ? 100 : 20\n  }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u968e\u5c64\u69cb\u9020\u306b\u3088\u308b\u6574\u7406<\/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  # \u74b0\u5883\u8a2d\u5b9a\u306e\u968e\u5c64\u5316\n  config = {\n    project = {\n      name = \"example\"\n      team = \"platform\"\n    }\n    network = {\n      vpc = {\n        cidr = \"10.0.0.0\/16\"\n        name = \"main-vpc\"\n      }\n      subnets = {\n        public  = [\"10.0.1.0\/24\", \"10.0.2.0\/24\"]\n        private = [\"10.0.3.0\/24\", \"10.0.4.0\/24\"]\n      }\n    }\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">\u30c6\u30b9\u30c8\u5bb9\u6613\u6027\u3092\u8003\u616e\u3057\u305flocals\u8a2d\u8a08<\/h3>\n\n\n\n<p>locals\u306e\u8a2d\u8a08\u6642\u306b\u306f\u3001\u30c6\u30b9\u30c8\u5bb9\u6613\u6027\u3082\u8003\u616e\u3059\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30e2\u30b8\u30e5\u30e9\u30fc\u5316\u3055\u308c\u305f\u8a08\u7b97\u30ed\u30b8\u30c3\u30af<\/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  # \u57fa\u672c\u30d1\u30e9\u30e1\u30fc\u30bf\n  base_params = {\n    instance_count = 3\n    cpu_units     = 1024\n  }\n\n  # \u30c6\u30b9\u30c8\u53ef\u80fd\u306a\u8a08\u7b97\u30ed\u30b8\u30c3\u30af\n  calculated_params = {\n    total_cpu = local.base_params.instance_count * local.base_params.cpu_units\n    memory_reservation = floor(local.base_params.cpu_units * 2)\n  }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u6761\u4ef6\u5206\u5c90\u306e\u660e\u78ba\u5316<\/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  # \u74b0\u5883\u6761\u4ef6\u306e\u660e\u78ba\u5316\n  is_production = terraform.workspace == \"prod\"\n  is_high_availability = local.is_production || var.force_ha\n\n  # \u6761\u4ef6\u306b\u57fa\u3065\u304f\u8a2d\u5b9a\n  cluster_config = {\n    min_size = local.is_high_availability ? 2 : 1\n    max_size = local.is_high_availability ? 10 : 3\n    desired_capacity = local.is_high_availability ? 3 : 1\n  }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u7528\u3059\u308b\u969b\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30c9\u306e\u898b\u901a\u3057\u3092\u512a\u5148\u3057\u3001\u904e\u5ea6\u306a\u62bd\u8c61\u5316\u3092\u907f\u3051\u308b<\/li>\n\n\n\n<li>\u95a2\u9023\u3059\u308b\u5024\u306f\u8ad6\u7406\u7684\u306b\u30b0\u30eb\u30fc\u30d7\u5316\u3059\u308b<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u53ef\u80fd\u6027\u3092\u8003\u616e\u3057\u305f\u8a2d\u8a08\u3092\u5fc3\u304c\u3051\u308b<\/li>\n\n\n\n<li>\u547d\u540d\u898f\u5247\u306f\u4e00\u8cab\u6027\u3092\u4fdd\u3064<\/li>\n\n\n\n<li>\u30b3\u30e1\u30f3\u30c8\u3067\u8907\u96d1\u306a\u8a08\u7b97\u30ed\u30b8\u30c3\u30af\u3092\u8aac\u660e\u3059\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u4fdd\u5b88\u6027\u304c\u9ad8\u304f\u3001\u30c1\u30fc\u30e0\u3067\u306e\u958b\u767a\u304c\u3057\u3084\u3059\u3044Terraform\u30b3\u30fc\u30c9\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-13\">Terraform locals\u306e\u6d3b\u7528\u4e8b\u4f8b\u3068\u5b9f\u88c5\u4f8b<\/h2>\n\n\n\n<p>\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u306elocals\u306e\u6d3b\u7528\u4e8b\u4f8b\u3068\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002\u3053\u308c\u3089\u306e\u4f8b\u3092\u53c2\u8003\u306b\u3001\u81ea\u8eab\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u9069\u3057\u305f\u5b9f\u88c5\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u30de\u30eb\u30c1\u74b0\u5883\u69cb\u6210\u306b\u304a\u3051\u308b\u5171\u901a\u8a2d\u5b9a\u306e\u7ba1\u7406<\/h3>\n\n\n\n<p>\u958b\u767a\u74b0\u5883\uff08dev\uff09\u3001\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u74b0\u5883\uff08staging\uff09\u3001\u672c\u756a\u74b0\u5883\uff08prod\uff09\u3067\u7570\u306a\u308b\u8a2d\u5b9a\u3092\u52b9\u7387\u7684\u306b\u7ba1\u7406\u3059\u308b\u5b9f\u88c5\u4f8b\u3067\u3059\u3002<\/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=\"\">locals {\n  # \u74b0\u5883\u5225\u306e\u57fa\u672c\u8a2d\u5b9a\n  environments = {\n    dev = {\n      instance_type = \"t3.small\"\n      disk_size    = 20\n      replica_count = 1\n      monitoring = {\n        detailed_monitoring = false\n        retention_days     = 7\n        alarm_threshold    = 80\n      }\n    }\n    staging = {\n      instance_type = \"t3.medium\"\n      disk_size    = 50\n      replica_count = 2\n      monitoring = {\n        detailed_monitoring = true\n        retention_days     = 14\n        alarm_threshold    = 75\n      }\n    }\n    prod = {\n      instance_type = \"t3.large\"\n      disk_size    = 100\n      replica_count = 3\n      monitoring = {\n        detailed_monitoring = true\n        retention_days     = 30\n        alarm_threshold    = 70\n      }\n    }\n  }\n\n  # \u73fe\u5728\u306e\u74b0\u5883\u306e\u8a2d\u5b9a\u3092\u9078\u629e\n  current_env = terraform.workspace\n  env_config  = local.environments[local.current_env]\n\n  # \u74b0\u5883\u5171\u901a\u306e\u8a2d\u5b9a\n  common_config = {\n    vpc_cidr     = \"10.0.0.0\/16\"\n    region       = data.aws_region.current.name\n    project_name = var.project_name\n  }\n}\n\n# \u8a2d\u5b9a\u306e\u9069\u7528\u4f8b\nresource \"aws_instance\" \"app\" {\n  count         = local.env_config.replica_count\n  instance_type = local.env_config.instance_type\n\n  root_block_device {\n    volume_size = local.env_config.disk_size\n  }\n\n  monitoring = local.env_config.monitoring.detailed_monitoring\n\n  tags = {\n    Name        = \"${local.common_config.project_name}-${local.current_env}-app-${count.index + 1}\"\n    Environment = local.current_env\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a2d\u5b9a\u306e\u4e00\u5143\u5316\u306b\u3088\u308b\u904b\u7528\u52b9\u7387\u5316<\/h3>\n\n\n\n<p>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u95a2\u9023\u306e\u8a2d\u5b9a\u3092\u4e00\u5143\u7ba1\u7406\u3057\u3001\u4e00\u8cab\u6027\u306e\u3042\u308b\u5b9f\u88c5\u3092\u5b9f\u73fe\u3059\u308b\u4f8b\u3067\u3059\u3002<\/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=\"\">locals {\n  # \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7\u306e\u30eb\u30fc\u30eb\u5b9a\u7fa9\n  security_rules = {\n    base = {\n      name = \"base-rules\"\n      ingress = {\n        ssh = {\n          from_port   = 22\n          to_port     = 22\n          protocol    = \"tcp\"\n          cidr_blocks = var.admin_cidrs\n          description = \"SSH access\"\n        }\n        https = {\n          from_port   = 443\n          to_port     = 443\n          protocol    = \"tcp\"\n          cidr_blocks = [\"0.0.0.0\/0\"]\n          description = \"HTTPS access\"\n        }\n      }\n    }\n\n    app = {\n      name = \"app-rules\"\n      ingress = {\n        app = {\n          from_port   = 8080\n          to_port     = 8080\n          protocol    = \"tcp\"\n          cidr_blocks = [local.common_config.vpc_cidr]\n          description = \"Application access\"\n        }\n      }\n    }\n  }\n\n  # IAM\u30dd\u30ea\u30b7\u30fc\u306e\u5b9a\u7fa9\n  iam_policies = {\n    s3_read = {\n      effect = \"Allow\"\n      actions = [\n        \"s3:GetObject\",\n        \"s3:ListBucket\"\n      ]\n      resources = [\n        \"arn:aws:s3:::${local.common_config.project_name}-${local.current_env}-*\"\n      ]\n    }\n    cloudwatch_write = {\n      effect = \"Allow\"\n      actions = [\n        \"cloudwatch:PutMetricData\",\n        \"cloudwatch:CreateLogStream\",\n        \"cloudwatch:PutLogEvents\"\n      ]\n      resources = [\"*\"]\n    }\n  }\n}\n\n# \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7\u306e\u4f5c\u6210\nresource \"aws_security_group\" \"app\" {\n  name_prefix = \"${local.security_rules.app.name}-\"\n  vpc_id      = aws_vpc.main.id\n\n  dynamic \"ingress\" {\n    for_each = local.security_rules.app.ingress\n    content {\n      from_port   = ingress.value.from_port\n      to_port     = ingress.value.to_port\n      protocol    = ingress.value.protocol\n      cidr_blocks = ingress.value.cidr_blocks\n      description = ingress.value.description\n    }\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u30b3\u30b9\u30c8\u7ba1\u7406\u306e\u305f\u3081\u306e\u8a2d\u5b9a\u96c6\u7d04\u5316<\/h3>\n\n\n\n<p>\u30b3\u30b9\u30c8\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u8a2d\u5b9a\u3092\u4e00\u5143\u7ba1\u7406\u3059\u308b\u5b9f\u88c5\u4f8b\u3067\u3059\u3002<\/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=\"\">locals {\n  # \u30b3\u30b9\u30c8\u7ba1\u7406\u95a2\u9023\u306e\u8a2d\u5b9a\n  cost_management = {\n    # \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u8a2d\u5b9a\n    instance_lifecycle = {\n      dev = {\n        scheduled_start  = \"0 8 * * 1-5\"  # \u5e73\u65e5\u671d8\u6642\u8d77\u52d5\n        scheduled_stop   = \"0 20 * * 1-5\" # \u5e73\u65e5\u591c8\u6642\u505c\u6b62\n        weekend_running = false\n      }\n      staging = {\n        scheduled_start  = \"0 7 * * 1-5\"\n        scheduled_stop   = \"0 22 * * 1-5\"\n        weekend_running = true\n      }\n      prod = {\n        scheduled_start  = null # 24\/7\u7a3c\u50cd\n        scheduled_stop   = null\n        weekend_running = true\n      }\n    }\n\n    # \u30aa\u30fc\u30c8\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u8a2d\u5b9a\n    autoscaling = {\n      dev = {\n        min_size = 1\n        max_size = 2\n        target_cpu_utilization = 75\n      }\n      staging = {\n        min_size = 2\n        max_size = 4\n        target_cpu_utilization = 70\n      }\n      prod = {\n        min_size = 3\n        max_size = 10\n        target_cpu_utilization = 65\n      }\n    }\n\n    # \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u4fdd\u6301\u671f\u9593\n    backup_retention = {\n      dev     = 7\n      staging = 14\n      prod    = 30\n    }\n  }\n\n  # \u73fe\u5728\u306e\u74b0\u5883\u306e\u30b3\u30b9\u30c8\u7ba1\u7406\u8a2d\u5b9a\n  current_lifecycle = local.cost_management.instance_lifecycle[local.current_env]\n  current_scaling   = local.cost_management.autoscaling[local.current_env]\n  backup_days      = local.cost_management.backup_retention[local.current_env]\n\n  # \u30b3\u30b9\u30c8\u6700\u9069\u5316\u30bf\u30b0\n  cost_tags = {\n    CostCenter = var.cost_center\n    Environment = local.current_env\n    AutoStop    = local.current_lifecycle.scheduled_stop != null ? \"true\" : \"false\"\n  }\n}\n\n# \u81ea\u52d5\u8d77\u52d5\/\u505c\u6b62\u306eEventBridge\u30eb\u30fc\u30eb\nresource \"aws_cloudwatch_event_rule\" \"start_instances\" {\n  count               = local.current_lifecycle.scheduled_start != null ? 1 : 0\n  name               = \"${local.common_config.project_name}-${local.current_env}-start-instances\"\n  description        = \"Start instances during working hours\"\n  schedule_expression = \"cron(${local.current_lifecycle.scheduled_start})\"\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u4f8b\u306f\u3001\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u4f7f\u7528\u3055\u308c\u3066\u3044\u308b\u8a2d\u8a08\u30d1\u30bf\u30fc\u30f3\u3092\u57fa\u306b\u4f5c\u6210\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u74b0\u5883\u3084\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u9069\u5207\u306b\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3059\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u306a\u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u7ba1\u7406\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-17\">\u3088\u304f\u3042\u308blocals\u6d3b\u7528\u6642\u306e\u5931\u6557\u30d1\u30bf\u30fc\u30f3\u3068\u5bfe\u7b56<\/h2>\n\n\n\n<p>Terraform locals\u306f\u5f37\u529b\u306a\u6a5f\u80fd\u3067\u3059\u304c\u3001\u9069\u5207\u306b\u4f7f\u7528\u3057\u306a\u3044\u3068\u4fdd\u5b88\u6027\u306e\u4f4e\u4e0b\u3084\u30d0\u30b0\u306e\u539f\u56e0\u3068\u306a\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u3053\u3067\u306f\u3001\u3088\u304f\u3042\u308b\u5931\u6557\u30d1\u30bf\u30fc\u30f3\u3068\u305d\u306e\u5bfe\u7b56\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u904e\u5ea6\u306a\u96c6\u7d04\u306b\u3088\u308b\u53ef\u8aad\u6027\u4f4e\u4e0b\u3092\u9632\u3050<\/h3>\n\n\n\n<p>locals\u30d6\u30ed\u30c3\u30af\u306b\u904e\u5ea6\u306b\u591a\u304f\u306e\u8a2d\u5b9a\u3092\u96c6\u7d04\u3059\u308b\u3068\u3001\u304b\u3048\u3063\u3066\u30b3\u30fc\u30c9\u306e\u53ef\u8aad\u6027\u304c\u4f4e\u4e0b\u3059\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-19\">\u5931\u6557\u30d1\u30bf\u30fc\u30f3<\/h4>\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  # \u5de8\u5927\u306a\u8a2d\u5b9a\u30aa\u30d6\u30b8\u30a7\u30af\u30c8 - \u907f\u3051\u308b\u3079\u304d\u4f8b\n  config = {\n    vpc = {\n      cidr = \"10.0.0.0\/16\"\n      subnets = {\n        public = {\n          azs = [\"ap-northeast-1a\", \"ap-northeast-1c\"]\n          cidrs = [\"10.0.1.0\/24\", \"10.0.2.0\/24\"]\n          tags = {\n            Tier = \"Public\"\n            Access = \"Internet\"\n          }\n        }\n        private = {\n          azs = [\"ap-northeast-1a\", \"ap-northeast-1c\"]\n          cidrs = [\"10.0.3.0\/24\", \"10.0.4.0\/24\"]\n          tags = {\n            Tier = \"Private\"\n            Access = \"Internal\"\n          }\n        }\n      }\n    }\n    security = {\n      # ... \u3055\u3089\u306b\u5927\u91cf\u306e\u8a2d\u5b9a\u304c\u7d9a\u304f\n    }\n  }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-20\">\u6539\u5584\u7b56<\/h4>\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=\"\"># \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8a2d\u5b9a\u3092\u5225\u30d5\u30a1\u30a4\u30eb\u306b\u5206\u5272\n# locals.network.tf\nlocals {\n  network = {\n    vpc_cidr = \"10.0.0.0\/16\"\n  }\n\n  subnet_config = {\n    public = {\n      azs = [\"ap-northeast-1a\", \"ap-northeast-1a\"]\n      cidrs = [\"10.0.1.0\/24\", \"10.0.2.0\/24\"]\n    }\n    private = {\n      azs = [\"ap-northeast-1a\", \"ap-northeast-1c\"]\n      cidrs = [\"10.0.3.0\/24\", \"10.0.4.0\/24\"]\n    }\n  }\n}\n\n# \u30bf\u30b0\u8a2d\u5b9a\u3092\u5225\u30d5\u30a1\u30a4\u30eb\u306b\u5206\u5272\n# locals.tags.tf\nlocals {\n  tier_tags = {\n    public = {\n      Tier = \"Public\"\n      Access = \"Internet\"\n    }\n    private = {\n      Tier = \"Private\"\n      Access = \"Internal\"\n    }\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u5faa\u74b0\u53c2\u7167\u3092\u907f\u3051\u308b\u305f\u3081\u306e\u8a2d\u8a08\u65b9\u91dd<\/h3>\n\n\n\n<p>locals\u30d6\u30ed\u30c3\u30af\u5185\u3067\u306e\u5faa\u74b0\u53c2\u7167\u306f\u3001Terraform\u306e\u5b9f\u884c\u30a8\u30e9\u30fc\u306e\u539f\u56e0\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-22\">\u5931\u6557\u30d1\u30bf\u30fc\u30f3<\/h4>\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=\"\"># \u5faa\u74b0\u53c2\u7167\u304c\u767a\u751f\u3059\u308b\u30d1\u30bf\u30fc\u30f3 - \u907f\u3051\u308b\u3079\u304d\u4f8b\nlocals {\n  instance_name = \"${local.resource_prefix}-instance\"\n  resource_prefix = \"${local.instance_name}-prod\"  # \u5faa\u74b0\u53c2\u7167\uff01\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-23\">\u6539\u5584\u7b56<\/h4>\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  # \u57fa\u672c\u3068\u306a\u308b\u5024\u3092\u5148\u306b\u5b9a\u7fa9\n  base_name = \"myapp\"\n  environment = \"prod\"\n\n  # \u4ed6\u306e\u5024\u306f\u3053\u308c\u3089\u3092\u53c2\u7167\n  resource_prefix = \"${local.base_name}-${local.environment}\"\n  instance_name = \"${local.resource_prefix}-instance\"\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-24\">\u30c7\u30d0\u30c3\u30b0\u6642\u306e\u52b9\u7387\u7684\u306a\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h3>\n\n\n\n<p>locals\u3092\u4f7f\u7528\u3057\u305f\u30b3\u30fc\u30c9\u306e\u30c7\u30d0\u30c3\u30b0\u306f\u3001\u9069\u5207\u306a\u6226\u7565\u304c\u306a\u3044\u3068\u6642\u9593\u304c\u304b\u304b\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-25\">\u30c7\u30d0\u30c3\u30b0\u3092\u56f0\u96e3\u306b\u3059\u308b\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3<\/h4>\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=\"\"># \u30c7\u30d0\u30c3\u30b0\u304c\u56f0\u96e3\u306a\u5b9f\u88c5 - \u907f\u3051\u308b\u3079\u304d\u4f8b\nlocals {\n  complex_calculation = {\n    for k, v in var.input_map :\n    k =&gt; merge(\n      {\n        computed_value = v.base_value * 2\n      },\n      local.additional_settings[k],\n      local.override_values\n    )\n  }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-26\">\u30c7\u30d0\u30c3\u30b0\u3057\u3084\u3059\u3044\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3<\/h4>\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  # \u6bb5\u968e\u7684\u306b\u8a08\u7b97\u3092\u5206\u89e3\n  base_calculations = {\n    for k, v in var.input_map :\n    k =&gt; {\n      computed_value = v.base_value * 2\n    }\n  }\n\n  # \u4e2d\u9593\u7d50\u679c\u3092\u5225\u3005\u306b\u5b9a\u7fa9\n  with_additional_settings = {\n    for k, v in local.base_calculations :\n    k =&gt; merge(v, local.additional_settings[k])\n  }\n\n  # \u6700\u7d42\u7d50\u679c\n  final_values = {\n    for k, v in local.with_additional_settings :\n    k =&gt; merge(v, local.override_values)\n  }\n}\n\n# \u51fa\u529b\u3092\u8ffd\u52a0\u3057\u3066\u30c7\u30d0\u30c3\u30b0\u3092\u5bb9\u6613\u306b\noutput \"debug_base_calculations\" {\n  value = local.base_calculations\n}\n\noutput \"debug_with_additional_settings\" {\n  value = local.with_additional_settings\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5931\u6557\u30d1\u30bf\u30fc\u30f3\u3092\u9632\u3050\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8a2d\u5b9a\u306e\u5206\u5272\u3068\u6574\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8ad6\u7406\u7684\u306a\u307e\u3068\u307e\u308a\u3054\u3068\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u5206\u5272<\/li>\n\n\n\n<li>\u95a2\u9023\u3059\u308b\u8a2d\u5b9a\u3092\u9069\u5207\u306b\u30b0\u30eb\u30fc\u30d7\u5316<\/li>\n\n\n\n<li>\u547d\u540d\u898f\u5247\u306e\u4e00\u8cab\u6027\u3092\u4fdd\u6301<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4f9d\u5b58\u95a2\u4fc2\u306e\u660e\u78ba\u5316<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u57fa\u672c\u3068\u306a\u308b\u5024\u3092\u5148\u306b\u5b9a\u7fa9<\/li>\n\n\n\n<li>\u4f9d\u5b58\u95a2\u4fc2\u3092\u4e00\u65b9\u5411\u306b\u4fdd\u3064<\/li>\n\n\n\n<li>\u8907\u96d1\u306a\u53c2\u7167\u3092\u907f\u3051\u308b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c7\u30d0\u30c3\u30b0\u5bb9\u6613\u6027\u306e\u78ba\u4fdd<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8907\u96d1\u306a\u8a08\u7b97\u306f\u6bb5\u968e\u7684\u306b\u5206\u89e3<\/li>\n\n\n\n<li>\u4e2d\u9593\u7d50\u679c\u3092\u78ba\u8a8d\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30b3\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u306e\u30dd\u30a4\u30f3\u30c8<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5faa\u74b0\u53c2\u7167\u306e\u53ef\u80fd\u6027\u3092\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>\u8a2d\u5b9a\u306e\u91cd\u8907\u3084\u77db\u76fe\u304c\u306a\u3044\u304b\u78ba\u8a8d<\/li>\n\n\n\n<li>\u547d\u540d\u306e\u4e00\u8cab\u6027\u3092\u78ba\u8a8d<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5bfe\u7b56\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u4fdd\u5b88\u6027\u304c\u9ad8\u304f\u3001\u554f\u984c\u304c\u767a\u751f\u3057\u306b\u304f\u3044Terraform\u30b3\u30fc\u30c9\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\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-2297","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\/2297","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=2297"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2297\/revisions"}],"predecessor-version":[{"id":2298,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2297\/revisions\/2298"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2297"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2297"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2297"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}