{"id":2276,"date":"2025-03-24T08:47:49","date_gmt":"2025-03-23T23:47:49","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2276"},"modified":"2025-03-24T08:48:13","modified_gmt":"2025-03-23T23:48:13","slug":"%e3%80%90%e7%89%88%e3%80%91terraform-plan%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%892024-%e3%80%9c%e3%82%a8%e3%83%a9%e3%83%bc%e5%af%be%e5%87%a6%e3%81%8b%e3%82%89","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2276","title":{"rendered":"\u3010\u7248\u3011terraform plan\u306e\u4f7f\u3044\u65b9\u5b8c\u5168\u30ac\u30a4\u30c92024 \u301c\u30a8\u30e9\u30fc\u5bfe\u51e6\u304b\u3089\u672c\u756a\u904b\u7528\u307e\u3067\u301c"},"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 plan\u3068\u306f\uff1f\u521d\u5fc3\u8005\u3067\u3082\u308f\u304b\u308b\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">terraform plan\u304c\u5fc5\u8981\u306a\u7406\u7531\u3068\u4e3b\u306a\u30e1\u30ea\u30c3\u30c8<\/a>      <\/li>      <li>        <a href=\"#i-4\">\u5b9f\u884c\u74b0\u5883\u306e\u6e96\u5099\u65b9\u6cd5\u3068\u57fa\u672c\u7684\u306a\u30b3\u30de\u30f3\u30c9\u4f53\u7cfb<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-7\">\u5b9f\u8df5\u7684\u306a\u5229\u7528\u30b7\u30fc\u30f3<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-10\">terraform plan\u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9\u3068\u91cd\u8981\u30aa\u30d7\u30b7\u30e7\u30f3<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-11\">\u57fa\u672c\u7684\u306a\u30b3\u30de\u30f3\u30c9\u5b9f\u884c\u3068\u7d50\u679c\u306e\u898b\u65b9<\/a>      <\/li>      <li>        <a href=\"#i-14\">\u4fbf\u5229\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3068\u6d3b\u7528\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-17\">\u5b9f\u884c\u8a08\u753b\u306e\u8a73\u7d30\u306a\u78ba\u8a8d\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-22\">terraform plan\u306e\u30a8\u30e9\u30fc\u5bfe\u51e6\u6cd5\u3068\u904b\u7528\u306e\u30b3\u30c4<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-23\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>      <\/li>      <li>        <a href=\"#i-27\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ea\u30b9\u30af\u306e\u56de\u907f\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-31\">\u30b3\u30b9\u30c8\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-36\">\u30c1\u30fc\u30e0\u958b\u767a\u306b\u304a\u3051\u308bterraform plan\u306e\u6d3b\u7528\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-37\">GitHub\u3068\u306e\u9023\u643a\u306b\u3088\u308b\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u81ea\u52d5\u5316<\/a>      <\/li>      <li>        <a href=\"#i-40\">\u30c1\u30fc\u30e0\u3067\u306e\u627f\u8a8d\u30d5\u30ed\u30fc\u3068\u6a29\u9650\u7ba1\u7406<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-44\">\u52b9\u7387\u7684\u306a\u30ec\u30d3\u30e5\u30fc\u30d7\u30ed\u30bb\u30b9\u306e\u69cb\u7bc9\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-48\">terraform plan\u306e\u5fdc\u7528\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3068\u5b9f\u8df5\u4f8b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-49\">\u5927\u898f\u6a21\u74b0\u5883\u3067\u306e\u5b9f\u884c\u8a08\u753b\u306e\u7ba1\u7406\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-52\">\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u3055\u308c\u305f\u30b3\u30fc\u30c9\u3067\u306e\u4f7f\u3044\u65b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-55\">\u672c\u756a\u74b0\u5883\u3067\u306e\u5b89\u5168\u306a\u5b9f\u884c\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/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 plan\u3068\u306f\uff1f\u521d\u5fc3\u8005\u3067\u3082\u308f\u304b\u308b\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">terraform plan\u304c\u5fc5\u8981\u306a\u7406\u7531\u3068\u4e3b\u306a\u30e1\u30ea\u30c3\u30c8<\/h3>\n\n\n\n<p>Terraform plan\u306f\u3001Infrastructure as Code\uff08IaC\uff09\u3092\u5b9f\u8df5\u3059\u308b\u4e0a\u3067\u6700\u3082\u91cd\u8981\u306a\u30b3\u30de\u30f3\u30c9\u306e1\u3064\u3067\u3059\u3002\u3053\u306e\u30b3\u30de\u30f3\u30c9\u306f\u3001Terraform\u306e\u5b9f\u884c\u8a08\u753b\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306e\u3082\u306e\u3067\u3042\u308a\u3001\u5b9f\u969b\u306e\u30a4\u30f3\u30d5\u30e9\u5909\u66f4\u3092\u884c\u3046\u524d\u306e\u300c\u4e8b\u524d\u78ba\u8a8d\u300d\u3068\u3057\u3066\u6a5f\u80fd\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-2\">\u4e3b\u306a\u5f79\u5272\u3068\u91cd\u8981\u6027<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5909\u66f4\u5185\u5bb9\u306e\u53ef\u8996\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8ffd\u52a0\u3055\u308c\u308b\u30ea\u30bd\u30fc\u30b9\uff08<code>+<\/code>\u3067\u8868\u793a\uff09<\/li>\n\n\n\n<li>\u5909\u66f4\u3055\u308c\u308b\u30ea\u30bd\u30fc\u30b9\uff08<code>~<\/code>\u3067\u8868\u793a\uff09<\/li>\n\n\n\n<li>\u524a\u9664\u3055\u308c\u308b\u30ea\u30bd\u30fc\u30b9\uff08<code>-<\/code>\u3067\u8868\u793a\uff09<\/li>\n\n\n\n<li>\u7f6e\u304d\u63db\u3048\u304c\u5fc5\u8981\u306a\u30ea\u30bd\u30fc\u30b9\uff08<code>-\/+<\/code>\u3067\u8868\u793a\uff09<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ea\u30b9\u30af\u8efd\u6e1b<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u610f\u56f3\u3057\u306a\u3044\u5909\u66f4\u306e\u65e9\u671f\u767a\u898b<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3078\u306e\u5f71\u97ff\u5ea6\u306e\u4e8b\u524d\u8a55\u4fa1<\/li>\n\n\n\n<li>\u30b3\u30b9\u30c8\u5897\u52a0\u306b\u3064\u306a\u304c\u308b\u5909\u66f4\u306e\u691c\u51fa<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-3\">\u4e3b\u306a\u30e1\u30ea\u30c3\u30c8<\/h4>\n\n\n<div id=\"id-3fbb2102-97df-4650-9442-e73e6ef96345\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30e1\u30ea\u30c3\u30c8<\/th><th>\u8aac\u660e<\/th><\/tr><\/thead><tbody><tr><td>\u5b89\u5168\u6027\u306e\u5411\u4e0a<\/td><td>\u5b9f\u969b\u306e\u9069\u7528\u524d\u306b\u5909\u66f4\u5185\u5bb9\u3092\u78ba\u8a8d\u3067\u304d\u308b<\/td><\/tr><tr><td>\u30b3\u30b9\u30c8\u7ba1\u7406<\/td><td>\u30ea\u30bd\u30fc\u30b9\u306e\u8ffd\u52a0\u30fb\u5909\u66f4\u306b\u3088\u308b\u8cbb\u7528\u3078\u306e\u5f71\u97ff\u3092\u4e8b\u524d\u306b\u628a\u63e1<\/td><\/tr><tr><td>\u30c1\u30fc\u30e0\u5354\u696d<\/td><td>\u5909\u66f4\u5185\u5bb9\u3092\u30c1\u30fc\u30e0\u3067\u5171\u6709\u30fb\u30ec\u30d3\u30e5\u30fc\u53ef\u80fd<\/td><\/tr><tr><td>\u76e3\u67fb\u5bfe\u5fdc<\/td><td>\u30a4\u30f3\u30d5\u30e9\u5909\u66f4\u306e\u5c65\u6b74\u3068\u3057\u3066\u6d3b\u7528\u53ef\u80fd<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">\u5b9f\u884c\u74b0\u5883\u306e\u6e96\u5099\u65b9\u6cd5\u3068\u57fa\u672c\u7684\u306a\u30b3\u30de\u30f3\u30c9\u4f53\u7cfb<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-5\">\u5b9f\u884c\u74b0\u5883\u306e\u6e96\u5099<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Terraform\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/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=\"\"># macOS\u306e\u5834\u5408\nbrew install terraform\n\n# Linux\u306e\u5834\u5408\nwget https:\/\/releases.hashicorp.com\/terraform\/1.7.0\/terraform_1.7.0_linux_amd64.zip\nunzip terraform_1.7.0_linux_amd64.zip\nsudo mv terraform \/usr\/local\/bin\/<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>AWS\u8a8d\u8a3c\u60c5\u5831\u306e\u8a2d\u5b9a<\/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=\"\"># AWS CLI\u306e\u8a2d\u5b9a\naws configure\n\n# \u307e\u305f\u306f\u74b0\u5883\u5909\u6570\u3067\u306e\u8a2d\u5b9a\nexport AWS_ACCESS_KEY_ID=\"your_access_key\"\nexport AWS_SECRET_ACCESS_KEY=\"your_secret_key\"\nexport AWS_DEFAULT_REGION=\"ap-northeast-1\"<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-6\">\u57fa\u672c\u7684\u306a\u30b3\u30de\u30f3\u30c9\u4f53\u7cfb<\/h4>\n\n\n\n<p>Terraform plan\u3092\u52b9\u679c\u7684\u306b\u4f7f\u7528\u3059\u308b\u305f\u3081\u306e\u57fa\u672c\u7684\u306a\u30b3\u30de\u30f3\u30c9\u30d5\u30ed\u30fc\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u521d\u671f\u5316\uff08\u5fc5\u9808\uff09<\/strong><\/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=\"\">terraform init  # \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3068\u521d\u671f\u5316<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u69cb\u6587\u30c1\u30a7\u30c3\u30af\uff08\u63a8\u5968\uff09<\/strong><\/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=\"\">terraform fmt   # \u30b3\u30fc\u30c9\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306e\u7d71\u4e00\nterraform validate  # \u69cb\u6587\u306e\u691c\u8a3c<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u5b9f\u884c\u8a08\u753b\u306e\u78ba\u8a8d<\/strong><\/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=\"\">terraform plan  # \u57fa\u672c\u7684\u306a\u5b9f\u884c\u8a08\u753b\u306e\u78ba\u8a8d\nterraform plan -out=plan.tfplan  # \u5b9f\u884c\u8a08\u753b\u306e\u4fdd\u5b58<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u5b9f\u8df5\u7684\u306a\u5229\u7528\u30b7\u30fc\u30f3<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-8\">1. \u65b0\u898f\u74b0\u5883\u69cb\u7bc9\u6642<\/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=\"\"># \u57fa\u672c\u7684\u306aEC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u4f5c\u6210\u306e\u4f8b\nresource \"aws_instance\" \"example\" {\n  ami           = \"ami-0c3fd0f5d33134a76\"\n  instance_type = \"t3.micro\"\n\n  tags = {\n    Name = \"terraform-example\"\n  }\n}<\/pre>\n\n\n\n<p>\u5b9f\u884c\u7d50\u679c\u306e\u4f8b\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=\"\">Terraform will perform the following actions:\n\n  + aws_instance.example\n      id:                           &lt;computed&gt;\n      ami:                         \"ami-0c3fd0f5d33134a76\"\n      instance_type:               \"t3.micro\"\n      tags.%:                      \"1\"\n      tags.Name:                   \"terraform-example\"<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-9\">2. \u30ea\u30bd\u30fc\u30b9\u66f4\u65b0\u6642<\/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=\"\"># \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u30bf\u30a4\u30d7\u306e\u5909\u66f4\nresource \"aws_instance\" \"example\" {\n  ami           = \"ami-0c3fd0f5d33134a76\"\n  instance_type = \"t3.small\"  # micro \u304b\u3089 small \u3078\u5909\u66f4\n\n  tags = {\n    Name = \"terraform-example\"\n  }\n}<\/pre>\n\n\n\n<p>\u5b9f\u884c\u7d50\u679c\u306e\u4f8b\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=\"\">Terraform will perform the following actions:\n\n  ~ aws_instance.example\n      instance_type:               \"t3.micro\" =&gt; \"t3.small\"<\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001terraform plan\u306f\u5358\u306a\u308b\u5b9f\u884c\u8a08\u753b\u306e\u78ba\u8a8d\u30c4\u30fc\u30eb\u3067\u306f\u306a\u304f\u3001\u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u306e\u5909\u66f4\u7ba1\u7406\u306b\u304a\u3051\u308b\u91cd\u8981\u306a\u5b89\u5168\u88c5\u7f6e\u3068\u3057\u3066\u6a5f\u80fd\u3057\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3088\u308a\u5b9f\u8df5\u7684\u306a\u4f7f\u7528\u65b9\u6cd5\u3068\u91cd\u8981\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-10\">terraform plan\u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9\u3068\u91cd\u8981\u30aa\u30d7\u30b7\u30e7\u30f3<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u57fa\u672c\u7684\u306a\u30b3\u30de\u30f3\u30c9\u5b9f\u884c\u3068\u7d50\u679c\u306e\u898b\u65b9<\/h3>\n\n\n\n<p>terraform plan\u30b3\u30de\u30f3\u30c9\u306e\u5b9f\u884c\u7d50\u679c\u306f\u3001\u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u306e\u5909\u66f4\u3092\u7406\u89e3\u3059\u308b\u4e0a\u3067\u91cd\u8981\u306a\u60c5\u5831\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002\u4ee5\u4e0b\u3067\u3001\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\u3068\u7d50\u679c\u306e\u89e3\u91c8\u65b9\u6cd5\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-12\">\u57fa\u672c\u7684\u306a\u5b9f\u884c\u65b9\u6cd5<\/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=\"\"># \u57fa\u672c\u7684\u306a\u5b9f\u884c\nterraform plan\n\n# \u5b9f\u884c\u8a08\u753b\u306e\u4fdd\u5b58\nterraform plan -out=tfplan\n\n# \u5909\u6570\u30d5\u30a1\u30a4\u30eb\u306e\u6307\u5b9a\nterraform plan -var-file=\"prod.tfvars\"<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-13\">\u5b9f\u884c\u7d50\u679c\u306e\u898b\u65b9<\/h4>\n\n\n\n<p>\u5b9f\u884c\u7d50\u679c\u306b\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u8a18\u53f7\u304c\u8868\u793a\u3055\u308c\u307e\u3059\uff1a<\/p>\n\n\n<div id=\"id-a7592158-0408-46c9-b1a1-606a1e5f18d0\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8a18\u53f7<\/th><th>\u610f\u5473<\/th><th>\u8aac\u660e<\/th><\/tr><\/thead><tbody><tr><td>+<\/td><td>\u4f5c\u6210<\/td><td>\u65b0\u3057\u3044\u30ea\u30bd\u30fc\u30b9\u304c\u4f5c\u6210\u3055\u308c\u308b<\/td><\/tr><tr><td>\u2013<\/td><td>\u524a\u9664<\/td><td>\u65e2\u5b58\u306e\u30ea\u30bd\u30fc\u30b9\u304c\u524a\u9664\u3055\u308c\u308b<\/td><\/tr><tr><td>~<\/td><td>\u66f4\u65b0<\/td><td>\u30ea\u30bd\u30fc\u30b9\u304c\u66f4\u65b0\u3055\u308c\u308b<\/td><\/tr><tr><td>-\/+<\/td><td>\u518d\u4f5c\u6210<\/td><td>\u30ea\u30bd\u30fc\u30b9\u304c\u4e00\u65e6\u524a\u9664\u3055\u308c\u3001\u518d\u4f5c\u6210\u3055\u308c\u308b<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u4fbf\u5229\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3068\u6d3b\u7528\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-15\">\u91cd\u8981\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u4e00\u89a7<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>-detailed-exitcode<\/strong><\/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=\"\">terraform plan -detailed-exitcode<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>0: \u5909\u66f4\u306a\u3057<\/li>\n\n\n\n<li>1: \u30a8\u30e9\u30fc<\/li>\n\n\n\n<li>2: \u5909\u66f4\u3042\u308a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>-var \u3068 -var-file<\/strong><\/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=\"\"># \u5358\u4e00\u306e\u5909\u6570\u6307\u5b9a\nterraform plan -var=\"environment=production\"\n\n# \u5909\u6570\u30d5\u30a1\u30a4\u30eb\u306e\u6307\u5b9a\nterraform plan -var-file=\"production.tfvars\"<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>-target<\/strong><\/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=\"\"># \u7279\u5b9a\u306e\u30ea\u30bd\u30fc\u30b9\u306e\u307f\u3092\u5bfe\u8c61\nterraform plan -target=aws_instance.web<\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>-refresh<\/strong><\/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=\"\"># \u72b6\u614b\u306e\u66f4\u65b0\u3092\u30b9\u30ad\u30c3\u30d7\nterraform plan -refresh=false<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-16\">\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u6d3b\u7528\u30b7\u30fc\u30f3<\/h4>\n\n\n<div id=\"id-9873addc-6e80-4a4f-861b-263fd18c3945\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30aa\u30d7\u30b7\u30e7\u30f3<\/th><th>\u4f7f\u7528\u30b7\u30fc\u30f3<\/th><th>\u30e1\u30ea\u30c3\u30c8<\/th><\/tr><\/thead><tbody><tr><td>-out<\/td><td>CI\/CD\u74b0\u5883<\/td><td>\u8a08\u753b\u3092\u4fdd\u5b58\u3057\u3001\u9069\u7528\u6642\u306b\u518d\u5b9f\u884c\u3092\u9632\u3050<\/td><\/tr><tr><td>-target<\/td><td>\u90e8\u5206\u7684\u306a\u5909\u66f4<\/td><td>\u7279\u5b9a\u306e\u30ea\u30bd\u30fc\u30b9\u306e\u307f\u3092\u5bfe\u8c61\u306b\u8a08\u753b\u3092\u78ba\u8a8d<\/td><\/tr><tr><td>-var-file<\/td><td>\u74b0\u5883\u5225\u306e\u8a2d\u5b9a<\/td><td>\u74b0\u5883\u3054\u3068\u306b\u7570\u306a\u308b\u8a2d\u5b9a\u3092\u7ba1\u7406<\/td><\/tr><tr><td>-detailed-exitcode<\/td><td>\u81ea\u52d5\u5316\u30d7\u30ed\u30bb\u30b9<\/td><td>\u30b9\u30af\u30ea\u30d7\u30c8\u3067\u306e\u5224\u5b9a\u304c\u5bb9\u6613<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u5b9f\u884c\u8a08\u753b\u306e\u8a73\u7d30\u306a\u78ba\u8a8d\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-18\">1. \u30ea\u30bd\u30fc\u30b9\u4f9d\u5b58\u95a2\u4fc2\u306e\u78ba\u8a8d<\/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=\"\"># \u4f9d\u5b58\u95a2\u4fc2\u3092\u542b\u3080\u8a73\u7d30\u306a\u8a08\u753b\u306e\u51fa\u529b\nterraform plan -detailed-exitcode -out=tfplan\nterraform show tfplan<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-19\">2. \u30b3\u30b9\u30c8\u898b\u7a4d\u3082\u308a\u306e\u78ba\u8a8d<\/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=\"\"># Infracost\u3092\u4f7f\u7528\u3057\u305f\u30b3\u30b9\u30c8\u4e88\u6e2c\nterraform plan -out=tfplan\ninfracost breakdown --path tfplan<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-20\">3. \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30c1\u30a7\u30c3\u30af<\/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=\"\"># tfsec\u3092\u4f7f\u7528\u3057\u305f\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b9\u30ad\u30e3\u30f3\nterraform plan -out=tfplan\ntfsec .<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-21\">\u5b9f\u8df5\u7684\u306a\u4f7f\u7528\u4f8b<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u74b0\u5883\u5225\u306e\u8a2d\u5b9a\u7ba1\u7406<\/strong><\/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=\"\"># development.tfvars\nenvironment = \"development\"\ninstance_type = \"t3.micro\"\n\n# production.tfvars\nenvironment = \"production\"\ninstance_type = \"t3.small\"\n\n# main.tf\nresource \"aws_instance\" \"example\" {\n  ami           = var.ami_id\n  instance_type = var.instance_type\n\n  tags = {\n    Environment = var.environment\n  }\n}<\/pre>\n\n\n\n<p>\u5b9f\u884c\u30b3\u30de\u30f3\u30c9\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=\"\"># \u958b\u767a\u74b0\u5883\u7528\u306e\u8a08\u753b\nterraform plan -var-file=\"development.tfvars\"\n\n# \u672c\u756a\u74b0\u5883\u7528\u306e\u8a08\u753b\nterraform plan -var-file=\"production.tfvars\"<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u90e8\u5206\u7684\u306a\u5909\u66f4\u306e\u78ba\u8a8d<\/strong><\/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=\"\"># \u7279\u5b9a\u306eEC2\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u307f\u3092\u5bfe\u8c61\u3068\u3057\u305f\u8a08\u753b\nterraform plan -target=aws_instance.web_server -out=web_server.tfplan\n\n# \u7279\u5b9a\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u5185\u306e\u30ea\u30bd\u30fc\u30b9\u3092\u5bfe\u8c61\u3068\u3057\u305f\u8a08\u753b\nterraform plan -target=module.networking<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u8a73\u7d30\u306a\u5dee\u5206\u306e\u78ba\u8a8d<\/strong><\/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=\"\"># JSON\u5f62\u5f0f\u3067\u306e\u51fa\u529b\nterraform plan -json | jq\n\n# \u4eba\u9593\u304c\u8aad\u307f\u3084\u3059\u3044\u5f62\u5f0f\u3067\u306e\u8a73\u7d30\u8868\u793a\nterraform plan -no-color &gt; plan.txt<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3068\u4f7f\u7528\u65b9\u6cd5\u3092\u7406\u89e3\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u52b9\u679c\u7684\u306aInfrastructure as Code\u306e\u5b9f\u8df5\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u969b\u306e\u904b\u7528\u3067\u767a\u751f\u3057\u304c\u3061\u306a\u30a8\u30e9\u30fc\u3068\u305d\u306e\u5bfe\u51e6\u6cd5\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-22\">terraform plan\u306e\u30a8\u30e9\u30fc\u5bfe\u51e6\u6cd5\u3068\u904b\u7528\u306e\u30b3\u30c4<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h3>\n\n\n\n<p>terraform plan\u3092\u4f7f\u7528\u3059\u308b\u969b\u306b\u767a\u751f\u3059\u308b\u4e00\u822c\u7684\u306a\u30a8\u30e9\u30fc\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-24\">1. \u8a8d\u8a3c\u95a2\u9023\u306e\u30a8\u30e9\u30fc<\/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=\"\">Error: error configuring Terraform AWS Provider: no valid credential sources found<\/pre>\n\n\n\n<p>\u89e3\u6c7a\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=\"\"># AWS\u8a8d\u8a3c\u60c5\u5831\u306e\u8a2d\u5b9a\nexport AWS_ACCESS_KEY_ID=\"your_access_key\"\nexport AWS_SECRET_ACCESS_KEY=\"your_secret_key\"\n\n# \u307e\u305f\u306f\u3001AWS CLI\u306e\u8a2d\u5b9a\naws configure\n\n# \u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u306e\u6307\u5b9a\nexport AWS_PROFILE=production<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-25\">2. \u72b6\u614b\u30d5\u30a1\u30a4\u30eb\u95a2\u9023\u306e\u30a8\u30e9\u30fc<\/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=\"\">Error: Error loading state: state data in S3 does not have the expected content.<\/pre>\n\n\n\n<p>\u89e3\u6c7a\u624b\u9806\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u306e\u8a2d\u5b9a\u78ba\u8a8d<\/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=\"\"># backend.tf\nterraform {\n  backend \"s3\" {\n    bucket = \"terraform-state-bucket\"\n    key    = \"terraform.tfstate\"\n    region = \"ap-northeast-1\"\n    dynamodb_table = \"terraform-lock\"\n  }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ed\u30c3\u30af\u89e3\u9664\uff08\u5fc5\u8981\u306a\u5834\u5408\uff09<\/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=\"\"># DynamoDB\u306e\u30ed\u30c3\u30af\u89e3\u9664\naws dynamodb delete-item \\\n    --table-name terraform-lock \\\n    --key '{\"LockID\": {\"S\": \"terraform-state-bucket\/terraform.tfstate\"}}'<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-26\">3. \u30ea\u30bd\u30fc\u30b9\u4f9d\u5b58\u95a2\u4fc2\u306e\u30a8\u30e9\u30fc<\/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=\"\">Error: Resource depends on non-existent resource<\/pre>\n\n\n\n<p>\u89e3\u6c7a\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=\"\"># \u660e\u793a\u7684\u306a\u4f9d\u5b58\u95a2\u4fc2\u306e\u5b9a\u7fa9\ndepends_on = [\n  aws_vpc.main,\n  aws_subnet.public\n]\n\n# \u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u306e\u4f7f\u7528\ndata \"aws_vpc\" \"existing\" {\n  id = var.vpc_id\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ea\u30b9\u30af\u306e\u56de\u907f\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-28\">1. \u30a2\u30af\u30bb\u30b9\u6a29\u9650\u306e\u6700\u5c0f\u5316<\/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=\"\"># IAM\u30dd\u30ea\u30b7\u30fc\u306e\u4f8b\n{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"ec2:Describe*\",\n        \"ec2:RunInstances\",\n        \"ec2:TerminateInstances\"\n      ],\n      \"Resource\": \"*\"\n    }\n  ]\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-29\">2. \u6a5f\u5bc6\u60c5\u5831\u306e\u7ba1\u7406<\/h4>\n\n\n<div id=\"id-7ee90873-87bd-4984-8a55-2ac15f789462\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u65b9\u6cd5<\/th><th>\u4f7f\u7528\u30b7\u30fc\u30f3<\/th><th>\u5b9f\u88c5\u4f8b<\/th><\/tr><\/thead><tbody><tr><td>\u74b0\u5883\u5909\u6570<\/td><td>CI\/CD\u74b0\u5883<\/td><td><code>TF_VAR_database_password=\"${DB_PASSWORD}\"<\/code><\/td><\/tr><tr><td>AWS Secrets Manager<\/td><td>\u672c\u756a\u74b0\u5883<\/td><td><code>data \"aws_secretsmanager_secret_version\" \"db_password\"<\/code><\/td><\/tr><tr><td>HashiCorp Vault<\/td><td>\u5927\u898f\u6a21\u74b0\u5883<\/td><td><code>data \"vault_generic_secret\" \"db_creds\"<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\" id=\"i-30\">3. \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b9\u30ad\u30e3\u30f3\u306e\u5c0e\u5165<\/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=\"\"># tfsec\u306b\u3088\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30c1\u30a7\u30c3\u30af\ntfsec .\n\n# checkov\u306b\u3088\u308b\u8ffd\u52a0\u30c1\u30a7\u30c3\u30af\ncheckov -d .<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-31\">\u30b3\u30b9\u30c8\u6700\u9069\u5316\u306e\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-32\">1. \u30ea\u30bd\u30fc\u30b9\u306e\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u7ba1\u7406<\/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=\"\"># \u958b\u767a\u74b0\u5883\u306e\u30ea\u30bd\u30fc\u30b9\u81ea\u52d5\u505c\u6b62\nresource \"aws_instance\" \"dev\" {\n  # ... other configurations ...\n\n  lifecycle {\n    create_before_destroy = true\n  }\n\n  # \u81ea\u52d5\u505c\u6b62\u306e\u30bf\u30b0\n  tags = {\n    AutoStop = \"true\"\n    Environment = \"development\"\n  }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-33\">2. \u30b3\u30b9\u30c8\u898b\u7a4d\u3082\u308a\u306e\u81ea\u52d5\u5316<\/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=\"\"># Infracost\u3092\u4f7f\u7528\u3057\u305f\u30b3\u30b9\u30c8\u4e88\u6e2c\nterraform plan -out=tfplan\ninfracost breakdown --path tfplan\n\n# \u30b3\u30b9\u30c8\u95be\u5024\u30c1\u30a7\u30c3\u30af\ninfracost breakdown --path tfplan --compare-to=baseline.json<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-34\">3. \u30ea\u30bd\u30fc\u30b9\u6700\u9069\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n<div id=\"id-cd45af15-c230-4065-a289-a9328a863626\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6700\u9069\u5316\u30dd\u30a4\u30f3\u30c8<\/th><th>\u5b9f\u88c5\u65b9\u6cd5<\/th><th>\u671f\u5f85\u52b9\u679c<\/th><\/tr><\/thead><tbody><tr><td>\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u30b5\u30a4\u30ba<\/td><td>\u81ea\u52d5\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u8a2d\u5b9a<\/td><td>\u5fc5\u8981\u306b\u5fdc\u3058\u305f\u30ea\u30bd\u30fc\u30b9\u8abf\u6574<\/td><\/tr><tr><td>\u30b9\u30c8\u30ec\u30fc\u30b8<\/td><td>\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u30dd\u30ea\u30b7\u30fc<\/td><td>\u53e4\u3044\u30c7\u30fc\u30bf\u306e\u81ea\u52d5\u30a2\u30fc\u30ab\u30a4\u30d6<\/td><\/tr><tr><td>\u30ea\u30b6\u30fc\u30d6\u30c9\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9<\/td><td>\u9577\u671f\u5229\u7528\u30ea\u30bd\u30fc\u30b9\u306e\u4e88\u7d04<\/td><td>\u30b3\u30b9\u30c8\u306e\u5927\u5e45\u524a\u6e1b<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u5b9f\u88c5\u4f8b\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=\"\"># \u81ea\u52d5\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u306e\u8a2d\u5b9a\nresource \"aws_autoscaling_group\" \"web\" {\n  desired_capacity    = 2\n  max_size           = 4\n  min_size           = 1\n  target_group_arns  = [aws_lb_target_group.web.arn]\n  vpc_zone_identifier = aws_subnet.public[*].id\n\n  tag {\n    key                 = \"Environment\"\n    value               = var.environment\n    propagate_at_launch = true\n  }\n}\n\n# \u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u30dd\u30ea\u30b7\u30fc\nresource \"aws_autoscaling_policy\" \"web_scale_out\" {\n  name                   = \"web_scale_out\"\n  scaling_adjustment     = 1\n  adjustment_type        = \"ChangeInCapacity\"\n  cooldown              = 300\n  autoscaling_group_name = aws_autoscaling_group.web.name\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-35\">\u904b\u7528\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8a08\u753b\u7684\u306a\u5b9f\u884c<\/strong><\/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=\"\"># \u5909\u66f4\u306e\u5f71\u97ff\u7bc4\u56f2\u306e\u78ba\u8a8d\nterraform plan -detailed-exitcode\n\n# \u5909\u66f4\u5c65\u6b74\u306e\u4fdd\u5b58\nterraform plan -out=change_$(date +%Y%m%d_%H%M%S).tfplan<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u306b\u3088\u308b\u518d\u5229\u7528<\/strong><\/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=\"\"># \u5171\u901a\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u4f7f\u7528\u4f8b\nmodule \"vpc\" {\n  source = \".\/modules\/vpc\"\n\n  environment = var.environment\n  cidr_block  = var.vpc_cidr\n}\n\nmodule \"security\" {\n  source = \".\/modules\/security\"\n\n  vpc_id = module.vpc.vpc_id\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u8df5\u7684\u306a\u30a2\u30d7\u30ed\u30fc\u30c1\u3092\u9069\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5b89\u5168\u3067\u52b9\u7387\u7684\u306aTerraform\u904b\u7528\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30c1\u30fc\u30e0\u958b\u767a\u306b\u304a\u3051\u308b\u5177\u4f53\u7684\u306a\u6d3b\u7528\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-36\">\u30c1\u30fc\u30e0\u958b\u767a\u306b\u304a\u3051\u308bterraform plan\u306e\u6d3b\u7528\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-37\">GitHub\u3068\u306e\u9023\u643a\u306b\u3088\u308b\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u81ea\u52d5\u5316<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-38\">1. GitHub Actions\u306e\u8a2d\u5b9a<\/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=\"\"># .github\/workflows\/terraform.yml\nname: \"Terraform\"\n\non:\n  pull_request:\n    branches: [ main ]\n  push:\n    branches: [ main ]\n\njobs:\n  terraform:\n    name: 'Terraform'\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: Checkout\n      uses: actions\/checkout@v2\n\n    - name: Setup Terraform\n      uses: hashicorp\/setup-terraform@v1\n      with:\n        terraform_version: 1.7.0\n\n    - name: Configure AWS Credentials\n      uses: aws-actions\/configure-aws-credentials@v1\n      with:\n        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n        aws-region: ap-northeast-1\n\n    - name: Terraform fmt\n      id: fmt\n      run: terraform fmt -check\n      continue-on-error: true\n\n    - name: Terraform Init\n      id: init\n      run: terraform init\n\n    - name: Terraform Plan\n      id: plan\n      run: terraform plan -no-color\n      continue-on-error: true\n\n    - name: Update Pull Request\n      uses: actions\/github-script@v6\n      if: github.event_name == 'pull_request'\n      env:\n        PLAN: \"${{ steps.plan.outputs.stdout }}\"\n      with:\n        github-token: ${{ secrets.GITHUB_TOKEN }}\n        script: |\n          const output = `#### Terraform Plan \ud83d\udcdd\n          &lt;details&gt;&lt;summary&gt;Show Plan&lt;\/summary&gt;\n\n          \\`\\`\\`${process.env.PLAN}\\`\\`\\`\n\n          &lt;\/details&gt;`;\n\n          github.rest.issues.createComment({\n            issue_number: context.issue.number,\n            owner: context.repo.owner,\n            repo: context.repo.repo,\n            body: output\n          })<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-39\">2. \u30d7\u30eb\u30ea\u30af\u30a8\u30b9\u30c8\u30ef\u30fc\u30af\u30d5\u30ed\u30fc<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d6\u30e9\u30f3\u30c1\u6226\u7565<\/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=\"\"># \u6a5f\u80fd\u958b\u767a\u7528\u30d6\u30e9\u30f3\u30c1\u306e\u4f5c\u6210\ngit checkout -b feature\/add-new-resource\n\n# \u5909\u66f4\u306e\u4f5c\u6210\u3068\u30b3\u30df\u30c3\u30c8\ngit add .\ngit commit -m \"feat: Add new EC2 instance for web server\"\n\n# \u30d7\u30eb\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u4f5c\u6210\ngit push origin feature\/add-new-resource<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u81ea\u52d5\u30c1\u30a7\u30c3\u30af\u9805\u76ee<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>terraform fmt<\/li>\n\n\n\n<li>terraform validate<\/li>\n\n\n\n<li>terraform plan<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b9\u30ad\u30e3\u30f3\uff08tfsec\uff09<\/li>\n\n\n\n<li>\u30b3\u30b9\u30c8\u4e88\u6e2c\uff08Infracost\uff09<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-40\">\u30c1\u30fc\u30e0\u3067\u306e\u627f\u8a8d\u30d5\u30ed\u30fc\u3068\u6a29\u9650\u7ba1\u7406<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-41\">1. IAM\u30dd\u30ea\u30b7\u30fc\u306e\u8a2d\u5b9a<\/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=\"\">{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"terraform:plan\",\n        \"terraform:apply\"\n      ],\n      \"Resource\": \"*\",\n      \"Condition\": {\n        \"StringEquals\": {\n          \"aws:RequestedRegion\": [\"ap-northeast-1\"]\n        }\n      }\n    }\n  ]\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-42\">2. \u627f\u8a8d\u30d5\u30ed\u30fc\u306e\u5b9f\u88c5<\/h4>\n\n\n<div id=\"id-5c1c7cd6-8d21-4901-8fbc-7a4d6e86a5bb\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30d5\u30a7\u30fc\u30ba<\/th><th>\u62c5\u5f53\u8005<\/th><th>\u78ba\u8a8d\u9805\u76ee<\/th><\/tr><\/thead><tbody><tr><td>\u8a08\u753b\u4f5c\u6210<\/td><td>\u958b\u767a\u8005<\/td><td>\u30ea\u30bd\u30fc\u30b9\u69cb\u6210\u3001\u4f9d\u5b58\u95a2\u4fc2<\/td><\/tr><tr><td>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc<\/td><td>\u30ec\u30d3\u30e5\u30a2\u30fc<\/td><td>\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u898f\u7d04\u3001\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/td><\/tr><tr><td>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ec\u30d3\u30e5\u30fc<\/td><td>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u62c5\u5f53<\/td><td>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8981\u4ef6\u3001\u30b3\u30f3\u30d7\u30e9\u30a4\u30a2\u30f3\u30b9<\/td><\/tr><tr><td>\u6700\u7d42\u627f\u8a8d<\/td><td>\u30a4\u30f3\u30d5\u30e9\u7ba1\u7406\u8005<\/td><td>\u672c\u756a\u74b0\u5883\u3078\u306e\u5f71\u97ff\u3001\u30b3\u30b9\u30c8<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\" id=\"i-43\">3. \u74b0\u5883\u5225\u306e\u6a29\u9650\u8a2d\u5b9a<\/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=\"\"># \u74b0\u5883\u5225\u306e\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u8a2d\u5b9a\nterraform {\n  backend \"s3\" {\n    bucket         = \"terraform-state-${var.environment}\"\n    key            = \"${var.project}\/${var.environment}\/terraform.tfstate\"\n    region         = \"ap-northeast-1\"\n    dynamodb_table = \"terraform-lock-${var.environment}\"\n    role_arn       = \"arn:aws:iam::${var.account_id}:role\/terraform-${var.environment}\"\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-44\">\u52b9\u7387\u7684\u306a\u30ec\u30d3\u30e5\u30fc\u30d7\u30ed\u30bb\u30b9\u306e\u69cb\u7bc9\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-45\">1. \u30ec\u30d3\u30e5\u30fc\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/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=\"\"># Terraform Plan \u30ec\u30d3\u30e5\u30fc\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\n\n## \u30ea\u30bd\u30fc\u30b9\u69cb\u6210\n- [ ] \u65b0\u898f\u30ea\u30bd\u30fc\u30b9\u306e\u5fc5\u8981\u6027\n- [ ] \u30ea\u30bd\u30fc\u30b9\u8a2d\u5b9a\u306e\u59a5\u5f53\u6027\n- [ ] \u4f9d\u5b58\u95a2\u4fc2\u306e\u6b63\u3057\u3055\n\n## \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\n- [ ] IAM\u6a29\u9650\u306e\u6700\u5c0f\u5316\n- [ ] \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7\u306e\u9069\u5207\u306a\u8a2d\u5b9a\n- [ ] \u6697\u53f7\u5316\u8a2d\u5b9a\u306e\u78ba\u8a8d\n\n## \u30b3\u30b9\u30c8\n- [ ] \u30ea\u30bd\u30fc\u30b9\u30b5\u30a4\u30ba\u306e\u9069\u5207\u6027\n- [ ] \u4e88\u6e2c\u30b3\u30b9\u30c8\u306e\u59a5\u5f53\u6027\n- [ ] \u30b3\u30b9\u30c8\u6700\u9069\u5316\u306e\u53ef\u80fd\u6027\n\n## \u904b\u7528\u6027\n- [ ] \u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u8a2d\u5b9a\n- [ ] \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u8a2d\u5b9a\n- [ ] \u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u6027<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-46\">2. \u81ea\u52d5\u30ec\u30d3\u30e5\u30fc\u30c4\u30fc\u30eb\u306e\u5c0e\u5165<\/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=\"\"># pre-commit hooks \u306e\u8a2d\u5b9a\ncat &lt;&lt; EOF &gt; .pre-commit-config.yaml\nrepos:\n- repo: https:\/\/github.com\/antonbabenko\/pre-commit-terraform\n  rev: v1.83.5\n  hooks:\n    - id: terraform_fmt\n    - id: terraform_validate\n    - id: terraform_docs\n    - id: terraform_tflint\n    - id: terraform_tfsec\nEOF\n\n# pre-commit \u306e\u8a2d\u5b9a\npre-commit install<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-47\">3. \u30ec\u30d3\u30e5\u30fc\u30b3\u30e1\u30f3\u30c8\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8<\/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=\"\">## Terraform Plan \u30ec\u30d3\u30e5\u30fc\u7d50\u679c\n\n### \u5909\u66f4\u6982\u8981\n- \u8ffd\u52a0\u3055\u308c\u308b\u30ea\u30bd\u30fc\u30b9: X\u500b\n- \u5909\u66f4\u3055\u308c\u308b\u30ea\u30bd\u30fc\u30b9: Y\u500b\n- \u524a\u9664\u3055\u308c\u308b\u30ea\u30bd\u30fc\u30b9: Z\u500b\n\n### \u91cd\u8981\u306a\u5909\u66f4\u70b9\n1. [\u30ea\u30bd\u30fc\u30b9\u540d]\n   - \u5909\u66f4\u5185\u5bb9:\n   - \u5f71\u97ff\u7bc4\u56f2:\n   - \u30ea\u30b9\u30af\u8a55\u4fa1:\n\n### \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a55\u4fa1\n- [ ] \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7\u306e\u8a2d\u5b9a\u306f\u9069\u5207\n- [ ] IAM\u6a29\u9650\u306f\u6700\u5c0f\u9650\n- [ ] \u6697\u53f7\u5316\u8a2d\u5b9a\u306f\u8981\u4ef6\u3092\u6e80\u305f\u3057\u3066\u3044\u308b\n\n### \u30b3\u30b9\u30c8\u8a55\u4fa1\n- \u4e88\u6e2c\u3055\u308c\u308b\u6708\u984d\u30b3\u30b9\u30c8: $XXX\n- \u524d\u6708\u6bd4: +\/-$XXX\n\n### \u63a8\u5968\u4e8b\u9805\n1. [\u63a8\u5968\u5185\u5bb9]\n   - \u7406\u7531:\n   - \u5b9f\u88c5\u6848:\n\n### \u6c7a\u5b9a\n- [ ] \u627f\u8a8d\n- [ ] \u6761\u4ef6\u4ed8\u304d\u627f\u8a8d\n- [ ] \u8981\u4fee\u6b63<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u4ed5\u7d44\u307f\u3092\u5c0e\u5165\u3059\u308b\u3053\u3068\u3067\u3001\u30c1\u30fc\u30e0\u3067\u306e\u52b9\u7387\u7684\u306aTerraform\u904b\u7528\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3088\u308a\u5fdc\u7528\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3068\u5b9f\u8df5\u4f8b\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-48\">terraform plan\u306e\u5fdc\u7528\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3068\u5b9f\u8df5\u4f8b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-49\">\u5927\u898f\u6a21\u74b0\u5883\u3067\u306e\u5b9f\u884c\u8a08\u753b\u306e\u7ba1\u7406\u65b9\u6cd5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-50\">1. \u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528<\/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=\"\"># \u8907\u6570\u74b0\u5883\u306e\u69cb\u6210\u7ba1\u7406\nterraform {\n  backend \"s3\" {\n    bucket         = \"terraform-state-company\"\n    key            = \"workspaces\/${terraform.workspace}\/terraform.tfstate\"\n    region         = \"ap-northeast-1\"\n    dynamodb_table = \"terraform-lock\"\n  }\n}\n\n# \u74b0\u5883\u5225\u306e\u8a2d\u5b9a\nlocals {\n  workspace_config = {\n    development = {\n      instance_type = \"t3.micro\"\n      instance_count = 1\n    }\n    staging = {\n      instance_type = \"t3.small\"\n      instance_count = 2\n    }\n    production = {\n      instance_type = \"t3.medium\"\n      instance_count = 3\n    }\n  }\n\n  config = local.workspace_config[terraform.workspace]\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-51\">2. \u5927\u898f\u6a21\u5b9f\u884c\u8a08\u753b\u306e\u6700\u9069\u5316<\/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=\"\"># \u30d1\u30e9\u30ec\u30eb\u5b9f\u884c\u306e\u8a2d\u5b9a\nterraform {\n  required_version = \"&gt;= 1.7.0\"\n\n  backend \"s3\" {\n    bucket         = \"terraform-state-company\"\n    key            = \"env\/${terraform.workspace}\/terraform.tfstate\"\n    region         = \"ap-northeast-1\"\n    dynamodb_table = \"terraform-lock\"\n  }\n}\n\n# \u30ea\u30bd\u30fc\u30b9\u306e\u30bf\u30fc\u30b2\u30c3\u30c8\u6307\u5b9a\nresource \"aws_instance\" \"web\" {\n  count = local.config.instance_count\n\n  ami           = data.aws_ami.amazon_linux_2.id\n  instance_type = local.config.instance_type\n\n  tags = {\n    Name = \"web-${count.index + 1}\"\n    Environment = terraform.workspace\n  }\n\n  lifecycle {\n    create_before_destroy = true\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-52\">\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u3055\u308c\u305f\u30b3\u30fc\u30c9\u3067\u306e\u4f7f\u3044\u65b9<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-53\">1. \u518d\u5229\u7528\u53ef\u80fd\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u8a2d\u8a08<\/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=\"\"># modules\/vpc\/main.tf\nmodule \"vpc\" {\n  source = \"terraform-aws-modules\/vpc\/aws\"\n\n  name = var.vpc_name\n  cidr = var.vpc_cidr\n\n  azs             = var.availability_zones\n  private_subnets = var.private_subnet_cidrs\n  public_subnets  = var.public_subnet_cidrs\n\n  enable_nat_gateway = true\n  single_nat_gateway = var.environment != \"production\"\n\n  tags = merge(\n    var.tags,\n    {\n      Environment = var.environment\n      Terraform   = \"true\"\n    }\n  )\n}\n\n# modules\/vpc\/variables.tf\nvariable \"vpc_name\" {\n  type = string\n}\n\nvariable \"vpc_cidr\" {\n  type = string\n}\n\nvariable \"availability_zones\" {\n  type = list(string)\n}\n\nvariable \"environment\" {\n  type = string\n}\n\n# \u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u4f7f\u7528\u4f8b\nmodule \"production_vpc\" {\n  source = \".\/modules\/vpc\"\n\n  vpc_name = \"production-vpc\"\n  vpc_cidr = \"10.0.0.0\/16\"\n  availability_zones = [\"ap-northeast-1a\", \"ap-northeast-1c\"]\n  environment = \"production\"\n\n  tags = {\n    Project = \"main-infrastructure\"\n  }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-54\">2. \u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u4f9d\u5b58\u95a2\u4fc2\u7ba1\u7406<\/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=\"\"># \u4f9d\u5b58\u95a2\u4fc2\u3092\u6301\u3064\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u4f8b\nmodule \"security_group\" {\n  source = \".\/modules\/security\"\n\n  vpc_id = module.vpc.vpc_id\n  environment = var.environment\n}\n\nmodule \"application\" {\n  source = \".\/modules\/application\"\n\n  vpc_id = module.vpc.vpc_id\n  security_group_ids = [module.security_group.sg_id]\n  subnet_ids = module.vpc.private_subnet_ids\n\n  depends_on = [\n    module.vpc,\n    module.security_group\n  ]\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-55\">\u672c\u756a\u74b0\u5883\u3067\u306e\u5b89\u5168\u306a\u5b9f\u884c\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-56\">1. \u5b9f\u884c\u524d\u306e\u78ba\u8a8d\u4e8b\u9805<\/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\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u524d\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\n\n### 1. \u30b3\u30fc\u30c9\u54c1\u8cea\n- [ ] terraform fmt \u306b\u3088\u308b\u6574\u5f62\u78ba\u8a8d\n- [ ] terraform validate \u306b\u3088\u308b\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\n- [ ] \u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u78ba\u8a8d\n\n### 2. \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\n- [ ] IAM\u6a29\u9650\u306e\u6700\u5c0f\u5316\u78ba\u8a8d\n- [ ] \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b0\u30eb\u30fc\u30d7\u306e\u8a2d\u5b9a\u78ba\u8a8d\n- [ ] \u6a5f\u5bc6\u60c5\u5831\u306e\u9069\u5207\u306a\u7ba1\u7406\n\n### 3. \u53ef\u7528\u6027\n- [ ] \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u8a2d\u5b9a\u306e\u78ba\u8a8d\n- [ ] \u5197\u9577\u69cb\u6210\u306e\u78ba\u8a8d\n- [ ] \u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u624b\u9806\u306e\u6e96\u5099\n\n### 4. \u30b3\u30b9\u30c8\n- [ ] \u30ea\u30bd\u30fc\u30b9\u30b5\u30a4\u30b8\u30f3\u30b0\u306e\u78ba\u8a8d\n- [ ] \u30b3\u30b9\u30c8\u4e88\u6e2c\u306e\u5b9f\u65bd\n- [ ] \u4e0d\u8981\u30ea\u30bd\u30fc\u30b9\u306e\u78ba\u8a8d<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-57\">2. \u5b9f\u88c5\u4f8b\uff1a\u5b89\u5168\u306a\u5b9f\u884c\u8a08\u753b\u306e\u7ba1\u7406<\/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=\"\"># \u672c\u756a\u74b0\u5883\u7528\u306e\u8ffd\u52a0\u30c1\u30a7\u30c3\u30af\nlocals {\n  is_production = terraform.workspace == \"production\"\n\n  # \u672c\u756a\u74b0\u5883\u3067\u306e\u5fc5\u9808\u30bf\u30b0\n  required_tags = {\n    Environment  = terraform.workspace\n    Owner        = \"infrastructure-team\"\n    CostCenter   = \"infrastructure\"\n    Project      = \"main-platform\"\n  }\n}\n\n# \u30bf\u30b0\u4ed8\u3051\u30eb\u30fc\u30eb\u306e\u5f37\u5236\nresource \"aws_instance\" \"example\" {\n  # ... other configurations ...\n\n  tags = merge(\n    local.required_tags,\n    var.additional_tags,\n    {\n      Name = \"app-server-${count.index + 1}\"\n    }\n  )\n\n  lifecycle {\n    precondition {\n      condition     = !local.is_production || var.instance_type != \"t3.micro\"\n      error_message = \"Production environment cannot use t3.micro instances.\"\n    }\n  }\n}\n\n# \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u8a2d\u5b9a\u306e\u5f37\u5236\nresource \"aws_backup_plan\" \"example\" {\n  count = local.is_production ? 1 : 0\n\n  name = \"production-backup-plan\"\n\n  rule {\n    rule_name         = \"daily-backup\"\n    target_vault_name = aws_backup_vault.main[0].name\n    schedule          = \"cron(0 1 * * ? *)\"\n\n    lifecycle {\n      delete_after = 30\n    }\n  }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-58\">3. \u5927\u898f\u6a21\u74b0\u5883\u3067\u306e\u5b9f\u8df5\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af<\/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=\"\"># \u6761\u4ef6\u4ed8\u304d\u30ea\u30bd\u30fc\u30b9\u4f5c\u6210\nlocals {\n  create_resources = {\n    nat_gateway     = var.environment == \"production\"\n    backup          = var.environment == \"production\"\n    monitoring      = contains([\"staging\", \"production\"], var.environment)\n    alarm           = contains([\"staging\", \"production\"], var.environment)\n  }\n}\n\n# \u30ab\u30b9\u30bf\u30e0\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\nvariable \"allowed_instance_types\" {\n  type = map(list(string))\n  default = {\n    development = [\"t3.micro\", \"t3.small\"]\n    staging     = [\"t3.small\", \"t3.medium\"]\n    production  = [\"t3.medium\", \"t3.large\", \"m5.large\"]\n  }\n}\n\n# \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u30bf\u30a4\u30d7\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\nresource \"aws_instance\" \"app\" {\n  # ... other configurations ...\n\n  lifecycle {\n    precondition {\n      condition     = contains(var.allowed_instance_types[var.environment], var.instance_type)\n      error_message = \"Selected instance type is not allowed in this environment.\"\n    }\n  }\n}\n\n# \u8907\u6570\u30ea\u30fc\u30b8\u30e7\u30f3\u3067\u306e\u5c55\u958b\nprovider \"aws\" {\n  alias  = \"tokyo\"\n  region = \"ap-northeast-1\"\n}\n\nprovider \"aws\" {\n  alias  = \"osaka\"\n  region = \"ap-northeast-3\"\n}\n\n# \u30ea\u30fc\u30b8\u30e7\u30f3\u5225\u306e\u30ea\u30bd\u30fc\u30b9\u4f5c\u6210\nmodule \"tokyo_infrastructure\" {\n  source = \".\/modules\/regional-infrastructure\"\n\n  providers = {\n    aws = aws.tokyo\n  }\n\n  environment = var.environment\n  region_name = \"tokyo\"\n}\n\nmodule \"osaka_infrastructure\" {\n  source = \".\/modules\/regional-infrastructure\"\n\n  providers = {\n    aws = aws.osaka\n  }\n\n  environment = var.environment\n  region_name = \"osaka\"\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5fdc\u7528\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3068\u5b9f\u8df5\u4f8b\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u5927\u898f\u6a21\u306a\u672c\u756a\u74b0\u5883\u3067\u3082\u5b89\u5168\u304b\u3064\u52b9\u7387\u7684\u306aTerraform\u904b\u7528\u304c\u53ef\u80fd\u306b\u306a\u308a\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-2276","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\/2276","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=2276"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2276\/revisions"}],"predecessor-version":[{"id":2277,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2276\/revisions\/2277"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}