{"id":49152,"date":"2022-11-01T16:24:23","date_gmt":"2023-05-21T02:33:04","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/"},"modified":"2024-04-28T22:28:32","modified_gmt":"2024-04-28T14:28:32","slug":"%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/","title":{"rendered":"\u8ba9\u6211\u4eec\u4f7f\u7528Terraform\u548cGitHub Actions\u5728ECS\u4e0a\u8fd0\u884cLaravel"},"content":{"rendered":"<p>\u4ee5\u4e0b\u4e3a\u57fa\u672c\u7ec4\u6210\u7ed3\u6784\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u3042\u307e\u308a\u5909\u66f4\u304c\u5c11\u306a\u3044\u30a4\u30f3\u30d5\u30e9\u5468\u308a\u306fterraform\u304b\u3089\u66f4\u65b0<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u983b\u7e41\u306b\u5909\u66f4\u3055\u308c\u308b\u30bd\u30fc\u30b9\u3084\u30bf\u30b9\u30af\u5b9a\u7fa9\u306fGitHub Actions\u304b\u3089\u66f4\u65b0<\/ul>\n<p>\u52aa\u529b\u53bb\u5b9e\u73b0\u3002<\/p>\n<p>\u5e0c\u671b\u6211\u6839\u636e\u4e0d\u540c\u73af\u5883\u5206\u914d\u76ee\u5f55\uff0c\u5e76\u8003\u8651\u5b9e\u9645\u8fd0\u884c\u60c5\u51b5\u8fdb\u884c\u6784\u5efa\uff0c\u5e0c\u671b\u80fd\u5bf9\u60a8\u6709\u6240\u5e2e\u52a9\u3002<\/p>\n<p>\u793a\u4f8b\u4ee3\u7801\u53ef\u4ee5\u5728\u4ee5\u4e0b\u94fe\u63a5\u4e2d\u627e\u5230\uff1ahttps:\/\/github.com\/okdyy75\/dev-laravel-ecs-terraform-sample<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8941913a08637a6c579e\/5-0.png\" alt=\"\u30b7\u30b9\u30c6\u30e0\u69cb\u6210\u56f3\" \/><\/div>\n<h2>\u76ee\u5f55\u7ed3\u6784<\/h2>\n<pre class=\"post-pre\"><code>.\r\n\u251c\u2500\u2500 docker                   ...\u30ed\u30fc\u30ab\u30eb\u958b\u767a\u7528Docker\r\n\u251c\u2500\u2500 docker-compose.yml       ...\u30ed\u30fc\u30ab\u30eb\u958b\u767a\u7528Docker Compose\r\n\u251c\u2500\u2500 docker-compose.yml.dev   ...ECR\u7528Dockerfile\u306e\u30d3\u30eb\u30c9\u53c2\u8003\u7528Docker Compose\r\n\u251c\u2500\u2500 ecs                      ...ecs\u95a2\u9023\uff08ECR\u30fb\u30bf\u30b9\u30af\u5b9a\u7fa9\uff09\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 dev\r\n\u2502\u00a0\u00a0     \u251c\u2500\u2500 container        ...ECR\u7528Dockerfile\r\n\u2502\u00a0\u00a0     \u2514\u2500\u2500 task_definition  ...\u30bf\u30b9\u30af\u5b9a\u7fa9\u30d5\u30a1\u30a4\u30eb\r\n\u251c\u2500\u2500 system.drawio            ...\u30b7\u30b9\u30c6\u30e0\u69cb\u6210\u56f3\r\n\u251c\u2500\u2500 terraform           ...terraform\u95a2\u9023\uff08\u30a4\u30f3\u30d5\u30e9\u5468\u308a\uff09\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 environments\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 dev         ...dev\u74b0\u5883\u5411\u3051terraform\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 example.tfvars  ...\u74b0\u5883\u5909\u6570\u30d5\u30a1\u30a4\u30eb\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 modules\r\n\u2502\u00a0\u00a0     \u251c\u2500\u2500 ecs          ...ecs\u95a2\u9023\u306e\u69cb\u6210\r\n\u2502\u00a0\u00a0     \u2514\u2500\u2500 rds          ...rds\u95a2\u9023\u306e\u69cb\u6210\r\n\u2514\u2500\u2500 web\r\n    \u2514\u2500\u2500 laravel          ... Laravel\u672c\u4f53\r\n<\/code><\/pre>\n<h2>\u6267\u884c\u73af\u5883\u548c\u6240\u9700\u5de5\u5177<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">terraform<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">aws cli<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">session-manager-plugin<\/ul>\n<pre class=\"post-pre\"><code>$ terraform -v\r\nTerraform v1.4.6\r\non darwin_amd64\r\n\r\n$ aws --version\r\naws-cli\/2.11.16 Python\/3.11.3 Darwin\/22.4.0 exe\/x86_64 prompt\/off\r\n<\/code><\/pre>\n<h2>\u9884\u8bbe<\/h2>\n<pre class=\"post-pre\"><code><span class=\"c\"># tfstate\u7ba1\u7406\u7528\u306bS3\u30d0\u30b1\u30c3\u30c8\u4f5c\u6210<\/span>\r\naws s3 mb s3:\/\/y-oka-ecs-dev\r\n\r\n<span class=\"c\"># ECR\u30ea\u30dd\u30b8\u30c8\u30ea\u4f5c\u6210<\/span>\r\naws ecr create-repository <span class=\"nt\">--repository-name<\/span> y-oka-ecs\/dev\/nginx\r\naws ecr create-repository <span class=\"nt\">--repository-name<\/span> y-oka-ecs\/dev\/php-fpm\r\n\r\n<span class=\"c\"># tfvars\u30b3\u30d4\u30fc<\/span>\r\n<span class=\"nb\">cp <\/span>example.tfvars .\/environments\/dev\/dev.tfvars\r\n\r\n<span class=\"c\"># terraform\u521d\u671f\u5316<\/span>\r\nterraform init\r\n<\/code><\/pre>\n<h3>\u521b\u5efaECS\u4efb\u52a1\u5b9a\u4e49<\/h3>\n<p>ECS\u7684\u914d\u7f6e\u7531terraform\u8fdb\u884c\u7ba1\u7406\uff0c\u4f46ECR\u548c\u4efb\u52a1\u5b9a\u4e49\u7531GitHub Actions\u8fdb\u884c\u7ba1\u7406\uff0c\u56e0\u6b64\u8981\u4e8b\u5148\u5728terraform\u548c\u4efb\u52a1\u5b9a\u4e49\u7684json\u4e2d\u7edf\u4e00\u89d2\u8272\u540d\u79f0\u548c\u65e5\u5fd7\u7ec4\u8def\u5f84\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">family\uff08\u4f8b\uff1ay-oka-ecs-dev\uff09<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">taskRoleArn\uff08\u4f8b\uff1ay-oka-ecs-task-execution\uff09<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">logConfiguration\u306eawslogs-group\uff08\u4f8b\uff1a\/y-oka-ecs\/ecs\uff09<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">secrets\u306evalueFrom\uff08\u4f8b\uff1a\/y-oka-ecs\/dev\/APP_KEY\uff09<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u3092\u63c3\u3048\u308b<\/ul>\n<p>ecs\/dev\/task_definition\/y-oka-ecs.json \u53ef\u4ee5\u88ab\u63cf\u8ff0\u4e3aecs\/dev\/task_definition\/y-oka-ecs.json\u53ef\u4ee5\u88ab\u5f62\u5bb9\u4e3a\u3002<\/p>\n<pre class=\"post-pre\"><code>  \"family\": \"y-oka-ecs-dev\",\r\n  \"taskRoleArn\": \"arn:aws:iam::&lt;aws\u306e\u30a2\u30ab\u30a6\u30f3\u30c8ID&gt;:role\/y-oka-ecs-dev-task-execution\",\r\n  \"executionRoleArn\": \"arn:aws:iam::&lt;aws\u306e\u30a2\u30ab\u30a6\u30f3\u30c8ID&gt;:role\/y-oka-ecs-dev-task-execution\",\r\n  ...\r\n      \"secrets\": [\r\n        {\r\n          \"name\": \"APP_KEY\",\r\n          \"valueFrom\": \"\/y-oka-ecs\/dev\/APP_KEY\"\r\n        },\r\n  ...\r\n\r\n      \"logConfiguration\": {\r\n        \"logDriver\": \"awslogs\",\r\n        \"options\": {\r\n          \"awslogs-region\": \"ap-northeast-1\",\r\n          \"awslogs-group\": \"\/y-oka-ecs\/ecs\",\r\n          \"awslogs-stream-prefix\": \"dev\"\r\n        }\r\n      }\r\n<\/code><\/pre>\n<p>\u7531\u4e8e\u96c6\u7fa4\u548c\u670d\u52a1\u5c1a\u672a\u901a\u8fc7Terraform\u521b\u5efa\uff0c\u56e0\u6b64\u8bf7\u5c06\u5176\u6ce8\u91ca\u6389\u3002<\/p>\n<pre class=\"post-pre\"><code>      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy to ECS TaskDefinition<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws-actions\/amazon-ecs-deploy-task-definition@v1<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">task-definition<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ steps.render-nginx-container.outputs.task-definition }}<\/span>\r\n          <span class=\"c1\"># cluster: ${{ env.ECS_CLUSTER }}<\/span>\r\n          <span class=\"c1\"># service: ${{ env.ECS_SERVICE }}<\/span>\r\n\r\n<\/code><\/pre>\n<h4>\u4f7f\u7528GitHub Actions\u6267\u884c\u4efb\u52a1\u5b9a\u4e49\u521b\u5efaCI\u3002<\/h4>\n<p>\u5728\u6267\u884cCI\u4e4b\u524d\uff0c\u5728GitHub Actions\u4e2d\u8bbe\u7f6eSecrets\u3002\u8bbe\u7f6e\u597dSecrets\u540e\uff0c\u63a8\u9001\u5e76\u6267\u884cECS\u90e8\u7f72CI\u3002<\/p>\n<pre class=\"post-pre\"><code>git push origin develop\r\n<\/code><\/pre>\n<h3>\u57df\u540d\u8a2d\u7f6e<\/h3>\n<p>\u8fd9\u6b21\u8981\u8bbe\u7f6e\u57df\u540d\u4ee5\u4fbf\u901a\u8fc7https\u8fde\u63a5\u3002\u56e0\u4e3a\u6211\u62e5\u6709\u4e00\u4e2a\u540d\u4e3a&#8221;okdyy75.com&#8221;\u7684\u57df\u540d\u5728Google\u57df\u540d\u4e0a\uff0c\u6240\u4ee5\u6211\u4f1a\u5728Route53\u4e0a\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a&#8221;dev-laravel-ecs.okdyy75.com&#8221;\u7684\u65b0\u57df\u540d\uff0c\u5e76\u8bbe\u7f6e\u8bc1\u4e66\u3002<\/p>\n<h4>\u901a\u8fc7Route53\u521b\u5efa\u57df\u540d<\/h4>\n<p>\u5728Route53\u4e0a\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a\u201cdev-laravel-ecs.okdyy75.com\u201d\u7684\u4e3b\u673a\u533a\u57df\u3002<\/p>\n<p>\u521b\u5efa\u4e3b\u673a\u533a\u57df\u65f6\u4f1a\u81ea\u52a8\u751f\u6210NS\u8bb0\u5f55\u548cSOA\u8bb0\u5f55\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8941913a08637a6c579e\/28-0.png\" alt=\"Route53\u304b\u3089\u30c9\u30e1\u30a4\u30f3\u4f5c\u6210\" \/><\/div>\n<p>\u5c06\u8be5NS\u8bb0\u5f55\u7684\u57df\u540d\u670d\u52a1\u5668\u6ce8\u518c\u5230Google\u57df\u540d\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8941913a08637a6c579e\/30-0.png\" alt=\"\u30cd\u30fc\u30e0\u30b5\u30fc\u30d0\u30fc\u3092Google\u30c9\u30e1\u30a4\u30f3\u306b\u767b\u9332\" \/><\/div>\n<h4>\u521b\u5efa\u7684\u57df\u540d\u8bc1\u4e66\u521b\u5efa<\/h4>\n<p>\u4eceAWS\u8bc1\u4e66\u7ba1\u7406\u5668\uff08ACM\uff09\u8bf7\u6c42\u201cdev-laravel-ecs.okdyy75.com\u201d\u57df\u7684\u8bc1\u4e66\uff0c<br \/>\n\u521b\u5efa\u540e\uff0c\u4ece\u8bc1\u4e66\u8be6\u7ec6\u9875\u9762\u6267\u884c\u201c\u5728Route53\u4e2d\u521b\u5efa\u8bb0\u5f55\u201d\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8941913a08637a6c579e\/33-0.png\" alt=\"\u8a3c\u660e\u66f8\u3092Route53\u306b\u767b\u9332\" \/><\/div>\n<p>\u51c6\u5907\u5de5\u4f5c\u5df2\u7ecf\u5b8c\u6210\u4e86\uff01<\/p>\n<hr \/>\n<h2>\u5f00\u53d1\u7684\u8fc7\u7a0b<\/h2>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u4ecedevelop\u5206\u652f\u521b\u5efatopic\u5206\u652f\u3002<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5982\u679c\u8981\u66f4\u65b0\u57fa\u7840\u67b6\u6784\uff0c\u8bf7\u521b\u5efa\u4e00\u4e2a\u4fee\u6539\u4e86terraform\/\u76ee\u5f55\u7684\u5206\u652f\u3002<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5982\u679c\u8981\u66f4\u65b0\u4efb\u52a1\u5b9a\u4e49\u6216\u8d44\u6e90\uff0c\u8bf7\u521b\u5efa\u4e00\u4e2a\u4fee\u6539\u4e86ecs\/\u6216web\/\u76ee\u5f55\u7684\u5206\u652f\u3002<\/ol>\n<\/li>\n<\/ol>\n<p>\u5728\u5408\u5e76\u4fee\u6539\u4e86terraform\u7684\u5206\u652f\u4e4b\u524d\uff0c\u624b\u52a8\u8fd0\u884cGitHub Actions\u4e2d\u7684Terraform\u8ba1\u5212CI\uff08terraform_plan_dev.yml\uff09\u6765\u786e\u8ba4\u3002<br \/>\n\u5c06topic\u5206\u652f\u5408\u5e76\u5230develop\u5206\u652f\u3002\u5408\u5e76\u540e\uff0c\u5404\u4e2aGitHub Actions\u5c06\u4f1a\u8fd0\u884c\u3002<\/p>\n<p>\u5982\u679c\u4fee\u6539\u4e86terraform\/\u76ee\u5f55\uff0c\u5c06\u6267\u884cterraform apply\u3002<\/p>\n<p>\u5982\u679c\u4fee\u6539\u4e86ecs\/\u6216web\/\u76ee\u5f55\uff0c\u4efb\u52a1\u5b9a\u4e49\u5c06\u4f1a\u66f4\u65b0\uff0c\u65b0\u4efb\u52a1\u5c06\u4f1a\u90e8\u7f72\u3002<\/p>\n<p>\u5982\u679c\u60f3\u5728\u53d1\u5e03\u540e\u8fd0\u884cartisan\u547d\u4ee4\uff0c\u8bf7\u6267\u884cGitHub Actions\u4e2d\u7684ECS Exec\u547d\u4ee4CI\uff08ecs_exec_cmd_dev.yml\uff09\u3002<\/p>\n<p>\u4f8b\u5982\uff0c\u5982\u679c\u8981\u6267\u884cSeeder\uff0c\u53ef\u4ee5\u4f7f\u7528&#8221;php&#8221;\uff0c&#8221;\/var\/www\/web\/laravel\/artisan&#8221;\uff0c&#8221;db:seed&#8221;\uff0c&#8221;&#8211;class=UserSeeder&#8221;\uff0c&#8221;&#8211;force&#8221;\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u6267\u884c\u3002<\/p>\n<h2>\u89e3\u6790Terraform<\/h2>\n<p>\u57fa\u672c\u4e0a\uff0c\u6211\u4eec\u9700\u8981\u9488\u5bf9\u6bcf\u4e2a\u73af\u5883\u5c06\u76ee\u5f55\u5206\u5f00\uff0c\u5e76\u5728terraform\/environments\/\u8def\u5f84\u4e0b\u6267\u884cterraform apply<\/p>\n<h3>\u4e3b\u8981\u7684tf\u6587\u4ef6<\/h3>\n<p>\u7f51\u7edc\u8bbe\u7f6e\u6ca1\u6709\u6545\u610f\u6a21\u5757\u5316\uff0c\u800c\u662f\u6839\u636e\u6bcf\u4e2a\u73af\u5883\u6765\u521b\u5efa\u3002<br \/>\n\u8bf7\u6ce8\u610ftfstate\u6587\u4ef6\u540d\u662f\u786c\u7f16\u7801\u7684\u3002<br \/>\n\u8bf7\u9884\u5148\u5728Route53\u4e0a\u6ce8\u518c\u57df\u540d\u5e76\u751f\u6210\u8bc1\u4e66\u3002<\/p>\n<p>terraform\/environments\/dev\/main.tf &#8212;&gt; terraform\/\u73af\u5883\/dev\/main.tf<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"~&gt; 1.4.6\"<\/span>\r\n  <span class=\"nx\">required_providers<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">aws<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">source<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"hashicorp\/aws\"<\/span>\r\n      <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"~&gt; 4.65.0\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">backend<\/span> <span class=\"s2\">\"s3\"<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">bucket<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"y-oka-ecs-dev\"<\/span>\r\n    <span class=\"nx\">region<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span>\r\n    <span class=\"nx\">key<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"y-oka-ecs-dev.tfstate\"<\/span>\r\n    <span class=\"nx\">encrypt<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">provider<\/span> <span class=\"s2\">\"aws\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">region<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span>\r\n  <span class=\"nx\">default_tags<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">env<\/span>     <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span>\r\n      <span class=\"nx\">service<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span>\r\n      <span class=\"nx\">Name<\/span>    <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"env\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"app_domain\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"app_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"app_key\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"db_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"db_username\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"db_password\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"variable_env\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"variable_app_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">###########################################################<\/span>\r\n<span class=\"c1\">### \u30cd\u30c3\u30c8\u30ef\u30fc\u30af <\/span>\r\n<span class=\"c1\">############################################################<\/span>\r\n<span class=\"c1\">### VPC ####################<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_vpc\"<\/span> <span class=\"s2\">\"main\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"10.0.0.0\/16\"<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-vpc\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">### Public ####################<\/span>\r\n<span class=\"c1\">## Subnet<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_subnet\"<\/span> <span class=\"s2\">\"public_1a\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>            <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">availability_zone<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1a\"<\/span>\r\n  <span class=\"nx\">cidr_block<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"10.0.1.0\/24\"<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-subnet-public-1a\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_subnet\"<\/span> <span class=\"s2\">\"public_1c\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>            <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">availability_zone<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1c\"<\/span>\r\n  <span class=\"nx\">cidr_block<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"10.0.2.0\/24\"<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-subnet-public-1c\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_subnet\"<\/span> <span class=\"s2\">\"public_1d\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>            <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">availability_zone<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1d\"<\/span>\r\n  <span class=\"nx\">cidr_block<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"10.0.3.0\/24\"<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-subnet-public-1d\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">## IGW<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_internet_gateway\"<\/span> <span class=\"s2\">\"main\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-igw\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_internet_gateway_attachment\"<\/span> <span class=\"s2\">\"igw_main_attach\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>              <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">internet_gateway_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_internet_gateway<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">## RTB<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route_table\"<\/span> <span class=\"s2\">\"public\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-rtb-public\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route\"<\/span> <span class=\"s2\">\"public\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">destination_cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"0.0.0.0\/0\"<\/span>\r\n  <span class=\"nx\">route_table_id<\/span>         <span class=\"p\">=<\/span> <span class=\"nx\">aws_route_table<\/span><span class=\"p\">.<\/span><span class=\"nx\">public<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">gateway_id<\/span>             <span class=\"p\">=<\/span> <span class=\"nx\">aws_internet_gateway<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route_table_association\"<\/span> <span class=\"s2\">\"public_1a\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">subnet_id<\/span>      <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_1a<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">route_table_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_route_table<\/span><span class=\"p\">.<\/span><span class=\"nx\">public<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route_table_association\"<\/span> <span class=\"s2\">\"public_1c\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">subnet_id<\/span>      <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_1c<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">route_table_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_route_table<\/span><span class=\"p\">.<\/span><span class=\"nx\">public<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route_table_association\"<\/span> <span class=\"s2\">\"public_1d\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">subnet_id<\/span>      <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_1d<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">route_table_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_route_table<\/span><span class=\"p\">.<\/span><span class=\"nx\">public<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">### Private ####################<\/span>\r\n<span class=\"c1\">## Subnet<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_subnet\"<\/span> <span class=\"s2\">\"private_1a\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>            <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">availability_zone<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1a\"<\/span>\r\n  <span class=\"nx\">cidr_block<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"10.0.10.0\/24\"<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-subnet-private-1a\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_subnet\"<\/span> <span class=\"s2\">\"private_1c\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>            <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">availability_zone<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1c\"<\/span>\r\n  <span class=\"nx\">cidr_block<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"10.0.20.0\/24\"<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-subnet-private-1c\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_subnet\"<\/span> <span class=\"s2\">\"private_1d\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>            <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">availability_zone<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1d\"<\/span>\r\n  <span class=\"nx\">cidr_block<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"10.0.30.0\/24\"<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-subnet-private-1d\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">## NGW<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_eip\"<\/span> <span class=\"s2\">\"ngw_1a\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-eip-ngw-1a\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_eip\"<\/span> <span class=\"s2\">\"ngw_1c\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-eip-ngw-1c\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_eip\"<\/span> <span class=\"s2\">\"ngw_1d\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-eip-ngw-1d\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_nat_gateway\"<\/span> <span class=\"s2\">\"ngw_1a\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">subnet_id<\/span>     <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_1a<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">allocation_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_eip<\/span><span class=\"p\">.<\/span><span class=\"nx\">ngw_1a<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-ngw-1a\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_nat_gateway\"<\/span> <span class=\"s2\">\"ngw_1c\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">subnet_id<\/span>     <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_1c<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">allocation_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_eip<\/span><span class=\"p\">.<\/span><span class=\"nx\">ngw_1c<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-ngw-1c\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_nat_gateway\"<\/span> <span class=\"s2\">\"ngw_1d\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">subnet_id<\/span>     <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_1d<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">allocation_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_eip<\/span><span class=\"p\">.<\/span><span class=\"nx\">ngw_1d<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-ngw-1d\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">## RTB<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route_table\"<\/span> <span class=\"s2\">\"private_1a\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-rtb-private-1a\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route_table\"<\/span> <span class=\"s2\">\"private_1c\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-rtb-private-1c\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route_table\"<\/span> <span class=\"s2\">\"private_1d\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-rtb-private-1d\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route\"<\/span> <span class=\"s2\">\"private_1a\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">destination_cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"0.0.0.0\/0\"<\/span>\r\n  <span class=\"nx\">route_table_id<\/span>         <span class=\"p\">=<\/span> <span class=\"nx\">aws_route_table<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1a<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">nat_gateway_id<\/span>         <span class=\"p\">=<\/span> <span class=\"nx\">aws_nat_gateway<\/span><span class=\"p\">.<\/span><span class=\"nx\">ngw_1a<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route\"<\/span> <span class=\"s2\">\"private_1c\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">destination_cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"0.0.0.0\/0\"<\/span>\r\n  <span class=\"nx\">route_table_id<\/span>         <span class=\"p\">=<\/span> <span class=\"nx\">aws_route_table<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1c<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">nat_gateway_id<\/span>         <span class=\"p\">=<\/span> <span class=\"nx\">aws_nat_gateway<\/span><span class=\"p\">.<\/span><span class=\"nx\">ngw_1c<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route\"<\/span> <span class=\"s2\">\"private_1d\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">destination_cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"0.0.0.0\/0\"<\/span>\r\n  <span class=\"nx\">route_table_id<\/span>         <span class=\"p\">=<\/span> <span class=\"nx\">aws_route_table<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1d<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">nat_gateway_id<\/span>         <span class=\"p\">=<\/span> <span class=\"nx\">aws_nat_gateway<\/span><span class=\"p\">.<\/span><span class=\"nx\">ngw_1d<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route_table_association\"<\/span> <span class=\"s2\">\"private_1a\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">subnet_id<\/span>      <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1a<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">route_table_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_route_table<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1a<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route_table_association\"<\/span> <span class=\"s2\">\"private_1c\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">subnet_id<\/span>      <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1c<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">route_table_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_route_table<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1c<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route_table_association\"<\/span> <span class=\"s2\">\"private_1d\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">subnet_id<\/span>      <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1d<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">route_table_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_route_table<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1d<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">############################################################<\/span>\r\n<span class=\"c1\">### RDS <\/span>\r\n<span class=\"c1\">############################################################<\/span>\r\n<span class=\"k\">module<\/span> <span class=\"s2\">\"rds\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">source<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"..\/..\/modules\/rds\"<\/span>\r\n  <span class=\"nx\">env<\/span>            <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span>\r\n  <span class=\"nx\">app_name<\/span>       <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span>\r\n  <span class=\"nx\">db_name<\/span>        <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">db_name<\/span>\r\n  <span class=\"nx\">db_username<\/span>    <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">db_username<\/span>\r\n  <span class=\"nx\">db_password<\/span>    <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">db_password<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>         <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">vpc_cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">cidr_block<\/span>\r\n  <span class=\"nx\">private_subnet_ids<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1a<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1c<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1d<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">############################################################<\/span>\r\n<span class=\"c1\">### ECS <\/span>\r\n<span class=\"c1\">############################################################<\/span>\r\n<span class=\"k\">module<\/span> <span class=\"s2\">\"ecs\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">source<\/span>                   <span class=\"p\">=<\/span> <span class=\"s2\">\"..\/..\/modules\/ecs\"<\/span>\r\n  <span class=\"nx\">env<\/span>                      <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span>\r\n  <span class=\"nx\">app_name<\/span>                 <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span>\r\n  <span class=\"nx\">app_key<\/span>                  <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_key<\/span>\r\n  <span class=\"nx\">db_host<\/span>                  <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">rds<\/span><span class=\"p\">.<\/span><span class=\"nx\">endpoint<\/span>\r\n  <span class=\"nx\">db_name<\/span>                  <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">db_name<\/span>\r\n  <span class=\"nx\">db_username<\/span>              <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">db_username<\/span>\r\n  <span class=\"nx\">db_password<\/span>              <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">db_password<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>                   <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">vpc_cidr_block<\/span>           <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nx\">cidr_block<\/span>\r\n  <span class=\"nx\">acm_cert_app_domain_arn<\/span>  <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_acm_certificate<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_domain<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n  <span class=\"nx\">public_subnet_ids<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_1a<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_1c<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_1d<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"p\">]<\/span>\r\n  <span class=\"nx\">private_subnet_ids<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1a<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1c<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_1d<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">############################################################<\/span>\r\n<span class=\"c1\">### Route 53<\/span>\r\n<span class=\"c1\">############################################################<\/span>\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_route53_zone\"<\/span> <span class=\"s2\">\"app_domain\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_domain<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route53_record\"<\/span> <span class=\"s2\">\"app_domain_a\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">zone_id<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_route53_zone<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_domain<\/span><span class=\"p\">.<\/span><span class=\"nx\">zone_id<\/span>\r\n  <span class=\"nx\">name<\/span>    <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_domain<\/span>\r\n  <span class=\"nx\">type<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"A\"<\/span>\r\n  <span class=\"nx\">alias<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">name<\/span>                   <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">ecs<\/span><span class=\"p\">.<\/span><span class=\"nx\">lb_dns_name<\/span>\r\n    <span class=\"nx\">zone_id<\/span>                <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">ecs<\/span><span class=\"p\">.<\/span><span class=\"nx\">lb_zone_id<\/span>\r\n    <span class=\"nx\">evaluate_target_health<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_acm_certificate\"<\/span> <span class=\"s2\">\"app_domain\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">domain<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_domain<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"app_domain_nameserver\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">join<\/span><span class=\"p\">(<\/span><span class=\"s2\">\", \"<\/span><span class=\"p\">,<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_route53_zone<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_domain<\/span><span class=\"p\">.<\/span><span class=\"nx\">name_servers<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u4f7f\u7528tf\u6587\u4ef6\u6765\u4f7f\u7528RDS<\/h3>\n<p>\u60a8\u53ef\u4ee5\u901a\u8fc7AWS\u7684\u56fe\u5f62\u7528\u6237\u754c\u9762\u548c\u6587\u6863\u6765\u8bbe\u7f6eaws_rds_cluster\u7684engine_version\u3002\u8fd9\u4e2a\u5f15\u64ce\u7248\u672c\u662f\u5173\u4e8eAurora MySQL\u7684\u7248\u672c\u53f7\u548c\u7279\u6b8a\u7248\u672c\u3002<\/p>\n<p>\u5728AWS RDS\u96c6\u7fa4\u5b9e\u4f8b\u4e2d\uff0cinstance_class\u9009\u9879\u4e0d\u652f\u6301\u6700\u5c0f\u7684mysql8\u5b9e\u4f8b\u7c7b\u578b\uff08db.t3.small\uff09\uff0c\u53ea\u80fd\u4f7f\u7528db.t3.medium\uff0c\u8bf7\u6ce8\u610f\u3002<\/p>\n<p>terraform\u6a21\u5757\/rds\/main.tf<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"env\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"app_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"db_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"db_username\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"db_password\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"vpc_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"vpc_cidr_block\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"private_subnet_ids\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">list<\/span><span class=\"p\">(<\/span><span class=\"nx\">string<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">### DB\u30b5\u30d6\u30cd\u30c3\u30c8\u30b0\u30eb\u30fc\u30d7 ####################<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_db_subnet_group\"<\/span> <span class=\"s2\">\"this\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-db-subnet-group\"<\/span>\r\n  <span class=\"nx\">subnet_ids<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_subnet_ids<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># SG<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group\"<\/span> <span class=\"s2\">\"rds\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-rds-sg\"<\/span>\r\n  <span class=\"nx\">vpc_id<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># \u30a2\u30a6\u30c8\u30d0\u30a6\u30f3\u30c9(\u5916\u306b\u51fa\u308b)\u30eb\u30fc\u30eb<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group_rule\"<\/span> <span class=\"s2\">\"rds_out_all\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"egress\"<\/span>\r\n  <span class=\"nx\">from_port<\/span>         <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n  <span class=\"nx\">to_port<\/span>           <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n  <span class=\"nx\">protocol<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"-1\"<\/span>\r\n  <span class=\"nx\">cidr_blocks<\/span>       <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"0.0.0.0\/0\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">security_group_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">rds<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># \u30a4\u30f3\u30d0\u30a6\u30f3\u30c9(\u53d7\u3051\u5165\u308c\u308b)\u30eb\u30fc\u30eb<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group_rule\"<\/span> <span class=\"s2\">\"rds_in_mysql\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span>      <span class=\"p\">=<\/span> <span class=\"s2\">\"ingress\"<\/span>\r\n  <span class=\"nx\">from_port<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">3306<\/span>\r\n  <span class=\"nx\">to_port<\/span>   <span class=\"p\">=<\/span> <span class=\"mi\">3306<\/span>\r\n  <span class=\"nx\">protocol<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"tcp\"<\/span>\r\n  <span class=\"nx\">cidr_blocks<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_cidr_block<\/span>\r\n  <span class=\"p\">]<\/span>\r\n  <span class=\"nx\">security_group_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">rds<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_db_parameter_group\"<\/span> <span class=\"s2\">\"this\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-db-parameter-group\"<\/span>\r\n  <span class=\"nx\">family<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"aurora-mysql8.0\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_rds_cluster_parameter_group\"<\/span> <span class=\"s2\">\"this\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-db-cluster-parameter-group\"<\/span>\r\n  <span class=\"nx\">family<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"aurora-mysql8.0\"<\/span>\r\n  <span class=\"nx\">parameter<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">name<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"character_set_server\"<\/span>\r\n    <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"utf8mb4\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">parameter<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">name<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"collation_server\"<\/span>\r\n    <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"utf8mb4_bin\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">parameter<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">name<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"time_zone\"<\/span>\r\n    <span class=\"nx\">value<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"Asia\/Tokyo\"<\/span>\r\n    <span class=\"nx\">apply_method<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"immediate\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_rds_cluster\"<\/span> <span class=\"s2\">\"this\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">cluster_identifier<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">database_name<\/span>       <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">db_name<\/span>\r\n  <span class=\"nx\">master_username<\/span>     <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">db_username<\/span>\r\n  <span class=\"nx\">master_password<\/span>     <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">db_password<\/span>\r\n  <span class=\"nx\">port<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">3306<\/span>\r\n  <span class=\"nx\">apply_immediately<\/span>   <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span> <span class=\"c1\"># apply\u6642\u306b\u518d\u8d77\u52d5\u3059\u308b\u304b<\/span>\r\n  <span class=\"nx\">skip_final_snapshot<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>  <span class=\"c1\"># \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u524a\u9664\u6642\u306b\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u53d6\u308b\u304b\u3069\u3046\u304b<\/span>\r\n  <span class=\"nx\">engine<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"aurora-mysql\"<\/span>\r\n  <span class=\"nx\">engine_version<\/span>      <span class=\"p\">=<\/span> <span class=\"s2\">\"8.0.mysql_aurora.3.03.1\"<\/span>\r\n  <span class=\"nx\">vpc_security_group_ids<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">rds<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"p\">]<\/span>\r\n  <span class=\"nx\">db_subnet_group_name<\/span>            <span class=\"p\">=<\/span> <span class=\"nx\">aws_db_subnet_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">db_cluster_parameter_group_name<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_rds_cluster_parameter_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_rds_cluster_instance\"<\/span> <span class=\"s2\">\"this\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">identifier<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">cluster_identifier<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_rds_cluster<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">instance_class<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"db.t3.medium\"<\/span>\r\n  <span class=\"nx\">apply_immediately<\/span>  <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span> <span class=\"c1\"># apply\u6642\u306b\u518d\u8d77\u52d5\u3059\u308b\u304b<\/span>\r\n\r\n  <span class=\"nx\">engine<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"aurora-mysql\"<\/span>\r\n  <span class=\"nx\">engine_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"8.0.mysql_aurora.3.03.1\"<\/span>\r\n\r\n  <span class=\"nx\">db_subnet_group_name<\/span>    <span class=\"p\">=<\/span> <span class=\"nx\">aws_db_subnet_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">db_parameter_group_name<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_db_parameter_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"endpoint\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_rds_cluster<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">endpoint<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"reader_endpoint\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_rds_cluster<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">reader_endpoint<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>ECS\u4f7f\u7528tf\u6587\u4ef6\u3002<\/h3>\n<p>aws_lb_listener\u7684default_action\u662f\u5728listener_rule\u4e0d\u9002\u7528\u65f6\u6267\u884c\u7684\u6700\u540e\u663e\u793a\uff0c\u56e0\u6b64\u663e\u793a\u9ed8\u8ba4\u7684\u56fa\u5b9a\u56de\u5e94=&gt;\u7531\u4e8e\u610f\u5916\u60c5\u51b5\uff0c\u8fd4\u56de503\u9519\u8bef\u3002<\/p>\n<p>\u5728\u5220\u9664ECS\u96c6\u7fa4\u65f6\uff0c\u4f7f\u7528local-exec\u8fd0\u884cstop-tasks.sh\u7684\u76ee\u7684\u662f\u4e3a\u4e86\u5728\u5220\u9664\u96c6\u7fa4\u4e4b\u524d\uff0c\u5c06\u96c6\u7fa4\u7684\u4efb\u52a1\u6570\u91cf\u8bbe\u7f6e\u4e3a0\u3002\u5426\u5219\uff0c\u65e0\u6cd5\u5b9e\u73b0\u96c6\u7fa4\u7684\u5220\u9664\uff0c\u4f1a\u4e00\u76f4\u663e\u793a\u201caws_ecs_service.service: Still destroying&#8230;\u201d\u63d0\u793a\uff0c\u56e0\u6b64\u9700\u8981\u901a\u8fc7bash\u76f4\u63a5\u5c06\u4efb\u52a1\u6570\u91cf\u66f4\u65b0\u4e3a0\u3002<\/p>\n<p>\u8be6\u7ec6\u8d44\u6599\u8bf7\u53c2\u8003\u6b64\u95ee\u9898\uff1a\u5728Fargate\u4e0a\u9500\u6bc1aws_ecs_service.service\u65f6\u5361\u4f4f #3414<br \/>\nhttps:\/\/github.com\/hashicorp\/terraform-provider-aws\/issues\/3414<\/p>\n<p>\u4e8b\u5148\u5728GitHub Actions\u4e2d\u521b\u5efa\u4efb\u52a1\u5b9a\u4e49\u3002<\/p>\n<p>terraform\/modules\/ecs\/main.tf\u7684\u4e2d\u6587\u540c\u4e49\u8bcd\uff1aterraform\/\u6a21\u5757\/ecs\/main.tf<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"env\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"app_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"app_key\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"db_host\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"db_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"db_username\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"db_password\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"vpc_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"vpc_cidr_block\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"public_subnet_ids\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">list<\/span><span class=\"p\">(<\/span><span class=\"nx\">string<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"private_subnet_ids\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">list<\/span><span class=\"p\">(<\/span><span class=\"nx\">string<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"acm_cert_app_domain_arn\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">string<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">### ALB ####################<\/span>\r\n<span class=\"c1\">### SG<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group\"<\/span> <span class=\"s2\">\"alb\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-alb-sg\"<\/span>\r\n  <span class=\"nx\">vpc_id<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># \u30a2\u30a6\u30c8\u30d0\u30a6\u30f3\u30c9(\u5916\u306b\u51fa\u308b)\u30eb\u30fc\u30eb<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group_rule\"<\/span> <span class=\"s2\">\"alb_out_all\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">security_group_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">alb<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">type<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"egress\"<\/span>\r\n  <span class=\"nx\">from_port<\/span>         <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n  <span class=\"nx\">to_port<\/span>           <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n  <span class=\"nx\">protocol<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"-1\"<\/span>\r\n  <span class=\"nx\">cidr_blocks<\/span>       <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"0.0.0.0\/0\"<\/span><span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># \u30a4\u30f3\u30d0\u30a6\u30f3\u30c9(\u53d7\u3051\u5165\u308c\u308b)\u30eb\u30fc\u30eb<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group_rule\"<\/span> <span class=\"s2\">\"alb_in_http\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">security_group_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">alb<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">type<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"ingress\"<\/span>\r\n  <span class=\"nx\">from_port<\/span>         <span class=\"p\">=<\/span> <span class=\"mi\">80<\/span>\r\n  <span class=\"nx\">to_port<\/span>           <span class=\"p\">=<\/span> <span class=\"mi\">80<\/span>\r\n  <span class=\"nx\">protocol<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"tcp\"<\/span>\r\n  <span class=\"nx\">cidr_blocks<\/span>       <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"0.0.0.0\/0\"<\/span><span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group_rule\"<\/span> <span class=\"s2\">\"alb_in_https\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">security_group_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">alb<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">type<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"ingress\"<\/span>\r\n  <span class=\"nx\">from_port<\/span>         <span class=\"p\">=<\/span> <span class=\"mi\">443<\/span>\r\n  <span class=\"nx\">to_port<\/span>           <span class=\"p\">=<\/span> <span class=\"mi\">443<\/span>\r\n  <span class=\"nx\">protocol<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"tcp\"<\/span>\r\n  <span class=\"nx\">cidr_blocks<\/span>       <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"0.0.0.0\/0\"<\/span><span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_lb\"<\/span> <span class=\"s2\">\"this\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>               <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-lb\"<\/span>\r\n  <span class=\"nx\">load_balancer_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"application\"<\/span>\r\n  <span class=\"nx\">security_groups<\/span>    <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">alb<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">subnets<\/span>            <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_subnet_ids<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_lb_listener\"<\/span> <span class=\"s2\">\"http\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">port<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"80\"<\/span>\r\n  <span class=\"nx\">protocol<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"HTTP\"<\/span>\r\n  <span class=\"nx\">load_balancer_arn<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_lb<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n  <span class=\"nx\">default_action<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"fixed-response\"<\/span>\r\n    <span class=\"nx\">fixed_response<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">content_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"text\/plain\"<\/span>\r\n      <span class=\"nx\">message_body<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"503 Service Unavailable\"<\/span>\r\n      <span class=\"nx\">status_code<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"503\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_lb_listener\"<\/span> <span class=\"s2\">\"https\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">port<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"443\"<\/span>\r\n  <span class=\"nx\">protocol<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"HTTPS\"<\/span>\r\n  <span class=\"nx\">load_balancer_arn<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_lb<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n  <span class=\"nx\">certificate_arn<\/span>   <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">acm_cert_app_domain_arn<\/span>\r\n  <span class=\"nx\">default_action<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"fixed-response\"<\/span>\r\n    <span class=\"nx\">fixed_response<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">content_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"text\/plain\"<\/span>\r\n      <span class=\"nx\">message_body<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"503 Service Unavailable\"<\/span>\r\n      <span class=\"nx\">status_code<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"503\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_lb_listener_rule\"<\/span> <span class=\"s2\">\"http\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">listener_arn<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_lb_listener<\/span><span class=\"p\">.<\/span><span class=\"nx\">http<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n  <span class=\"nx\">action<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">type<\/span>             <span class=\"p\">=<\/span> <span class=\"s2\">\"forward\"<\/span>\r\n    <span class=\"nx\">target_group_arn<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_lb_target_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">condition<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">path_pattern<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">values<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"*\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-lb-listener-rule-http\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_lb_listener_rule\"<\/span> <span class=\"s2\">\"https\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">listener_arn<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_lb_listener<\/span><span class=\"p\">.<\/span><span class=\"nx\">https<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n  <span class=\"nx\">action<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">type<\/span>             <span class=\"p\">=<\/span> <span class=\"s2\">\"forward\"<\/span>\r\n    <span class=\"nx\">target_group_arn<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_lb_target_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">condition<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">path_pattern<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">values<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"*\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">tags<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-lb-listener-rule-https\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_lb_target_group\"<\/span> <span class=\"s2\">\"this\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-lb-target-group\"<\/span>\r\n  <span class=\"nx\">vpc_id<\/span>      <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_id<\/span>\r\n  <span class=\"nx\">port<\/span>        <span class=\"p\">=<\/span> <span class=\"mi\">80<\/span>\r\n  <span class=\"nx\">protocol<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"HTTP\"<\/span>\r\n  <span class=\"nx\">target_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ip\"<\/span>\r\n  <span class=\"nx\">health_check<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">port<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">80<\/span>\r\n    <span class=\"nx\">path<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"\/api\/health_check\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">### ECS ####################<\/span>\r\n<span class=\"c1\">## SG<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group\"<\/span> <span class=\"s2\">\"ecs\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-sg\"<\/span>\r\n  <span class=\"nx\">vpc_id<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># \u30a2\u30a6\u30c8\u30d0\u30a6\u30f3\u30c9(\u5916\u306b\u51fa\u308b)\u30eb\u30fc\u30eb<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group_rule\"<\/span> <span class=\"s2\">\"ecs_out_all\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">security_group_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">ecs<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">type<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"egress\"<\/span>\r\n  <span class=\"nx\">from_port<\/span>         <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n  <span class=\"nx\">to_port<\/span>           <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n  <span class=\"nx\">protocol<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"-1\"<\/span>\r\n  <span class=\"nx\">cidr_blocks<\/span>       <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"0.0.0.0\/0\"<\/span><span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># \u30a4\u30f3\u30d0\u30a6\u30f3\u30c9(\u53d7\u3051\u5165\u308c\u308b)\u30eb\u30fc\u30eb<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group_rule\"<\/span> <span class=\"s2\">\"ecs_in_http\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">security_group_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">ecs<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">type<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"ingress\"<\/span>\r\n  <span class=\"nx\">from_port<\/span>         <span class=\"p\">=<\/span> <span class=\"mi\">80<\/span>\r\n  <span class=\"nx\">to_port<\/span>           <span class=\"p\">=<\/span> <span class=\"mi\">80<\/span>\r\n  <span class=\"nx\">protocol<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"tcp\"<\/span>\r\n  <span class=\"nx\">cidr_blocks<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_cidr_block<\/span>\r\n  <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># ECS\u306e\u30ed\u30fc\u30eb\u306f\u30bf\u30b9\u30af\u5b9a\u7fa9\u304b\u3089\u53c2\u7167\u3055\u308c\u308b<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role\"<\/span> <span class=\"s2\">\"ecs_task_execution\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">-task-execution\"<\/span>\r\n  <span class=\"nx\">assume_role_policy<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">jsonencode<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"nx\">Version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"2012-10-17\"<\/span>\r\n    <span class=\"nx\">Statement<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">Effect<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Allow\"<\/span>\r\n        <span class=\"nx\">Action<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"sts:AssumeRole\"<\/span>\r\n        <span class=\"nx\">Principal<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"nx\">Service<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ecs-tasks.amazonaws.com\"<\/span>\r\n        <span class=\"p\">}<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">]<\/span>\r\n  <span class=\"p\">})<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy_attachment\"<\/span> <span class=\"s2\">\"ecs_task_execution\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">role<\/span>       <span class=\"p\">=<\/span> <span class=\"nx\">aws_iam_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">ecs_task_execution<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy_arn<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"arn:aws:iam::aws:policy\/service-role\/AmazonECSTaskExecutionRolePolicy\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy_attachment\"<\/span> <span class=\"s2\">\"ecs_task_execution_ssm\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">role<\/span>       <span class=\"p\">=<\/span> <span class=\"nx\">aws_iam_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">ecs_task_execution<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy_arn<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"arn:aws:iam::aws:policy\/AmazonSSMReadOnlyAccess\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># \u30bf\u30b9\u30af\u5b9a\u7fa9\u306fGithubActions\u306eCI\u304b\u3089\u4f5c\u6210\u30fb\u66f4\u65b0\u3059\u308b<\/span>\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_ecs_task_definition\"<\/span> <span class=\"s2\">\"this\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">task_definition<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_ecs_cluster\"<\/span> <span class=\"s2\">\"this\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"k\">provisioner<\/span> <span class=\"s2\">\"local-exec\"<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">when<\/span>    <span class=\"p\">=<\/span> <span class=\"nx\">destroy<\/span>\r\n    <span class=\"nx\">command<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"k\">module}<\/span><span class=\"s2\">\/scripts\/stop-tasks.sh\"<\/span>\r\n    <span class=\"nx\">environment<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">CLUSTER<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">self<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_ecs_service\"<\/span> <span class=\"s2\">\"this\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">depends_on<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"nx\">aws_lb_listener_rule<\/span><span class=\"p\">.<\/span><span class=\"nx\">http<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nx\">aws_lb_listener_rule<\/span><span class=\"p\">.<\/span><span class=\"nx\">https<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"p\">]<\/span>\r\n  <span class=\"nx\">cluster<\/span>         <span class=\"p\">=<\/span> <span class=\"nx\">aws_ecs_cluster<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">launch_type<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"FARGATE\"<\/span>\r\n  <span class=\"nx\">desired_count<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"1\"<\/span>\r\n  <span class=\"nx\">task_definition<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_ecs_task_definition<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n  <span class=\"nx\">network_configuration<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">subnets<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_subnet_ids<\/span>\r\n    <span class=\"nx\">security_groups<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">ecs<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n    <span class=\"p\">]<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">load_balancer<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">target_group_arn<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_lb_target_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n    <span class=\"nx\">container_name<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"nginx\"<\/span>\r\n    <span class=\"nx\">container_port<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"80\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">### Cloudwatch Log ####################<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_cloudwatch_log_group\"<\/span> <span class=\"s2\">\"this\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"\/<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/ecs\"<\/span>\r\n  <span class=\"nx\">retention_in_days<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">30<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\">### Parameter Store ####################<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_ssm_parameter\"<\/span> <span class=\"s2\">\"app_key\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"\/<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/APP_KEY\"<\/span>\r\n  <span class=\"nx\">type<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"SecureString\"<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_key<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_ssm_parameter\"<\/span> <span class=\"s2\">\"db_host\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"\/<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/DB_HOST\"<\/span>\r\n  <span class=\"nx\">type<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"SecureString\"<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">db_host<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_ssm_parameter\"<\/span> <span class=\"s2\">\"db_username\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"\/<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/DB_USERNAME\"<\/span>\r\n  <span class=\"nx\">type<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"SecureString\"<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">db_username<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_ssm_parameter\"<\/span> <span class=\"s2\">\"db_password\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"\/<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">app_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/DB_PASSWORD\"<\/span>\r\n  <span class=\"nx\">type<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"SecureString\"<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">db_password<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"lb_dns_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_lb<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">dns_name<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"lb_zone_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_lb<\/span><span class=\"p\">.<\/span><span class=\"nx\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">zone_id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>terraform\u6a21\u5757\/ecs\/scripts\/stop-tasks.sh<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\">#!\/bin\/bash<\/span>\r\n\r\n<span class=\"nv\">SERVICES<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"si\">$(<\/span>aws ecs list-services <span class=\"nt\">--cluster<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">CLUSTER<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> | <span class=\"nb\">grep<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">CLUSTER<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">||<\/span> <span class=\"nb\">true<\/span> | <span class=\"nb\">sed<\/span> <span class=\"nt\">-e<\/span> <span class=\"s1\">'s\/\"\/\/g'<\/span> <span class=\"nt\">-e<\/span> <span class=\"s1\">'s\/,\/\/'<\/span><span class=\"si\">)<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"k\">for <\/span>SERVICE <span class=\"k\">in<\/span> <span class=\"nv\">$SERVICES<\/span> <span class=\"p\">;<\/span> <span class=\"k\">do<\/span>\r\n  <span class=\"c\"># Idle the service that spawns tasks<\/span>\r\n  aws ecs update-service <span class=\"nt\">--cluster<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">CLUSTER<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"nt\">--service<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">SERVICE<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"nt\">--desired-count<\/span> 0\r\n\r\n  <span class=\"c\"># Stop running tasks<\/span>\r\n  <span class=\"nv\">TASKS<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"si\">$(<\/span>aws ecs list-tasks <span class=\"nt\">--cluster<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">CLUSTER<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"nt\">--service<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">SERVICE<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> | <span class=\"nb\">grep<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">CLUSTER<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">||<\/span> <span class=\"nb\">true<\/span> | <span class=\"nb\">sed<\/span> <span class=\"nt\">-e<\/span> <span class=\"s1\">'s\/\"\/\/g'<\/span> <span class=\"nt\">-e<\/span> <span class=\"s1\">'s\/,\/\/'<\/span><span class=\"si\">)<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"k\">for <\/span>TASK <span class=\"k\">in<\/span> <span class=\"nv\">$TASKS<\/span><span class=\"p\">;<\/span> <span class=\"k\">do\r\n    <\/span>aws ecs stop-task <span class=\"nt\">--task<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$TASK<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"k\">done<\/span>\r\n\r\n  <span class=\"c\"># Delete the service after it becomes inactive<\/span>\r\n  aws ecs <span class=\"nb\">wait <\/span>services-inactive <span class=\"nt\">--cluster<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">CLUSTER<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"nt\">--service<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">SERVICE<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  aws ecs delete-service <span class=\"nt\">--cluster<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">CLUSTER<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"nt\">--service<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">SERVICE<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"k\">done<\/span>\r\n\r\n<\/code><\/pre>\n<h2>GitHub Actions CI\u89e3\u6790<\/h2>\n<h3>\u901a\u8fc7ECS\u90e8\u7f72\u8fdb\u884cCI<\/h3>\n<p>\u8fd9\u4e2a\u57fa\u7840\u662f\u4e4b\u524d\u6211\u6240\u5728\u7684\u516c\u53f8\u7684\u94c3\u6728\u5148\u751f\u6240\u521b\u5efa\u7684\uff0c\u6211\u8981\u611f\u8c22\u94c3\u6728\u5148\u751f\uff01<\/p>\n<p>\u5982\u679cDockerfile\u548c\u6e90\u4ee3\u7801\uff08&#8217;ecs\/**&#8217;\u3001&#8217;web\/**&#8217;\uff09\u53d1\u751f\u66f4\u6539\uff0c\u5219\u90e8\u7f72ECS\u3002<\/p>\n<p>\u987a\u4fbf\u63d0\u4e00\u4e0b\uff0c\u7531\u4e8e\u65e0\u6cd5\u4f7f\u7528output\u6765\u4f20\u9012ECR URL\u4e4b\u95f4\u7684\u4f5c\u4e1a\uff08\u203b\u53c2\u89c1\u4e0b\u65b9\uff09\uff0c\u6240\u4ee5\u6211\u4f7f\u7528artifact\u6765\u4f20\u9012\u3002<\/p>\n<div>\u65e0\u6cd5\u5728output\u4e2d\u4f20\u9012ECR\u7684URL\uff0c\u56e0\u4e3aECR\u7684URL\u4e2d\u5305\u542b\u4e86AWS\u7684\u8d26\u6237ID\uff08\u4f8b\u5982\uff1a************.dkr.ecr.ap-northeast-1.amazonaws.com\uff09\uff0c\u800c\u8fd9\u4e9b\u4fe1\u606f\u88ab\u63a9\u76d6\u89c6\u4e3a\u673a\u5bc6\u4fe1\u606f\uff0c\u56e0\u6b64\u65e0\u6cd5\u5728output\u4e2d\u4f20\u9012\u3002\u6240\u4ee5\uff0c\u5982\u679c\u60f3\u8981\u4f7f\u7528output\uff0c\u53ef\u4ee5\u5728\u4f7f\u7528aws-actions\/configure-aws-credentials\u7684\u53c2\u6570\u4e2d\u8bbe\u7f6emask-aws-account-id: &#8216;false&#8217;\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5728\u4f5c\u4e1a\u4e4b\u95f4\u4f20\u9012output\u4e86\u3002\u4f46\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cAWS\u7684\u8d26\u6237ID\u5c06\u4e0d\u518d\u88ab\u63a9\u76d6\u3002<\/div>\n<p>.github\/workflows\/deploy_ecs_dev.yml:<br \/>\n\u8bf7\u5c06\u4ee5\u4e0b\u90e8\u5206\u4ee5\u6c49\u8bed\u8fdb\u884c\u539f\u751f\u7684\u6539\u5199\uff0c\u53ea\u9700\u8981\u4e00\u79cd\u9009\u62e9\uff1a<\/p>\n<p>.github\/workflows\/deploy_ecs_dev.yml\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy ECS to Develop<\/span>\r\n\r\n<span class=\"na\">on<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">push<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">paths<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s1\">'<\/span><span class=\"s\">ecs\/**'<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s1\">'<\/span><span class=\"s\">web\/**'<\/span>\r\n    <span class=\"na\">branches<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">develop<\/span>\r\n\r\n<span class=\"na\">env<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">APP_ENV<\/span><span class=\"pi\">:<\/span> <span class=\"s\">dev<\/span>\r\n  <span class=\"na\">AWS_ACCESS_KEY_ID<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.AWS_ACCESS_KEY_ID }}<\/span>\r\n  <span class=\"na\">AWS_SECRET_ACCESS_KEY<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.AWS_SECRET_ACCESS_KEY }}<\/span>\r\n  <span class=\"na\">AWS_REGION<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ap-northeast-1<\/span>\r\n  <span class=\"na\">ECR_PHP_REPOSITORY<\/span><span class=\"pi\">:<\/span> <span class=\"s\">y-oka-ecs\/dev\/php-fpm<\/span>\r\n  <span class=\"na\">ECR_NGINX_REPOSITORY<\/span><span class=\"pi\">:<\/span> <span class=\"s\">y-oka-ecs\/dev\/nginx<\/span>\r\n  <span class=\"na\">ECS_TASK_DEFINITION<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ecs\/dev\/task_definition\/y-oka-ecs.json<\/span>\r\n  <span class=\"na\">ECS_CLUSTER<\/span><span class=\"pi\">:<\/span> <span class=\"s\">y-oka-ecs-dev<\/span>\r\n  <span class=\"na\">ECS_SERVICE<\/span><span class=\"pi\">:<\/span> <span class=\"s\">y-oka-ecs-dev<\/span>\r\n\r\n<span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\r\n\r\n  <span class=\"c1\">#<\/span>\r\n  <span class=\"c1\"># Build PHP<\/span>\r\n  <span class=\"c1\">#<\/span>\r\n\r\n  <span class=\"na\">build-php<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">runs-on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ubuntu-latest<\/span>\r\n    <span class=\"na\">timeout-minutes<\/span><span class=\"pi\">:<\/span> <span class=\"m\">30<\/span>\r\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\r\n\r\n      <span class=\"c1\">#<\/span>\r\n      <span class=\"c1\"># Setup Application<\/span>\r\n      <span class=\"c1\">#<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Checkout Project<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/checkout@v2<\/span>\r\n\r\n      <span class=\"c1\">#<\/span>\r\n      <span class=\"c1\"># Build Image &amp; Push to ECR<\/span>\r\n      <span class=\"c1\">#<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Configure AWS Credentials<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws-actions\/configure-aws-credentials@v1<\/span> <span class=\"c1\"># https:\/\/github.com\/aws-actions\/configure-aws-credentials<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">aws-access-key-id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_ACCESS_KEY_ID }}<\/span>\r\n          <span class=\"na\">aws-secret-access-key<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_SECRET_ACCESS_KEY }}<\/span>\r\n          <span class=\"na\">aws-region<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_REGION }}<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Login to Amazon ECR<\/span>\r\n        <span class=\"na\">id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">login-ecr<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws-actions\/amazon-ecr-login@v1<\/span> <span class=\"c1\"># https:\/\/github.com\/aws-actions\/amazon-ecr-login<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Build, tag, and push image to Amazon ECR<\/span>\r\n        <span class=\"na\">id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">build-image<\/span>\r\n        <span class=\"na\">env<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">ECR_REGISTRY<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ steps.login-ecr.outputs.registry }}<\/span>\r\n          <span class=\"na\">IMAGE_TAG<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ github.sha }}<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\r\n          <span class=\"s\">docker build -t $ECR_REGISTRY\/${{ env.ECR_PHP_REPOSITORY }}:$IMAGE_TAG -f ecs\/dev\/container\/php-fpm\/Dockerfile .<\/span>\r\n          <span class=\"s\">docker push $ECR_REGISTRY\/${{ env.ECR_PHP_REPOSITORY }}:$IMAGE_TAG<\/span>\r\n\r\n          <span class=\"s\"># artifact for render task definition<\/span>\r\n          <span class=\"s\">echo $ECR_REGISTRY\/${{ env.ECR_PHP_REPOSITORY }}:$IMAGE_TAG &gt; php_image_path.txt<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/upload-artifact@v1<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">artifact_php<\/span>\r\n          <span class=\"na\">path<\/span><span class=\"pi\">:<\/span> <span class=\"s\">php_image_path.txt<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Logout of Amazon ECR<\/span>\r\n        <span class=\"na\">if<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always()<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker logout ${{ steps.login-ecr.outputs.registry }}<\/span>\r\n\r\n\r\n  <span class=\"c1\">#<\/span>\r\n  <span class=\"c1\"># Build Nginx<\/span>\r\n  <span class=\"c1\">#<\/span>\r\n\r\n  <span class=\"na\">build-nginx<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">runs-on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ubuntu-latest<\/span>\r\n    <span class=\"na\">timeout-minutes<\/span><span class=\"pi\">:<\/span> <span class=\"m\">30<\/span>\r\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Checkout Project<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/checkout@v2<\/span>\r\n\r\n      <span class=\"c1\">#<\/span>\r\n      <span class=\"c1\"># Build Image &amp; Push to ECR<\/span>\r\n      <span class=\"c1\">#<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Configure AWS Credentials<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws-actions\/configure-aws-credentials@v1<\/span> <span class=\"c1\"># https:\/\/github.com\/aws-actions\/configure-aws-credentials<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">aws-access-key-id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_ACCESS_KEY_ID }}<\/span>\r\n          <span class=\"na\">aws-secret-access-key<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_SECRET_ACCESS_KEY }}<\/span>\r\n          <span class=\"na\">aws-region<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_REGION }}<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Login to Amazon ECR<\/span>\r\n        <span class=\"na\">id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">login-ecr<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws-actions\/amazon-ecr-login@v1<\/span> <span class=\"c1\"># https:\/\/github.com\/aws-actions\/amazon-ecr-login<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Build, tag, and push image to Amazon ECR<\/span>\r\n        <span class=\"na\">id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">build-image<\/span>\r\n        <span class=\"na\">env<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">ECR_REGISTRY<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ steps.login-ecr.outputs.registry }}<\/span>\r\n          <span class=\"na\">IMAGE_TAG<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ github.sha }}<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\r\n          <span class=\"s\">docker build -t $ECR_REGISTRY\/${{ env.ECR_NGINX_REPOSITORY }}:$IMAGE_TAG -f ecs\/dev\/container\/nginx\/Dockerfile .<\/span>\r\n          <span class=\"s\">docker push $ECR_REGISTRY\/${{ env.ECR_NGINX_REPOSITORY }}:$IMAGE_TAG<\/span>\r\n\r\n          <span class=\"s\"># artifact for render task definition<\/span>\r\n          <span class=\"s\">echo $ECR_REGISTRY\/${{ env.ECR_NGINX_REPOSITORY }}:$IMAGE_TAG &gt; nginx_image_path.txt<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/upload-artifact@v1<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">artifact_nginx<\/span>\r\n          <span class=\"na\">path<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx_image_path.txt<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Logout of Amazon ECR<\/span>\r\n        <span class=\"na\">if<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always()<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker logout ${{ steps.login-ecr.outputs.registry }}<\/span>\r\n\r\n\r\n  <span class=\"c1\">#<\/span>\r\n  <span class=\"c1\"># Deploy to ECS<\/span>\r\n  <span class=\"c1\">#<\/span>\r\n\r\n  <span class=\"na\">deploy-ecs<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">needs<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"nv\">build-php<\/span><span class=\"pi\">,<\/span> <span class=\"nv\">build-nginx<\/span><span class=\"pi\">]<\/span>\r\n    <span class=\"na\">runs-on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ubuntu-latest<\/span>\r\n    <span class=\"na\">timeout-minutes<\/span><span class=\"pi\">:<\/span> <span class=\"m\">30<\/span>\r\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Checkout Project<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/checkout@v2<\/span>\r\n\r\n      <span class=\"c1\"># download artifacts<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/download-artifact@v1<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">artifact_php<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/download-artifact@v1<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">artifact_nginx<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Set Output from Artifacts<\/span>\r\n        <span class=\"na\">id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">artifact-image<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\r\n          <span class=\"s\">echo \"php-image=`cat artifact_php\/php_image_path.txt`\" &gt;&gt; \"$GITHUB_OUTPUT\"<\/span>\r\n          <span class=\"s\">echo \"nginx-image=`cat artifact_nginx\/nginx_image_path.txt`\" &gt;&gt; \"$GITHUB_OUTPUT\"<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Configure AWS Credentials<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws-actions\/configure-aws-credentials@v1<\/span> <span class=\"c1\"># https:\/\/github.com\/aws-actions\/configure-aws-credentials<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">aws-access-key-id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_ACCESS_KEY_ID }}<\/span>\r\n          <span class=\"na\">aws-secret-access-key<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_SECRET_ACCESS_KEY }}<\/span>\r\n          <span class=\"na\">aws-region<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_REGION }}<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Render TaskDefinition for php-image<\/span>\r\n        <span class=\"na\">id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">render-php-container<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws-actions\/amazon-ecs-render-task-definition@v1<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">task-definition<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.ECS_TASK_DEFINITION }}<\/span>\r\n          <span class=\"na\">container-name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">php-fpm<\/span>\r\n          <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ steps.artifact-image.outputs.php-image }}<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Render TaskDefinition for nginx-image<\/span>\r\n        <span class=\"na\">id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">render-nginx-container<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws-actions\/amazon-ecs-render-task-definition@v1<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">task-definition<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ steps.render-php-container.outputs.task-definition }}<\/span>\r\n          <span class=\"na\">container-name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx<\/span>\r\n          <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ steps.artifact-image.outputs.nginx-image }}<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy to ECS TaskDefinition<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws-actions\/amazon-ecs-deploy-task-definition@v1<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">task-definition<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ steps.render-nginx-container.outputs.task-definition }}<\/span>\r\n          <span class=\"na\">cluster<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.ECS_CLUSTER }}<\/span>\r\n          <span class=\"na\">service<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.ECS_SERVICE }}<\/span>\r\n<\/code><\/pre>\n<h3>\u6267\u884cECS\u547d\u4ee4CI<\/h3>\n<p>\u5728 GitHub Actions \u7684\u56fe\u5f62\u754c\u9762\u4e2d\u624b\u52a8\u6267\u884c\u3002<\/p>\n<p>\u5728\u6307\u4ee4\u4e2d\uff0c\u6307\u5b9a\u8981\u4f20\u9012\u7ed9\u5bb9\u5668\u7684 Docker CMD\u3002<br \/>\n\u53c2\u8003\u6587\u6863\uff1ahttps:\/\/docs.docker.jp\/engine\/reference\/builder.html#cmd<\/p>\n<p>\u5982\u679c\u8981\u8fd0\u884cSeeder\uff0c\u53ef\u4ee5\u6267\u884c&#8221;php&#8221;\uff0c&#8221;\/var\/www\/web\/laravel\/artisan&#8221;\uff0c&#8221;db:seed&#8221;\uff0c&#8221;&#8211;class=UserSeeder&#8221;\uff0c&#8221;&#8211;force&#8221;\u8fd9\u6837\u7684\u547d\u4ee4\u3002<\/p>\n<p>\u5728CI\u6267\u884c\u4e4b\u540e, \u70b9\u51fb&#8221;\u6253\u5f00\u8fd0\u884c\u4efb\u52a1URL&#8221;\uff0c\u6253\u5f00\u4efb\u52a1\u8be6\u7ec6\u4fe1\u606f\u5e76\u4ece\u65e5\u5fd7\u4e2d\u786e\u8ba4\u6267\u884c\u72b6\u6001\u3002<\/p>\n<p>.github\/workflows\/ecs_exec_cmd_dev.yml \u53ef\u4ee5\u7528\u4ee5\u4e0b\u4e2d\u6587\u7ffb\u8bd1\uff1a\u300c.github\/workflows\/ecs_exec_cmd_dev.yml\u300d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ECS Execute Command to Develop<\/span>\r\n\r\n<span class=\"na\">on<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">workflow_dispatch<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">inputs<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">command<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">description<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">execute<\/span> <span class=\"s\">command(ex:<\/span> <span class=\"s\">\"php\",\"\/var\/www\/web\/laravel\/artisan\",\"xxxx\")'<\/span>\r\n        <span class=\"na\">required<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span>\r\n\r\n<span class=\"na\">env<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">AWS_ACCESS_KEY_ID<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.AWS_ACCESS_KEY_ID }}<\/span>\r\n  <span class=\"na\">AWS_SECRET_ACCESS_KEY<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.AWS_SECRET_ACCESS_KEY }}<\/span>\r\n  <span class=\"na\">AWS_REGION<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ap-northeast-1<\/span>\r\n  <span class=\"na\">ECS_CLUSTER<\/span><span class=\"pi\">:<\/span> <span class=\"s\">y-oka-ecs-dev<\/span>\r\n  <span class=\"na\">ECS_SERVICE<\/span><span class=\"pi\">:<\/span> <span class=\"s\">y-oka-ecs-dev<\/span>\r\n  <span class=\"na\">ECS_TASK_FAMILY<\/span><span class=\"pi\">:<\/span> <span class=\"s\">y-oka-ecs-dev<\/span>\r\n\r\n<span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\r\n\r\n  <span class=\"c1\">#<\/span>\r\n  <span class=\"c1\"># ECS Execute Command<\/span>\r\n  <span class=\"c1\">#<\/span>\r\n\r\n  <span class=\"na\">ecs-execute-cmd<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">runs-on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ubuntu-latest<\/span>\r\n    <span class=\"na\">timeout-minutes<\/span><span class=\"pi\">:<\/span> <span class=\"m\">30<\/span>\r\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Configure AWS Credentials<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws-actions\/configure-aws-credentials@v1<\/span> <span class=\"c1\"># https:\/\/github.com\/aws-actions\/configure-aws-credentials<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">aws-access-key-id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_ACCESS_KEY_ID }}<\/span>\r\n          <span class=\"na\">aws-secret-access-key<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_SECRET_ACCESS_KEY }}<\/span>\r\n          <span class=\"na\">aws-region<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_REGION }}<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ECS Run Task for Exec Command<\/span>\r\n        <span class=\"na\">id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">run-task-for-exec-command<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\r\n          <span class=\"s\">network_config=$(<\/span>\r\n            <span class=\"s\">aws ecs describe-services \\<\/span>\r\n              <span class=\"s\">--cluster ${{ env.ECS_CLUSTER }} \\<\/span>\r\n              <span class=\"s\">--services ${{ env.ECS_SERVICE }} | jq '.services[0].networkConfiguration'<\/span>\r\n          <span class=\"s\">)<\/span>\r\n          <span class=\"s\">task_arn=$(<\/span>\r\n            <span class=\"s\">aws ecs run-task \\<\/span>\r\n              <span class=\"s\">--cluster ${{ env.ECS_CLUSTER }} \\<\/span>\r\n              <span class=\"s\">--launch-type \"FARGATE\" \\<\/span>\r\n              <span class=\"s\">--network-configuration \"${network_config}\"  \\<\/span>\r\n              <span class=\"s\">--overrides '{<\/span>\r\n                <span class=\"s\">\"containerOverrides\": [<\/span>\r\n                  <span class=\"s\">{<\/span>\r\n                    <span class=\"s\">\"name\": \"php-fpm\",<\/span>\r\n                    <span class=\"s\">\"command\": [${{ github.event.inputs.command }}]<\/span>\r\n                  <span class=\"s\">}<\/span>\r\n                <span class=\"s\">]<\/span>\r\n              <span class=\"s\">}' \\<\/span>\r\n              <span class=\"s\">--task-definition ${{ env.ECS_TASK_FAMILY }} | jq -r '.tasks[0].taskArn'<\/span>\r\n          <span class=\"s\">)<\/span>\r\n          <span class=\"s\">task_id=$(echo $task_arn | cut -d \"\/\" -f 3)<\/span>\r\n          <span class=\"s\">task_url=\"https:\/\/${{ env.AWS_REGION }}.console.aws.amazon.com\/ecs\/v2\/clusters\/${{ env.ECS_CLUSTER }}\/tasks\/${task_id}\/configuration\"<\/span>\r\n          <span class=\"s\">echo \"task_url=${task_url}\" &gt;&gt; \"$GITHUB_OUTPUT\"<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Open Run Task URL<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">echo ${{ steps.run-task-for-exec-command.outputs.task_url }}<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Logout of Amazon ECR<\/span>\r\n        <span class=\"na\">if<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always()<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker logout ${{ steps.login-ecr.outputs.registry }}<\/span>\r\n<\/code><\/pre>\n<h3>\u4f7f\u7528Terraform\u5b9e\u65bdCI\u90e8\u7f72\u3002<\/h3>\n<p>\u53ea\u8981terraform\u6587\u4ef6\u88ab\u66f4\u65b0\uff08&#8217;terraform\/**&#8217;\uff09\uff0c\u5219\u901a\u8fc7CI\u6765\u6267\u884cterraform apply\u3002<br \/>\n\u5982\u679c\u5728\u6267\u884c\u65f6\u9700\u8981\u66f4\u591a\u7684tfvars\u73af\u5883\u53d8\u91cf\uff0c\u4e5f\u9700\u8981\u5c06\u5b83\u4eec\u6dfb\u52a0\u5230GitHub Actions Secret\uff0c\u5e76\u66f4\u65b0\u6b64CI\u6587\u4ef6\u3002<\/p>\n<p>.github\/workflows\/deploy_terraform_dev.yml: \u5728GitHub\u4e0a\u90e8\u7f72Terraform\u5f00\u53d1\u7248\u7684\u5de5\u4f5c\u6d41\u7a0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy Terraform to Develop<\/span>\r\n\r\n<span class=\"na\">on<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">push<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">paths<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s1\">'<\/span><span class=\"s\">terraform\/**'<\/span>\r\n    <span class=\"na\">branches<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">develop<\/span>\r\n\r\n<span class=\"na\">env<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">APP_ENV<\/span><span class=\"pi\">:<\/span> <span class=\"s\">dev<\/span>\r\n  <span class=\"na\">TF_VERSION<\/span><span class=\"pi\">:<\/span> <span class=\"s\">1.4.6<\/span>\r\n  <span class=\"na\">AWS_ACCESS_KEY_ID<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.AWS_ACCESS_KEY_ID }}<\/span>\r\n  <span class=\"na\">AWS_SECRET_ACCESS_KEY<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.AWS_SECRET_ACCESS_KEY }}<\/span>\r\n  <span class=\"na\">AWS_REGION<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ap-northeast-1<\/span>\r\n  <span class=\"na\">APP_KEY<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.DEV_APP_KEY }}<\/span>\r\n  <span class=\"na\">DB_USERNAME<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.DEV_DB_USERNAME }}<\/span>\r\n  <span class=\"na\">DB_PASSWORD<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.DEV_DB_PASSWORD }}<\/span>\r\n\r\n<span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\r\n\r\n  <span class=\"c1\">#<\/span>\r\n  <span class=\"c1\"># Terraform Apply<\/span>\r\n  <span class=\"c1\">#<\/span>\r\n\r\n  <span class=\"na\">terrafom-apply<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">runs-on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ubuntu-latest<\/span>\r\n    <span class=\"na\">timeout-minutes<\/span><span class=\"pi\">:<\/span> <span class=\"m\">30<\/span>\r\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Checkout Project<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/checkout@v2<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">hashicorp\/setup-terraform@v2<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">terraform_version<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.TF_VERSION }}<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Configure AWS Credentials<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws-actions\/configure-aws-credentials@v1<\/span> <span class=\"c1\"># https:\/\/github.com\/aws-actions\/configure-aws-credentials<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">aws-access-key-id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_ACCESS_KEY_ID }}<\/span>\r\n          <span class=\"na\">aws-secret-access-key<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_SECRET_ACCESS_KEY }}<\/span>\r\n          <span class=\"na\">aws-region<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_REGION }}<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Terraform setup<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\r\n          <span class=\"s\">cp terraform\/example.tfvars terraform\/environments\/dev\/dev.tfvars<\/span>\r\n          <span class=\"s\">cd terraform\/environments\/dev\/<\/span>\r\n          <span class=\"s\">sed -ie 's|app_key=\".*\"|app_key=\"${{ env.APP_KEY }}\"|' dev.tfvars<\/span>\r\n          <span class=\"s\">sed -ie 's|db_username=\".*\"|db_username=\"${{ env.DB_USERNAME }}\"|' dev.tfvars<\/span>\r\n          <span class=\"s\">sed -ie 's|db_password=\".*\"|db_password=\"${{ env.DB_PASSWORD }}\"|' dev.tfvars<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Terraform init<\/span>\r\n        <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">terraform\/environments\/dev<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\r\n          <span class=\"s\">terraform init<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Terraform apply<\/span>\r\n        <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">terraform\/environments\/dev<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\r\n          <span class=\"s\">terraform apply -var-file=dev.tfvars -auto-approve -no-color<\/span>\r\n<\/code><\/pre>\n<h3>Terraform\u8ba1\u5212\u7684\u6301\u7eed\u96c6\u6210\u3002<\/h3>\n<p>\u5728\u5c06\u5f00\u53d1\u5206\u652f\u5408\u5e76\u5230\u4e3b\u5206\u652f\u4e4b\u524d\uff0c\u4ece\u4e3b\u9898\u5206\u652f\u624b\u52a8\u6267\u884c\u5e76\u8fdb\u884c\u786e\u8ba4\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Terraform Plan to Develop<\/span>\r\n\r\n<span class=\"na\">on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">workflow_dispatch<\/span>\r\n\r\n<span class=\"na\">env<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">APP_ENV<\/span><span class=\"pi\">:<\/span> <span class=\"s\">dev<\/span>\r\n  <span class=\"na\">TF_VERSION<\/span><span class=\"pi\">:<\/span> <span class=\"s\">1.4.6<\/span>\r\n  <span class=\"na\">AWS_ACCESS_KEY_ID<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.AWS_ACCESS_KEY_ID }}<\/span>\r\n  <span class=\"na\">AWS_SECRET_ACCESS_KEY<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.AWS_SECRET_ACCESS_KEY }}<\/span>\r\n  <span class=\"na\">AWS_REGION<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ap-northeast-1<\/span>\r\n  <span class=\"na\">APP_KEY<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.DEV_APP_KEY }}<\/span>\r\n  <span class=\"na\">DB_USERNAME<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.DEV_DB_USERNAME }}<\/span>\r\n  <span class=\"na\">DB_PASSWORD<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.DEV_DB_PASSWORD }}<\/span>\r\n\r\n<span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\r\n\r\n  <span class=\"c1\">#<\/span>\r\n  <span class=\"c1\"># Terraform Plan<\/span>\r\n  <span class=\"c1\">#<\/span>\r\n\r\n  <span class=\"na\">terrafom-plan<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">runs-on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ubuntu-latest<\/span>\r\n    <span class=\"na\">timeout-minutes<\/span><span class=\"pi\">:<\/span> <span class=\"m\">30<\/span>\r\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Checkout Project<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/checkout@v2<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">hashicorp\/setup-terraform@v2<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">terraform_version<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.TF_VERSION }}<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Configure AWS Credentials<\/span>\r\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">aws-actions\/configure-aws-credentials@v1<\/span> <span class=\"c1\"># https:\/\/github.com\/aws-actions\/configure-aws-credentials<\/span>\r\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">aws-access-key-id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_ACCESS_KEY_ID }}<\/span>\r\n          <span class=\"na\">aws-secret-access-key<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_SECRET_ACCESS_KEY }}<\/span>\r\n          <span class=\"na\">aws-region<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ env.AWS_REGION }}<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Terraform setup<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\r\n          <span class=\"s\">cp terraform\/example.tfvars terraform\/environments\/dev\/dev.tfvars<\/span>\r\n          <span class=\"s\">cd terraform\/environments\/dev<\/span>\r\n          <span class=\"s\">sed -ie 's|app_key=\".*\"|app_key=\"${{ env.APP_KEY }}\"|' dev.tfvars<\/span>\r\n          <span class=\"s\">sed -ie 's|db_username=\".*\"|db_username=\"${{ env.DB_USERNAME }}\"|' dev.tfvars<\/span>\r\n          <span class=\"s\">sed -ie 's|db_password=\".*\"|db_password=\"${{ env.DB_PASSWORD }}\"|' dev.tfvars<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Terraform init<\/span>\r\n        <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">terraform\/environments\/dev<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\r\n          <span class=\"s\">terraform init<\/span>\r\n\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Terraform plan<\/span>\r\n        <span class=\"na\">working-directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">terraform\/environments\/dev<\/span>\r\n        <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">|<\/span>\r\n          <span class=\"s\">terraform plan -var-file=dev.tfvars -no-color<\/span>\r\n<\/code><\/pre>\n<h2>\u5982\u4f55\u901a\u8fc7ECS Exec\u76f4\u63a5\u8fdb\u5165\u5bb9\u5668\u8fdb\u884c\u8c03\u8bd5\u3002<\/h2>\n<p>&nbsp;<\/p>\n<h3>\u6211\u53c2\u8003\u4e86\u4e00\u4e2a\u7f51\u7ad9\u3002<\/h3>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Terraform\u3067\u69cb\u7bc9\u3059\u308bAWS<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">ECS(Fargate)\u3067nextjs+laravel+rds\u74b0\u5883\u69cb\u7bc9<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u4ee5\u4e0b\u4e3a\u57fa\u672c\u7ec4\u6210\u7ed3\u6784\u3002 \u3042\u307e\u308a\u5909\u66f4\u304c\u5c11\u306a\u3044\u30a4\u30f3\u30d5\u30e9\u5468\u308a\u306fterraform\u304b\u3089\u66f4\u65b0 &nbsp; \u983b\u7e41\u306b\u5909\u66f4\u3055\u308c [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-49152","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u8ba9\u6211\u4eec\u4f7f\u7528Terraform\u548cGitHub Actions\u5728ECS\u4e0a\u8fd0\u884cLaravel - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u8ba9\u6211\u4eec\u4f7f\u7528terraform\u548cgithub-actions\u5728ecs\u4e0a\u8fd0\u884claravel\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u8ba9\u6211\u4eec\u4f7f\u7528Terraform\u548cGitHub Actions\u5728ECS\u4e0a\u8fd0\u884cLaravel\" \/>\n<meta property=\"og:description\" content=\"\u4ee5\u4e0b\u4e3a\u57fa\u672c\u7ec4\u6210\u7ed3\u6784\u3002 \u3042\u307e\u308a\u5909\u66f4\u304c\u5c11\u306a\u3044\u30a4\u30f3\u30d5\u30e9\u5468\u308a\u306fterraform\u304b\u3089\u66f4\u65b0 &nbsp; \u983b\u7e41\u306b\u5909\u66f4\u3055\u308c [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u8ba9\u6211\u4eec\u4f7f\u7528terraform\u548cgithub-actions\u5728ecs\u4e0a\u8fd0\u884claravel\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-05-21T02:33:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-28T14:28:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8941913a08637a6c579e\/5-0.png\" \/>\n<meta name=\"author\" content=\"\u5b87, \u534e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u5b87, \u534e\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/\",\"name\":\"\u8ba9\u6211\u4eec\u4f7f\u7528Terraform\u548cGitHub Actions\u5728ECS\u4e0a\u8fd0\u884cLaravel - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-05-21T02:33:04+00:00\",\"dateModified\":\"2024-04-28T14:28:32+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u8ba9\u6211\u4eec\u4f7f\u7528Terraform\u548cGitHub Actions\u5728ECS\u4e0a\u8fd0\u884cLaravel\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\",\"name\":\"\u5b87, \u534e\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"caption\":\"\u5b87, \u534e\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u8ba9\u6211\u4eec\u4f7f\u7528Terraform\u548cGitHub Actions\u5728ECS\u4e0a\u8fd0\u884cLaravel - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u8ba9\u6211\u4eec\u4f7f\u7528terraform\u548cgithub-actions\u5728ecs\u4e0a\u8fd0\u884claravel\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u8ba9\u6211\u4eec\u4f7f\u7528Terraform\u548cGitHub Actions\u5728ECS\u4e0a\u8fd0\u884cLaravel","og_description":"\u4ee5\u4e0b\u4e3a\u57fa\u672c\u7ec4\u6210\u7ed3\u6784\u3002 \u3042\u307e\u308a\u5909\u66f4\u304c\u5c11\u306a\u3044\u30a4\u30f3\u30d5\u30e9\u5468\u308a\u306fterraform\u304b\u3089\u66f4\u65b0 &nbsp; \u983b\u7e41\u306b\u5909\u66f4\u3055\u308c [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u8ba9\u6211\u4eec\u4f7f\u7528terraform\u548cgithub-actions\u5728ecs\u4e0a\u8fd0\u884claravel\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-05-21T02:33:04+00:00","article_modified_time":"2024-04-28T14:28:32+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8941913a08637a6c579e\/5-0.png"}],"author":"\u5b87, \u534e","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u5b87, \u534e","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"20 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/","name":"\u8ba9\u6211\u4eec\u4f7f\u7528Terraform\u548cGitHub Actions\u5728ECS\u4e0a\u8fd0\u884cLaravel - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-05-21T02:33:04+00:00","dateModified":"2024-04-28T14:28:32+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u8ba9\u6211\u4eec\u4f7f\u7528Terraform\u548cGitHub Actions\u5728ECS\u4e0a\u8fd0\u884cLaravel"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458","name":"\u5b87, \u534e","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","caption":"\u5b87, \u534e"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e8%ae%a9%e6%88%91%e4%bb%ac%e4%bd%bf%e7%94%a8terraform%e5%92%8cgithub-actions%e5%9c%a8ecs%e4%b8%8a%e8%bf%90%e8%a1%8claravel%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49152","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=49152"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49152\/revisions"}],"predecessor-version":[{"id":61706,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49152\/revisions\/61706"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=49152"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=49152"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=49152"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}