{"id":48895,"date":"2023-10-20T04:16:22","date_gmt":"2023-10-26T09:44:46","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82\/"},"modified":"2024-05-04T05:06:23","modified_gmt":"2024-05-03T21:06:23","slug":"%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82\/","title":{"rendered":"\u4f7f\u7528Terraform\u6784\u5efa\u6211\u60f3\u8c61\u4e2d\u7684\u6700\u5f3aAWS\u4e0a\u7684Springboot\u73af\u5883"},"content":{"rendered":"<p>\u203b \u6807\u9898\u6709\u70b9\u5938\u5f20<\/p>\n<h3>\u7248\u672c\u66f4\u65b0\u4fe1\u606f<\/h3>\n<p>2021\u5e746\u670823\u65e5<\/p>\n<div>\n<div class=\"post-table\">\u540d\u79f0\u66f4\u65b0\u524d\u30d0\u30fc\u30b8\u30e7\u30f3\u66f4\u65b0\u5f8c\u30d0\u30fc\u30b8\u30e7\u30f3OSMac OS 10.15.1 (Catalina)Mac OS 11.4 (Big Sur)Homebrew2.1.163.1.9tfenv1.0.22.2.1Terraform0.12.130.15.4AWS Provider2.34.03.44.0AWS CLIaws-cli\/1.16.260 Python\/3.7.5 Darwin\/19.0.0 botocore\/1.12.250aws-cli\/2.0.48 Python\/3.7.4 Darwin\/20.5.0 exe\/x86_64<\/div>\n<\/div>\n<h1>\u4e3a\u4e86\u8fbe\u5230\u7684\u7ed3\u679c\u6216\u76ee\u6807\u3002<\/h1>\n<p>\u5e0c\u671b\u5c3d\u5feb\u5c06\u4f7f\u7528Spring Boot + Gradle\u6784\u5efa\u7684Web\u5e94\u7528\u7a0b\u5e8f\u53d1\u5e03\u5230\u9a8c\u8bc1\u73af\u5883\u3002<br \/>\n\u9002\u7528\u4e8e\u4e0d\u559c\u6b22\u4f7f\u7528AWS\u7ba1\u7406\u63a7\u5236\u53f0\u8fdb\u884c\u64cd\u4f5c\u7684\u4eba\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d883b913a08637a6c2649\/6-0.png\" alt=\"terraform-aws-Page-1.png\" \/><\/div>\n<h1>\u5047\u5b9a<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u57fa\u672c\u7684\u306b\u6771\u4eac\u30ea\u30fc\u30b8\u30e7\u30f3\u3067\u306e\u4f5c\u696d<\/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\u3067\u65b0\u898fIAM\u30e6\u30fc\u30b6\u30fc\u4f5c\u6210\u304a\u3088\u3073\u6a29\u9650\u4ed8\u4e0e\u3067\u304d\u308b\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u4fdd\u6301\u3057\u3066\u3044\u308b<\/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\">\u4e0a\u8a18\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30d7\u30ed\u30b0\u30e9\u30e0(AWS CLI)\u304b\u3089\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Terraform\u3092\u89e6\u3063\u305f\u3053\u3068\u304c\u3042\u308b<\/ul>\n<h1>\u73af\u5883\u4fe1\u606f<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">OS: Mac OS 11.4 (Big Sur)<\/ul>\n<\/li>\n<\/ul>\n<p>Homebrew: 3.1.9<\/p>\n<p>AWS CLI: aws-cli\/2.0.48 Python\/3.7.4 Darwin\/20.5.0 exe\/x86_64<\/p>\n<p>tfenv: 2.2.1<\/p>\n<p>Terraform: 0.15.4<\/p>\n<h1>\u76ee\u5f55\u7ed3\u6784<\/h1>\n<p>\u5171\u540c\u4fe1\u606f\u5982VPC\u548c\u5b58\u50a8\u5e93\u5c06\u5728\u5171\u4eab\u76ee\u5f55\u4e2d\u8fdb\u884c\u7ba1\u7406\u3002<br \/>\n\u53e6\u5916\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u5de5\u4f5c\u533a\u529f\u80fd\u6765\u5207\u6362\u9a8c\u8bc1\u73af\u5883\u548c\u751f\u4ea7\u73af\u5883\u3002<br \/>\n\u56e0\u4e3a\u6211\u4eec\u91c7\u7528\u4e86\u6bcf\u4e2a\u73af\u5883\u5dee\u5f02\u8f83\u5c0f\u7684\u914d\u7f6e\uff0c\u6240\u4ee5\u4f7f\u7528\u5de5\u4f5c\u533a\uff0c\u4f46\u5982\u679c\u5dee\u5f02\u8f83\u5927\uff0c\u53ef\u80fd\u9700\u8981\u8fdb\u884c\u4e00\u90e8\u5206\u76ee\u5f55\u5206\u5272\u3002<\/p>\n<pre class=\"post-pre\"><code>tree\r\n<span class=\"nb\">.<\/span>\r\n\u251c\u2500\u2500 .terraform\/ <span class=\"c\">#\u3000\u81ea\u52d5\u751f\u6210<\/span>\r\n\u251c\u2500\u2500 certs\/ <span class=\"c\">#\u3000pem\u7b49\u8a8d\u8a3c\u60c5\u5831\uff08\u30b3\u30df\u30c3\u30c8\u3057\u306a\u3044\uff09<\/span>\r\n\u251c\u2500\u2500 shared\/ <span class=\"c\">#\u3000\u5171\u901a\u30ea\u30bd\u30fc\u30b9<\/span>\r\n\u2502       \u251c\u2500\u2500 .terraform\/ <span class=\"c\">#\u3000\u81ea\u52d5\u751f\u6210<\/span>\r\n\u2502       \u251c\u2500\u2500 .terraform.lock.hcl <span class=\"c\"># \u81ea\u52d5\u751f\u6210<\/span>\r\n\u2502       \u251c\u2500\u2500 terraform.tf <span class=\"c\"># terraform\u8a2d\u5b9a<\/span>\r\n\u2502\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u251c\u2500\u2500 \u30fb\u30fb\u30fb\u30fb\u30fb\u30fb <span class=\"c\"># \u30ea\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb<\/span>\r\n\u2502       \u2514\u2500\u2500 variables.tf <span class=\"c\"># \u5909\u6570\u5ba3\u8a00<\/span>\r\n\u251c\u2500\u2500 terraform.tfstate.d\/ <span class=\"c\">#\u3000\u81ea\u52d5\u751f\u6210<\/span>\r\n\u251c\u2500\u2500 .terraform.lock.hcl <span class=\"c\"># \u81ea\u52d5\u751f\u6210<\/span>\r\n\u251c\u2500\u2500 terraform.tf <span class=\"c\"># terraform\u8a2d\u5b9a<\/span>\r\n\u251c\u2500\u2500 \u30fb\u30fb\u30fb\u30fb\u30fb\u30fb <span class=\"c\"># \u30ea\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb<\/span>\r\n\u251c\u2500\u2500 terraform.tfvars <span class=\"c\"># \u5909\u6570\u8a2d\u5b9a<\/span>\r\n\u2514\u2500\u2500 variables.tf <span class=\"c\"># \u5909\u6570\u5ba3\u8a00<\/span>\r\n<\/code><\/pre>\n<h1>\u9884\u5148\u51c6\u5907<\/h1>\n<h2>AWS\u547d\u4ee4\u884c\u754c\u9762<\/h2>\n<h3>\u5b89\u88c5<\/h3>\n<p>&nbsp;<\/p>\n<h3>\u521b\u5efaTerraform\u7528\u6237<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws iam create-user <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--user-name<\/span> terraform-sample\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"User\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"Path\"<\/span>: <span class=\"s2\">\"\/\"<\/span>,\r\n        <span class=\"s2\">\"UserName\"<\/span>: <span class=\"s2\">\"terraform-sample\"<\/span>,\r\n        <span class=\"s2\">\"UserId\"<\/span>: <span class=\"s2\">\"XXXXXXXXXXXXXXXXXXXX\"<\/span>,\r\n        <span class=\"s2\">\"Arn\"<\/span>: <span class=\"s2\">\"arn:aws:iam::XXXXXXXXXXXX:user\/terraform-sample\"<\/span>,\r\n        <span class=\"s2\">\"CreateDate\"<\/span>: <span class=\"s2\">\"YYYY-MM-DDTHH:mm:ssZ\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u6388\u4e88\u6743\u529b<\/h3>\n<p>\u8bf7\u6388\u4e88\u7ba1\u7406\u5458\u6743\u9650\u3002\u6839\u636e\u73af\u5883\u7684\u9700\u8981\u9002\u5f53\u8fdb\u884c\u6743\u9650\u66f4\u6539\u3002<br \/>\n\u7136\u800c\uff0c\u7531\u4e8e\u6240\u9700\u6743\u9650\u6db5\u76d6\u8303\u56f4\u5e7f\u6cdb\uff0c\u56e0\u6b64\u6700\u597d\u5728\u521b\u5efa\u65f6\u4ec5\u6388\u4e88AdministratorAccess\uff0c\u5e76\u5728\u5b8c\u6210\u5de5\u4f5c\u540e\u89e3\u9664\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws iam attach-user-policy <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--user-name<\/span> terraform-sample <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--policy-arn<\/span> arn:aws:iam::aws:policy\/AdministratorAccess\r\n<\/code><\/pre>\n<h3>\u521b\u5efa\u548c\u4fdd\u5b58\u8ba4\u8bc1\u4fe1\u606f<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws iam create-access-key <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--user-name<\/span> terraform-sample\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"AccessKey\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"UserName\"<\/span>: <span class=\"s2\">\"terraform-sample\"<\/span>,\r\n        <span class=\"s2\">\"AccessKeyId\"<\/span>: <span class=\"s2\">\"AAAAAAAAAAAAAAAAAAA\"<\/span>,\r\n        <span class=\"s2\">\"Status\"<\/span>: <span class=\"s2\">\"Active\"<\/span>,\r\n        <span class=\"s2\">\"SecretAccessKey\"<\/span>: <span class=\"s2\">\"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\"<\/span>,\r\n        <span class=\"s2\">\"CreateDate\"<\/span>: <span class=\"s2\">\"YYYY-MM-DDTHH:mm:ssZ\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">cat<\/span> - <span class=\"o\">&lt;&lt;<\/span> <span class=\"no\">EOS<\/span><span class=\"sh\"> &gt;&gt; ~\/.aws\/credentials\r\n# \u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u540d\r\n[terraform-sample]\r\nregion = ap-northeast-1 # \u6771\u4eac\u30ea\u30fc\u30b8\u30e7\u30f3\r\naws_access_key_id = AAAAAAAAAAAAAAAAAAA\r\naws_secret_access_key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\r\n<\/span><span class=\"no\">EOS\r\n<\/span><\/code><\/pre>\n<h2>\u4f7f\u7528Terraform\u521b\u5efa\u975e\u7ba1\u7406\u8d44\u6e90<\/h2>\n<p>\u4f7f\u7528AWS CLI\u521b\u5efa\u5b58\u50a8\u5e94\u7528\u7a0b\u5e8f\/\u9759\u6001\u5185\u5bb9\u7684CodeCommit\u5b58\u50a8\u5e93\u548c\u4fdd\u5b58Terraform\u72b6\u6001\u7684S3\u5b58\u50a8\u6876\uff0c\u4ee5\u9632\u6b62\u5176\u5728\u6267\u884cterraform destroy\u7b49\u64cd\u4f5c\u65f6\u88ab\u5220\u9664\u3002<\/p>\n<h3>Terraform\u4f7f\u7528S3\u5b58\u50a8\u6876\u3002<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d883b913a08637a6c2649\/28-0.png\" alt=\"terraform-aws-Terraform\u7528S3\u30d0\u30b1\u30c3\u30c8.png\" \/><\/div>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws s3api create-bucket <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--bucket<\/span> terraform-sample-tfstate <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--acl<\/span> private <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--region<\/span> ap-northeast-1 <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--create-bucket-configuration<\/span> <span class=\"nv\">LocationConstraint<\/span><span class=\"o\">=<\/span>ap-northeast-1 <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"Location\"<\/span>: <span class=\"s2\">\"http:\/\/terraform-sample-tfstate.s3.amazonaws.com\/\"<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h4>\u542f\u7528\u7248\u672c\u63a7\u5236<\/h4>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws s3api put-bucket-versioning <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--bucket<\/span> terraform-sample-tfstate <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--versioning-configuration<\/span> <span class=\"nv\">Status<\/span><span class=\"o\">=<\/span>Enabled <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"nv\">$ <\/span>aws s3api get-bucket-versioning <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--bucket<\/span> terraform-sample-tfstate <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"Status\"<\/span>: <span class=\"s2\">\"Enabled\"<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h4>\u6876\u7684\u52a0\u5bc6<\/h4>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws s3api put-bucket-encryption <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--bucket<\/span> terraform-sample-tfstate <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--server-side-encryption-configuration<\/span> <span class=\"s1\">'{\"Rules\": [{\"ApplyServerSideEncryptionByDefault\": {\"SSEAlgorithm\": \"AES256\"}}]}'<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"nv\">$ <\/span>aws s3api get-bucket-encryption <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--bucket<\/span> terraform-sample-tfstate <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"ServerSideEncryptionConfiguration\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"Rules\"<\/span>: <span class=\"o\">[<\/span>\r\n            <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"ApplyServerSideEncryptionByDefault\"<\/span>: <span class=\"o\">{<\/span>\r\n                    <span class=\"s2\">\"SSEAlgorithm\"<\/span>: <span class=\"s2\">\"AES256\"<\/span>\r\n                <span class=\"o\">}<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">]<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h2>Terraform\u914d\u7f6e<\/h2>\n<h3>\u5b89\u88c5tfenv<\/h3>\n<p>\u7531\u65bc\u7d93\u5e38\u56f0\u64fe\u65bcTerraform\u7248\u672c\u554f\u984c\uff0c\u6545\u9078\u64c7\u4f7f\u7528\u540d\u70ba&#8221;tfenv&#8221;\u7684\u5de5\u5177\u4f86\u9032\u884c\u7248\u672c\u7ba1\u7406\u3002\u5728Qiita\u4e0a\u6709\u4e00\u7bc7\u6587\u7ae0\u4ecb\u7d39\u5982\u4f55\u4f7f\u7528tfenv\u9032\u884cTerraform\u7248\u672c\u7ba1\u7406\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>brew <span class=\"nb\">install <\/span>tfenv\r\n<span class=\"nv\">$ <\/span>which tfenv\r\n\/usr\/local\/bin\/tfenv\r\n<span class=\"nv\">$ <\/span>tfenv <span class=\"nt\">--version<\/span>\r\ntfenv 2.2.1\r\n<\/code><\/pre>\n<h3>\u5b89\u88c5\/\u4f7f\u7528\u6700\u65b0\u7248\u7684Terraform\u3002<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>tfenv <span class=\"nb\">install <\/span>latest\r\n<span class=\"nv\">$ <\/span>tfenv use latest\r\n<span class=\"o\">[<\/span>INFO] Switching to v0.15.4\r\n<span class=\"o\">[<\/span>INFO] Switching completed\r\n<\/code><\/pre>\n<h3>\u5bf9Terraform\u8fdb\u884c\u521d\u59cb\u5316<\/h3>\n<h4>\u63cf\u8ff0\u57fa\u672c\u4fe1\u606f<\/h4>\n<p>\u60a8\u53ef\u4ee5\u5728\u4ee5\u4e0b\u9875\u9762\u4e2d\u786e\u8ba4\u6700\u65b0\u7248\u672c\u7684AWS\u63d0\u4f9b\u8005\uff1a<br \/>\nTerraform AWS Provider CHANGELOG &#8211; GitHub<br \/>\n\u672c\u6b21\u4f7f\u7528\u7684\u662f\u6700\u65b0\u7248\u672c3.44.0\uff0c\u6b64\u4e3a\u64b0\u5199\u65f6\u7684\u7248\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/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; 3.44.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\">\"terraform-sample-tfstate\"<\/span> <span class=\"c1\"># \u4e0a\u8a18\u4f5c\u6210\u3057\u305fTerraform\u7528S3\u30d0\u30b1\u30c3\u30c8\u540d<\/span>\r\n    <span class=\"nx\">region<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span> <span class=\"c1\"># \u4f5c\u696d\u5bfe\u8c61\u306e\u30ea\u30fc\u30b8\u30e7\u30f3\u60c5\u5831<\/span>\r\n    <span class=\"nx\">profile<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-sample\"<\/span> <span class=\"c1\"># ~\/.aws\/credentials\u306b\u4fdd\u5b58\u3057\u305f\u8a8d\u8a3c\u60c5\u5831\u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u540d<\/span>\r\n    <span class=\"nx\">key<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform.tfstate\"<\/span> <span class=\"c1\"># tfstate\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9<\/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\">shared_credentials_file<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"\/Users\/exotic-toybox\/.aws\/credentials\"<\/span><span class=\"err\">\u3000<\/span><span class=\"c1\"># ~\/.aws\/credentials<\/span>\r\n  <span class=\"nx\">profile<\/span>                 <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-sample\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5c06\u5176\u590d\u5236\u5230\u5171\u4eab\u76ee\u5f55\u7684\u5b50\u76ee\u5f55\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">cp <\/span>terraform.tf shared\/\r\n<\/code><\/pre>\n<p>\u53ea\u9700\u8981\u66f4\u6539tfstate\u6587\u4ef6\u7684\u8def\u5f84\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"n\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"n\">required_providers<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"n\">backend<\/span> <span class=\"s2\">\"s3\"<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"hdl\"><span class=\"o\">- <\/span>  <span class=\"n\">key<\/span>     <span class=\"o\">=<\/span> <span class=\"s2\">\"terraform.tfstate\"<\/span> <span class=\"c1\"># tfstate\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>  <span class=\"n\">key<\/span>     <span class=\"o\">=<\/span> <span class=\"s2\">\"shared\/terraform.tfstate\"<\/span> <span class=\"c1\"># tfstate\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9<\/span>\r\n<\/span>  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<\/code><\/pre>\n<h4>\u6267\u884c\u521d\u59cb\u5316\u6307\u4ee4<\/h4>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform init\r\n\r\nInitializing the backend...\r\n\r\nSuccessfully configured the backend <span class=\"s2\">\"s3\"<\/span><span class=\"o\">!<\/span> Terraform will automatically\r\nuse this backend unless the backend configuration changes.\r\n\r\nInitializing provider plugins...\r\n- Checking <span class=\"k\">for <\/span>available provider plugins...\r\n- Downloading plugin <span class=\"k\">for <\/span>provider <span class=\"s2\">\"aws\"<\/span> <span class=\"o\">(<\/span>hashicorp\/aws<span class=\"o\">)<\/span> 3.44.0...\r\n\r\nTerraform has been successfully initialized!\r\n\r\nYou may now begin working with Terraform. Try running <span class=\"s2\">\"terraform plan\"<\/span> to see\r\nany changes that are required <span class=\"k\">for <\/span>your infrastructure. All Terraform commands\r\nshould now work.\r\n\r\nIf you ever <span class=\"nb\">set <\/span>or change modules or backend configuration <span class=\"k\">for <\/span>Terraform,\r\nrerun this <span class=\"nb\">command <\/span>to reinitialize your working directory. If you forget, other\r\ncommands will detect it and remind you to <span class=\"k\">do <\/span>so <span class=\"k\">if <\/span>necessary.\r\n<\/code><\/pre>\n<p>\u5982\u679c\u663e\u793a\u201cTerraform \u5df2\u6210\u529f\u521d\u59cb\u5316\uff01\u201d\u90a3\u5c31\u8868\u793a\u6210\u529f\u3002<br \/>\n\u8bf7\u540c\u6837\u5728 shared \u76ee\u5f55\u4e0b\u6267\u884c\u3002<\/p>\n<h5>\u5173\u4e8e\u53d8\u91cf\u7684\u4f7f\u7528<\/h5>\n<p>\u5728provider\u6216terraform\u5757\u4e2d\u65e0\u6cd5\u5904\u7406\u53d8\u91cf\u3002<br \/>\n\u4ee5\u4e0b\u63cf\u8ff0\u5c06\u5bfc\u81f4\u9519\u8bef\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"region\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_s3_bucket\"<\/span> <span class=\"s2\">\"tfstate\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">bucket<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-sample-tfstate\"<\/span>\r\n  <span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"c1\">#-- \u4e2d\u7565 --#<\/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=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">tfstate<\/span><span class=\"p\">.<\/span><span class=\"nx\">bucket<\/span> <span class=\"c1\"># \u3053\u308c\u3068\u304b<\/span>\r\n    <span class=\"nx\">region<\/span>  <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">region<\/span> <span class=\"c1\"># \u3053\u308c\u3082<\/span>\r\n    <span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>terraform init\r\nInitializing the backend...\r\nError: Variables not allowed\r\n  on terraform.tf line 18, <span class=\"k\">in <\/span>terraform:\r\n  18:     bucket  <span class=\"o\">=<\/span> aws_s3_bucket.tfstate.bucket\r\n  on terraform.tf line 19, <span class=\"k\">in <\/span>terraform:\r\n  19:     region  <span class=\"o\">=<\/span> var.region\r\nVariables may not be used here.\r\n<\/code><\/pre>\n<h3>\u52a0\u8f7d\u6a21\u5757<\/h3>\n<p>\u52a0\u8f7d\u5171\u4eab\u76ee\u5f55\u4e0b\u7684\u8d44\u6e90\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">data<\/span> <span class=\"nx\">terraform_remote_state<\/span> <span class=\"nx\">shared<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">backend<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"s3\"<\/span>\r\n \r\n  <span class=\"nx\">config<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">bucket<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-sample-tfstate\"<\/span>\r\n    <span class=\"nx\">key<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"shared\/terraform.tfstate\"<\/span>\r\n    <span class=\"nx\">region<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span>\r\n    <span class=\"nx\">profile<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-sample\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span><span class=\"err\">```<\/span>\r\n\r\n\r\n<span class=\"c1\"># \u691c\u8a3c(Stage)\u74b0\u5883\u69cb\u7bc9<\/span>\r\n<span class=\"err\">```<\/span><span class=\"nx\">tf<\/span><span class=\"err\">:<\/span><span class=\"k\">terraform<\/span><span class=\"err\">.<\/span><span class=\"nx\">tfvars<\/span><span class=\"err\">(\u65b0\u898f\u4f5c\u6210)<\/span>\r\n<span class=\"nx\">app_name<\/span> <span class=\"err\">=<\/span> <span class=\"s2\">\"terraform-sample\"<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"nx\">app_name<\/span> <span class=\"p\">{}<\/span>\r\n<\/code><\/pre>\n<p>\u8bf7\u5728shared\/variables.tf\u6587\u4ef6\u4e2d\u8fdb\u884c\u76f8\u540c\u7684\u8bb0\u5f55\u3002<br \/>\n\u4ece\u6b64\u4ee5\u540e\uff0c\u4e00\u65e6\u5411terraform.tfvars\u6587\u4ef6\u4e2d\u6dfb\u52a0\u4e86\u53d8\u91cf\uff0c\u8bf7\u5728variables.tf\u548cshared\/variables.tf\u4e2d\u58f0\u660e\u8be5\u53d8\u91cf\u3002<\/p>\n<p>\u4f7f\u7528Terraform\u7ba1\u7406\u4ee5\u5916\u7684CodeCommit\u5b58\u50a8\u5e93\u3002<\/p>\n<p>Note: The given phrase seems to be a mix of Japanese and English, so the translation might not be a direct equivalent.<\/p>\n<h3>\u7528\u4e8e\u9759\u6001\u5185\u5bb9\u7684CodeCommit\u5b58\u50a8\u5e93<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d883b913a08637a6c2649\/62-0.png\" alt=\"static-content (1).png\" \/><\/div>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws codecommit create-repository <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--repository-name<\/span> terraform-sample-static-contents <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--repository-description<\/span> <span class=\"s2\">\"static contents repository\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"repositoryMetadata\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"accountId\"<\/span>: <span class=\"s2\">\"XXXXXXXXXXXX\"<\/span>,\r\n        <span class=\"s2\">\"repositoryId\"<\/span>: <span class=\"s2\">\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"<\/span>,\r\n        <span class=\"s2\">\"repositoryName\"<\/span>: <span class=\"s2\">\"terraform-sample-static-contents\"<\/span>,\r\n        <span class=\"s2\">\"repositoryDescription\"<\/span>: <span class=\"s2\">\"static contents repository\"<\/span>,\r\n        <span class=\"s2\">\"lastModifiedDate\"<\/span>: XXXXXXXXXX.XX,\r\n        <span class=\"s2\">\"creationDate\"<\/span>: XXXXXXXXXX.XX,\r\n        <span class=\"s2\">\"cloneUrlHttp\"<\/span>: <span class=\"s2\">\"https:\/\/git-codecommit.ap-northeast-1.amazonaws.com\/v1\/repos\/terraform-sample-static-contents\"<\/span>,\r\n        <span class=\"s2\">\"cloneUrlSsh\"<\/span>: <span class=\"s2\">\"ssh:\/\/git-codecommit.ap-northeast-1.amazonaws.com\/v1\/repos\/terraform-sample-static-contents\"<\/span>,\r\n        <span class=\"s2\">\"Arn\"<\/span>: <span class=\"s2\">\"arn:aws:codecommit:ap-northeast-1:XXXXXXXXXXXX:terraform-sample-static-contents\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h4>\u4f7f\u7528Terraform\u8fdb\u884c\u53d8\u91cf\u5316\u3002<\/h4>\n<pre class=\"post-pre\"><code><span class=\"k\">data<\/span> <span class=\"nx\">aws_codecommit_repository<\/span> <span class=\"nx\">static_contents<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">repository_name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-sample-static-contents\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"nx\">codecommit_repository_static_contents<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_codecommit_repository<\/span><span class=\"p\">.<\/span><span class=\"nx\">static_contents<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h4>\u5185\u90e8\u5185\u5bb9<\/h4>\n<p>\u5c06\u9759\u6001\u5185\u5bb9\uff0c\u5982index.html\u7b49\u6587\u4ef6\u8fdb\u884c\u914d\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code>tree\r\n<span class=\"nb\">.<\/span>\r\n\u251c\u2500\u2500 error.html\r\n\u251c\u2500\u2500 favicon.png\r\n\u2514\u2500\u2500 index.html\r\n<\/code><\/pre>\n<p>\u6211\u5011\u5148\u5275\u5efa\u4e00\u500bstage\u5206\u652f\u3002<\/p>\n<h3>\u5e94\u7528\u7a0b\u5e8f\u7528\u7684CodeCommit\u4ed3\u5e93<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d883b913a08637a6c2649\/71-0.png\" alt=\"application.png\" \/><\/div>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws codecommit create-repository <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--repository-name<\/span> terraform-sample-application-sources <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--repository-description<\/span> <span class=\"s2\">\"application sources repository\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"repositoryMetadata\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"accountId\"<\/span>: <span class=\"s2\">\"XXXXXXXXXXXX\"<\/span>,\r\n        <span class=\"s2\">\"repositoryId\"<\/span>: <span class=\"s2\">\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"<\/span>,\r\n        <span class=\"s2\">\"repositoryName\"<\/span>: <span class=\"s2\">\"terraform-sample-application-sources\"<\/span>,\r\n        <span class=\"s2\">\"repositoryDescription\"<\/span>: <span class=\"s2\">\"application sources repository\"<\/span>,\r\n        <span class=\"s2\">\"lastModifiedDate\"<\/span>: XXXXXXXXXX.XX,\r\n        <span class=\"s2\">\"creationDate\"<\/span>: XXXXXXXXXX.XX,\r\n        <span class=\"s2\">\"cloneUrlHttp\"<\/span>: <span class=\"s2\">\"https:\/\/git-codecommit.ap-northeast-1.amazonaws.com\/v1\/repos\/terraform-sample-application-sources\"<\/span>,\r\n        <span class=\"s2\">\"cloneUrlSsh\"<\/span>: <span class=\"s2\">\"ssh:\/\/git-codecommit.ap-northeast-1.amazonaws.com\/v1\/repos\/terraform-sample-application-sources\"<\/span>,\r\n        <span class=\"s2\">\"Arn\"<\/span>: <span class=\"s2\">\"arn:aws:codecommit:ap-northeast-1:XXXXXXXXXXXX:terraform-sample-application-sources\"<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h4>\u4f7f\u7528Terraform\u8fdb\u884c\u53d8\u91cf\u5316\u3002<\/h4>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">data<\/span> <span class=\"nx\">aws_codecommit_repository<\/span> <span class=\"nx\">application_sources<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">repository_name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-sample-application-sources\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"nx\">codecommit_repository_application_sources<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_codecommit_repository<\/span><span class=\"p\">.<\/span><span class=\"nx\">application_sources<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h4>Inner content<\/h4>\n<p>\u5c06\u5e26\u6709@SpringBootApplication\u6ce8\u89e3\u7684\u4e3b\u7c7b\u5206\u522b\u653e\u7f6e\u5728admin\u548cuser\u4e24\u4e2aGradle\u9879\u76ee\u5185\u3002<\/p>\n<pre class=\"post-pre\"><code>tree\r\n<span class=\"nb\">.<\/span>\r\n\u251c\u2500\u2500 admin\r\n\u2502   \u251c\u2500\u2500 bin\r\n\u2502   \u251c\u2500\u2500 build\r\n\u2502   \u251c\u2500\u2500 build.gradle\r\n\u2502   \u2514\u2500\u2500 src\r\n\u2502       \u251c\u2500\u2500 main\r\n\u2502       \u2502   \u251c\u2500\u2500 java\r\n\u2502       \u2502   \u2502   \u2514\u2500\u2500 com\r\n\u2502       \u2502   \u2502       \u2514\u2500\u2500 example\r\n\u2502       \u2502   \u2502           \u2514\u2500\u2500 admin\r\n\u2502       \u2502   \u2502               \u2514\u2500\u2500 AdminApplication.java\r\n\u2502       \u2502   \u2514\u2500\u2500 resources\r\n\u2502       \u2502       \u2514\u2500\u2500 application.yaml\r\n\u2502       \u2514\u2500\u2500 <span class=\"nb\">test<\/span>\r\n\u2502           \u251c\u2500\u2500 java\r\n\u2502           \u2514\u2500\u2500 resources\r\n\u251c\u2500\u2500 appspec.yml\r\n\u251c\u2500\u2500 build.gradle\r\n\u251c\u2500\u2500 buildspec_admin.yml\r\n\u251c\u2500\u2500 buildspec_user.yml\r\n\u251c\u2500\u2500 data\r\n\u2502   \u2514\u2500\u2500 script\r\n\u2502       \u251c\u2500\u2500 after_install.sh\r\n\u2502       \u251c\u2500\u2500 application_start.sh\r\n\u2502       \u251c\u2500\u2500 application_stop.sh\r\n\u2502       \u2514\u2500\u2500 before_install.sh\r\n\u251c\u2500\u2500 gradle\r\n\u2502   \u2514\u2500\u2500 wrapper\r\n\u2502       \u251c\u2500\u2500 gradle-wrapper.jar\r\n\u2502       \u2514\u2500\u2500 gradle-wrapper.properties\r\n\u251c\u2500\u2500 gradlew\r\n\u251c\u2500\u2500 gradlew.bat\r\n\u251c\u2500\u2500 settings.gradle\r\n\u2514\u2500\u2500 user\r\n    \u251c\u2500\u2500 bin\r\n    \u251c\u2500\u2500 build\r\n    \u251c\u2500\u2500 build.gradle\r\n    \u2514\u2500\u2500 src\r\n        \u251c\u2500\u2500 main\r\n        \u2502   \u251c\u2500\u2500 java\r\n        \u2502   \u2502   \u2514\u2500\u2500 com\r\n        \u2502   \u2502       \u2514\u2500\u2500 example\r\n        \u2502   \u2502           \u2514\u2500\u2500 user\r\n        \u2502   \u2502               \u2514\u2500\u2500 UserApplication.java\r\n        \u2502   \u2514\u2500\u2500 resources\r\n        \u2502       \u2514\u2500\u2500 application.yaml\r\n        \u2514\u2500\u2500 <span class=\"nb\">test<\/span>\r\n            \u2514\u2500\u2500 resources\r\n<\/code><\/pre>\n<p>\u521b\u5efa\u4e00\u4e2a\u540d\u4e3astage\u7684\u5206\u652f\u3002<\/p>\n<p>\u5047\u8bbe\u5728\u521b\u5efa\u548c\u66f4\u65b0.tf\u6587\u4ef6\u65f6\uff0c\u6267\u884c&#8221;terraform apply&#8221;\u547d\u4ee4\u3002\u6b64\u5916\uff0c\u5728shared\u76ee\u5f55\u4e0b\u521b\u5efa.tf\u6587\u4ef6\u65f6\uff0c\u6267\u884c&#8221;shared$ terraform apply -var-file=..\/terraform.tfvars&#8221;\u547d\u4ee4\u3002<\/p>\n<h2>\u81ea\u52a8\u90e8\u7f72\u9759\u6001\u5185\u5bb9<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d883b913a08637a6c2649\/81-0.png\" alt=\"terraform-aws-\u9759\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u81ea\u52d5\u30c7\u30d7\u30ed\u30a4.png\" \/><\/div>\n<h3>\u90e8\u7f72\u76ee\u6807\u7684S3\u5b58\u50a8\u6876<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d883b913a08637a6c2649\/83-0.png\" alt=\"terraform-aws-\u9759\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u81ea\u52d5\u30c7\u30d7\u30ed\u30a4-\u30c7\u30d7\u30ed\u30a4\u5148\u306eS3\u30d0\u30b1\u30c3\u30c8.png\" \/><\/div>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_s3_bucket\"<\/span> <span class=\"s2\">\"static_contents\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">bucket<\/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\">-static-contents-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">acl<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"private\"<\/span>\r\n\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\">-static-contents-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/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_iam_policy_document\"<\/span> <span class=\"s2\">\"s3_static_contents\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"s3:GetObject\"<\/span><span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">resources<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/*\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u5b58\u50a8CodePipeline\u7684\u6784\u4ef6\u7684S3\u5b58\u50a8\u6876<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d883b913a08637a6c2649\/86-0.png\" alt=\"terraform-aws-\u9759\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u81ea\u52d5\u30c7\u30d7\u30ed\u30a4-CodePipeline\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u683c\u7d0d\u3059\u308bS3\u30d0\u30b1\u30c3\u30c8.png\" \/><\/div>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"nx\">aws_s3_bucket<\/span> <span class=\"nx\">codepipeline_static_contents<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">bucket<\/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\">-codepipeline-static-contents-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">acl<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"private\"<\/span>\r\n\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\">-codepipeline-static-contents-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">data<\/span> <span class=\"nx\">aws_iam_policy_document<\/span> <span class=\"nx\">s3_codepipeline_static_contents<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"s3:GetObject\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"s3:GetObjectVersion\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"s3:GetBucketVersioning\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"s3:PutObject\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">resources<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/*\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u7528\u4e8eS3\u6570\u636e\u52a0\u5bc6\u7684\u5bc6\u94a5\u7ba1\u7406\u670d\u52a1 (KMS)<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d883b913a08637a6c2649\/89-0.png\" alt=\"terraform-aws-\u9759\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u81ea\u52d5\u30c7\u30d7\u30ed\u30a4-S3\u6697\u53f7\u5316\u7528kms.png\" \/><\/div>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"nx\">aws_kms_key<\/span> <span class=\"nx\">kms<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"nx\">aws_kms_alias<\/span> <span class=\"nx\">kms<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"alias\/<\/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>\r\n  <span class=\"nx\">target_key_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_kms_key<\/span><span class=\"p\">.<\/span><span class=\"nx\">kms<\/span><span class=\"p\">.<\/span><span class=\"nx\">key_id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"nx\">kms_alias_arn<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_kms_alias<\/span><span class=\"p\">.<\/span><span class=\"nx\">kms<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">data<\/span> <span class=\"nx\">aws_iam_policy_document<\/span> <span class=\"nx\">kms<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"kms:*\"<\/span><span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">resources<\/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\r\n<span class=\"k\">output<\/span> <span class=\"nx\">kms_policy_json<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">kms<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u5efa\u7acb\u653f\u7b56<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">data<\/span> <span class=\"nx\">aws_iam_policy_document<\/span> <span class=\"nx\">codepipeline_assume_role<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"sts:AssumeRole\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">principals<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">identifiers<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n        <span class=\"s2\">\"codepipeline.amazonaws.com\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"s2\">\"events.amazonaws.com\"<\/span>\r\n      <span class=\"p\">]<\/span>\r\n      <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Service\"<\/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\">output<\/span> <span class=\"nx\">codepipeline_assume_role_policy_json<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_assume_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">data<\/span> <span class=\"nx\">aws_iam_policy_document<\/span> <span class=\"nx\">codecommit_static_contents<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"codecommit:GitPull\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codecommit:GetBranch\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codecommit:GetCommit\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codecommit:UploadArchive\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codecommit:GetUploadArchiveStatus\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">resources<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_codecommit_repository<\/span><span class=\"p\">.<\/span><span class=\"nx\">static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"<\/span><span class=\"k\">${data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_codecommit_repository<\/span><span class=\"p\">.<\/span><span class=\"nx\">static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/*\"<\/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\">output<\/span> <span class=\"nx\">codecommit_static_contents_policy_json<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codecommit_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u4ee3\u7801\u7ba1\u9053<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d883b913a08637a6c2649\/96-0.png\" alt=\"terraform-aws-\u9759\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u81ea\u52d5\u30c7\u30d7\u30ed\u30a4-CodePipeline.png\" \/><\/div>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"nx\">aws_iam_role<\/span> <span class=\"nx\">codepipeline_static_contents<\/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\">-codepipeline-static-contents-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">assume_role_policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">terraform_remote_state<\/span><span class=\"p\">.<\/span><span class=\"nx\">shared<\/span><span class=\"p\">.<\/span><span class=\"nx\">outputs<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_assume_role_policy_json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># CodeCommit\u304b\u3089\u30bd\u30fc\u30b9\u53d6\u5f97\u3092\u8a31\u53ef<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"nx\">aws_iam_role_policy<\/span> <span class=\"nx\">codecommit_codepipeline_static_contents<\/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\">codepipeline_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codecommit_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># CodePipeline\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u7528S3\u3092\u8a31\u53ef<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"nx\">aws_iam_role_policy<\/span> <span class=\"nx\">s3_codepipeline_static_contents<\/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\">codepipeline_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">s3_codepipeline_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># CodePipeline\u3067\u4f7f\u7528\u3059\u308bS3\u7528kms\u3092\u8a31\u53ef<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"nx\">aws_iam_role_policy<\/span> <span class=\"nx\">kms_codepipeline_static_contents<\/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\">codepipeline_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">terraform_remote_state<\/span><span class=\"p\">.<\/span><span class=\"nx\">shared<\/span><span class=\"p\">.<\/span><span class=\"nx\">outputs<\/span><span class=\"p\">.<\/span><span class=\"nx\">kms_policy_json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># \u30c7\u30d7\u30ed\u30a4\u5148S3\u3078\u306e\u30a2\u30af\u30bb\u30b9\u8a31\u53ef<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"nx\">aws_iam_role_policy<\/span> <span class=\"nx\">s3_static_contents<\/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\">codepipeline_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">s3_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"nx\">aws_codepipeline<\/span> <span class=\"nx\">static_contents<\/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\">-static-contents-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">role_arn<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_iam_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n\r\n  <span class=\"nx\">artifact_store<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">location<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">bucket<\/span>\r\n    <span class=\"nx\">type<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"S3\"<\/span>\r\n    <span class=\"nx\">encryption_key<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">id<\/span>   <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">terraform_remote_state<\/span><span class=\"p\">.<\/span><span class=\"nx\">shared<\/span><span class=\"p\">.<\/span><span class=\"nx\">outputs<\/span><span class=\"p\">.<\/span><span class=\"nx\">kms_alias_arn<\/span>\r\n      <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"KMS\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"c1\"># \u9759\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u7528CodeCommit\u30ea\u30dd\u30b8\u30c8\u30ea\u304b\u3089\u30bd\u30fc\u30b9\u3092\u53d6\u5f97\u3057\u3001CodePipeline\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u683c\u7d0d\u3059\u308bS3\u30d0\u30b1\u30c3\u30c8\u306b\u4fdd\u5b58\u3059\u308b<\/span>\r\n  <span class=\"nx\">stage<\/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\">-static-contents-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-source\"<\/span>\r\n\r\n    <span class=\"nx\">action<\/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\">-static-contents-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-source-action\"<\/span>\r\n      <span class=\"nx\">category<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"Source\"<\/span>\r\n      <span class=\"nx\">owner<\/span>            <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\"<\/span>\r\n      <span class=\"k\">provider<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"CodeCommit\"<\/span>\r\n      <span class=\"nx\">version<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"1\"<\/span>\r\n      <span class=\"nx\">output_artifacts<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"SOURCE\"<\/span><span class=\"p\">]<\/span>\r\n\r\n      <span class=\"nx\">configuration<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">PollForSourceChanges<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"false\"<\/span>\r\n        <span class=\"nx\">RepositoryName<\/span>       <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">terraform_remote_state<\/span><span class=\"p\">.<\/span><span class=\"nx\">shared<\/span><span class=\"p\">.<\/span><span class=\"nx\">outputs<\/span><span class=\"p\">.<\/span><span class=\"nx\">codecommit_repository_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">repository_name<\/span>\r\n        <span class=\"nx\">BranchName<\/span>           <span class=\"p\">=<\/span> <span class=\"k\">terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/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=\"c1\"># CodePipeline\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u683c\u7d0d\u3059\u308bS3\u30d0\u30b1\u30c3\u30c8\u304b\u3089\u4e0a\u8a18stage\u306e\u7d50\u679c\u3092\u53d6\u5f97\u3057\u3001\u30c7\u30d7\u30ed\u30a4\u5148\u306eS3\u30d0\u30b1\u30c3\u30c8\u306b\u5c55\u958b\u3059\u308b<\/span>\r\n  <span class=\"nx\">stage<\/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\">-static-contents-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-deploy\"<\/span>\r\n\r\n    <span class=\"nx\">action<\/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\">-static-contents-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-deploy-action\"<\/span>\r\n      <span class=\"nx\">category<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"Deploy\"<\/span>\r\n      <span class=\"nx\">owner<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\"<\/span>\r\n      <span class=\"k\">provider<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"S3\"<\/span>\r\n      <span class=\"nx\">input_artifacts<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"SOURCE\"<\/span><span class=\"p\">]<\/span>\r\n      <span class=\"nx\">version<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"1\"<\/span>\r\n\r\n      <span class=\"nx\">configuration<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">BucketName<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"nx\">Extract<\/span>    <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span><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<\/code><\/pre>\n<h4>\u786e\u8ba4\u52a8\u4f5c<\/h4>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws codepipeline start-pipeline-execution <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--name<\/span> terraform-sample-static-contents-stage <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"pipelineExecutionId\"<\/span>: <span class=\"s2\">\"AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE\"<\/span>\r\n<span class=\"o\">}<\/span>\r\n<span class=\"nv\">$ <\/span>aws codepipeline get-pipeline-execution <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--pipeline-name<\/span> terraform-sample-static-contents-stage <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--pipeline-execution-id<\/span> AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"pipelineExecution.status\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"s2\">\"Succeeded\"<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u6210\u529f\u4e86\uff0c\u4e00\u5207\u6b63\u5e38\u3002<\/p>\n<h3>\u4e91\u76d1\u63a7<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d883b913a08637a6c2649\/102-0.png\" alt=\"terraform-aws-\u9759\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u81ea\u52d5\u30c7\u30d7\u30ed\u30a4-CloudWatch.png\" \/><\/div>\n<pre class=\"post-pre\"><code><span class=\"k\">data<\/span> <span class=\"nx\">aws_iam_policy_document<\/span> <span class=\"nx\">cloudwatch_assume_role<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"sts:AssumeRole\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">principals<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">identifiers<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n        <span class=\"s2\">\"codepipeline.amazonaws.com\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"s2\">\"events.amazonaws.com\"<\/span>\r\n      <span class=\"p\">]<\/span>\r\n      <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Service\"<\/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\">output<\/span> <span class=\"nx\">cloudwatch_assume_role_policy_json<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudwatch_assume_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"nx\">aws_iam_role<\/span> <span class=\"nx\">codepipeline_static_contents_cloudwatch<\/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\">-codepipeline-static-contents-cloudwatch-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">assume_role_policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">terraform_remote_state<\/span><span class=\"p\">.<\/span><span class=\"nx\">shared<\/span><span class=\"p\">.<\/span><span class=\"nx\">outputs<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudwatch_assume_role_policy_json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"c1\"># resources\u306b\u4e0a\u8a18\u3067\u4f5c\u6210\u3057\u305fCodePipeline\u3092\u6307\u5b9a\u3059\u308b\u306e\u3067\u3001\u3053\u3053\u3067\u5ba3\u8a00<\/span>\r\n<span class=\"k\">data<\/span> <span class=\"nx\">aws_iam_policy_document<\/span> <span class=\"nx\">codepipeline_static_contents_cloudwatch<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"codepipeline:StartPipelineExecution\"<\/span><span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">resources<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"nx\">aws_codepipeline<\/span><span class=\"p\">.<\/span><span class=\"nx\">static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><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=\"nx\">aws_iam_role_policy<\/span> <span class=\"nx\">codepipeline_static_contents_cloudwatch<\/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\">codepipeline_static_contents_cloudwatch<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_static_contents_cloudwatch<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"nx\">aws_cloudwatch_event_rule<\/span> <span class=\"nx\">codepipeline_static_contents<\/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\">-codepipeline-static-contents-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"c1\"># var.static_contents_repository_arn\u306evar.static_contents_target_branch\u306b\u5909\u66f4\u304c\u767a\u751f\u3057\u305f\u3089\u767a\u706b\u3059\u308b<\/span>\r\n  <span class=\"nx\">event_pattern<\/span> <span class=\"p\">=<\/span> <span class=\"o\">&lt;&lt;<\/span><span class=\"no\">PATTERN<\/span><span class=\"sh\">\r\n  {\r\n    \"source\": [\r\n      \"aws.codecommit\"\r\n    ],\r\n    \"detail-type\": [\r\n      \"CodeCommit Repository State Change\"\r\n    ],\r\n    \"resources\": [\r\n      \"${data.terraform_remote_state.shared.outputs.codecommit_repository_static_contents.arn}\"\r\n    ],\r\n    \"detail\": {\r\n      \"event\": [\r\n        \"referenceCreated\",\r\n        \"referenceUpdated\"\r\n      ],\r\n      \"referenceType\": [\r\n        \"branch\"\r\n      ],\r\n      \"referenceName\": [\r\n        \"${terraform.workspace}\"\r\n      ]\r\n    }\r\n  }\r\n<\/span><span class=\"no\">PATTERN\r\n<\/span><span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"nx\">aws_cloudwatch_event_target<\/span> <span class=\"nx\">codepipeline_static_contents<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">rule<\/span>      <span class=\"p\">=<\/span> <span class=\"nx\">aws_cloudwatch_event_rule<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">target_id<\/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\">-codepipeline-static-contents-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">arn<\/span>       <span class=\"p\">=<\/span> <span class=\"nx\">aws_codepipeline<\/span><span class=\"p\">.<\/span><span class=\"nx\">static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n  <span class=\"nx\">role_arn<\/span>  <span class=\"p\">=<\/span> <span class=\"nx\">aws_iam_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_static_contents_cloudwatch<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h4>\u786e\u8ba4\u884c\u52a8<\/h4>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u4f7f\u7528var.static_contents_target_branch\u6307\u5b9a\u7684\u5206\u652f\u5c06\u66f4\u6539\u63a8\u9001\u5230\u3002<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\u8bf7\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u8fdb\u884c\u786e\u8ba4\u3002<\/ol>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws codepipeline list-pipeline-executions <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--pipeline-name<\/span> terraform-sample-static-contents-stage <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"pipelineExecutionSummaries\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"pipelineExecutionId\"<\/span>: <span class=\"s2\">\"YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY\"<\/span>,\r\n            <span class=\"s2\">\"status\"<\/span>: <span class=\"s2\">\"Succeeded\"<\/span>,\r\n            <span class=\"s2\">\"startTime\"<\/span>: BBBBBBBBBB.BBB,\r\n            <span class=\"s2\">\"lastUpdateTime\"<\/span>: BBBBBBBBBB.BBB,\r\n            <span class=\"s2\">\"sourceRevisions\"<\/span>: <span class=\"o\">[<\/span>\r\n                <span class=\"o\">{<\/span>\r\n                    <span class=\"s2\">\"actionName\"<\/span>: <span class=\"s2\">\"terraform-sample-static-contents-stage-source-action\"<\/span>,\r\n                    <span class=\"s2\">\"revisionId\"<\/span>: <span class=\"s2\">\"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\"<\/span>,\r\n                    <span class=\"s2\">\"revisionSummary\"<\/span>: <span class=\"s2\">\"Test commit\"<\/span>,\r\n                    <span class=\"s2\">\"revisionUrl\"<\/span>: <span class=\"s2\">\"https:\/\/ap-northeast-1.console.aws.amazon.com\/codecommit\/home#\/repository\/terraform-sample-static-contents\/commit\/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\"<\/span>\r\n                <span class=\"o\">}<\/span>\r\n            <span class=\"o\">]<\/span>,\r\n            <span class=\"s2\">\"trigger\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"triggerType\"<\/span>: <span class=\"s2\">\"CloudWatchEvent\"<\/span>,\r\n                <span class=\"s2\">\"triggerDetail\"<\/span>: <span class=\"s2\">\"arn:aws:events:ap-northeast-1:338927112236:rule\/terraform-sample-codepipeline-static-contents-stage\"<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span>,\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"pipelineExecutionId\"<\/span>: <span class=\"s2\">\"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\"<\/span>,\r\n            <span class=\"s2\">\"status\"<\/span>: <span class=\"s2\">\"Succeeded\"<\/span>,\r\n            <span class=\"s2\">\"startTime\"<\/span>: AAAAAAAAAA.AAA,\r\n            <span class=\"s2\">\"lastUpdateTime\"<\/span>: AAAAAAAAAA.AAA,\r\n            <span class=\"s2\">\"sourceRevisions\"<\/span>: <span class=\"o\">[<\/span>\r\n                <span class=\"o\">{<\/span>\r\n                    <span class=\"s2\">\"actionName\"<\/span>: <span class=\"s2\">\"terraform-sample-static-contents-stage-source-action\"<\/span>,\r\n                    <span class=\"s2\">\"revisionId\"<\/span>: <span class=\"s2\">\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"<\/span>,\r\n                    <span class=\"s2\">\"revisionSummary\"<\/span>: <span class=\"s2\">\"Initial commit\"<\/span>,\r\n                    <span class=\"s2\">\"revisionUrl\"<\/span>: <span class=\"s2\">\"https:\/\/ap-northeast-1.console.aws.amazon.com\/codecommit\/home#\/repository\/terraform-sample-static-contents\/commit\/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"<\/span>\r\n                <span class=\"o\">}<\/span>\r\n            <span class=\"o\">]<\/span>,\r\n            <span class=\"s2\">\"trigger\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"triggerType\"<\/span>: <span class=\"s2\">\"StartPipelineExecution\"<\/span>,\r\n                <span class=\"s2\">\"triggerDetail\"<\/span>: <span class=\"s2\">\"arn:aws:iam::XXXXXXXXXXXX:user\/terraform-sample\"<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">]<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c&#8221;triggerType&#8221;: &#8220;CloudWatchEvent&#8221;\u7684\u6267\u884c\u5386\u53f2\u72b6\u6001\u4e3a&#8221;Succeeded&#8221;\uff0c\u5219\u8868\u793a\u6b63\u5e38\u3002<\/p>\n<h2>\u5c06\u9759\u6001\u5185\u5bb9\u8f6c\u5316\u4e3a\u7f51\u7ad9<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d883b913a08637a6c2649\/110-0.png\" alt=\"terraform-aws-\u9759\u7684\u30b3\u30f3\u30c6\u30f3\u30c4\u306eWeb\u30b5\u30a4\u30c8\u5316.png\" \/><\/div>\n<h3>\u5c06S3\u8f6c\u5316\u4e3a\u7f51\u7ad9\u3002<\/h3>\n<pre class=\"post-pre\"><code><span class=\"n\">resource<\/span> <span class=\"n\">aws_s3_bucket<\/span> <span class=\"n\">static_contents<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"n\">bucket<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"${var.app_name}-static-contents-${terraform.workspace}\"<\/span>\r\n  <span class=\"n\">acl<\/span>    <span class=\"o\">=<\/span> <span class=\"s2\">\"private\"<\/span>\r\n\r\n<span class=\"hil\"><span class=\"o\">+ <\/span><span class=\"n\">website<\/span> <span class=\"p\">{<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>  <span class=\"n\">index_document<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"index.html\"<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span>  <span class=\"n\">error_document<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"error.html\"<\/span>\r\n<\/span><span class=\"hil\"><span class=\"o\">+ <\/span><span class=\"p\">}<\/span>\r\n<\/span>\r\n  <span class=\"n\">tags<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"no\">Name<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"${var.app_name}-static-contents-${terraform.workspace}\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<\/code><\/pre>\n<h3>\u4e91\u524d\u7f18<\/h3>\n<h4>\u57df\u540d\u8bbe\u7f6e<\/h4>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n<span class=\"nx\">user_domain<\/span> <span class=\"err\">=<\/span> <span class=\"s2\">\"app.example.com\"<\/span>\r\n<span class=\"nx\">admin_domain<\/span> <span class=\"err\">=<\/span> <span class=\"s2\">\"admin.app.example.com\"<\/span>\r\n<\/code><\/pre>\n<h4>\u57df\u540d\u8bc1\u4e66<\/h4>\n<h5>\u5982\u679c\u60a8\u5728AWS\u4e0a\u72ec\u7acb\u7ba1\u7406\u57df\u540d\uff08\u6709\u5728Route53\u4e2d\u7684\u6258\u7ba1\u533a\u57df\uff09\uff0c\u90a3\u4e48&#8230;<\/h5>\n<p>\u4f7f\u7528terraform\u83b7\u53d6\u4e3b\u673a\u533a\u57df\u4fe1\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">data<\/span> <span class=\"nx\">aws_route53_zone<\/span> <span class=\"nx\">route53<\/span><span class=\"err\">-<\/span><span class=\"nx\">zone<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">name<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"example.com.\"<\/span>\r\n  <span class=\"nx\">private_zone<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"nx\">route53<\/span><span class=\"err\">-<\/span><span class=\"nx\">zone<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/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\">route53<\/span><span class=\"err\">-<\/span><span class=\"nx\">zone<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u4f7f\u7528ACM\u521b\u5efa\u8bc1\u4e66\u65f6\uff0c\u9700\u8981\u5c06\u6ce8\u518c\u7684\u533a\u57df\u8bbe\u7f6e\u4e3a***\u5f17\u5409\u5c3c\u4e9a\u5317\u90e8\uff08us-east-1\uff09***\u3002\u7531\u4e8e\u65e0\u6cd5\u4f7f\u7528\u8bc1\u4e66\u8d44\u6e90\u6765\u6307\u5b9a\u533a\u57df\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528terraform\u7684\u9ed8\u8ba4\u53c2\u6570provider\u6765\u6307\u5b9a\u533a\u57df\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">provider<\/span> <span class=\"s2\">\"aws\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">alias<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"virginia\"<\/span>\r\n  <span class=\"nx\">region<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"us-east-1\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>resource aws_acm_certificate user_cert {\r\n  domain_name       = \"${terraform.workspace == \"production\" ? \"\" : terraform.workspace}${var.user_domain}\"\r\n  validation_method = \"DNS\"\r\n  provider          = aws.virginia\r\n}\r\n\r\nresource aws_route53_record user_cert_validation {\r\n  zone_id = data.terraform_remote_state.shared.outputs.route53-zone.zone_id\r\n  name    = tolist(aws_acm_certificate.user_cert.domain_validation_options)[0].resource_record_name\r\n  type    = tolist(aws_acm_certificate.user_cert.domain_validation_options)[0].resource_record_type\r\n  records = [tolist(aws_acm_certificate.user_cert.domain_validation_options)[0].resource_record_value]\r\n  ttl     = 60\r\n}\r\n\r\nresource aws_acm_certificate_validation user_cert {\r\n  certificate_arn         = aws_acm_certificate.user_cert.arn\r\n  validation_record_fqdns = [aws_route53_record.user_cert_validation.fqdn]\r\n  provider                = aws.virginia\r\n}\r\n\r\nresource aws_acm_certificate admin_cert {\r\n  domain_name       = \"${terraform.workspace == \"production\" ? \"\" : terraform.workspace}${var.admin_domain}\"\r\n  validation_method = \"DNS\"\r\n  provider          = aws.virginia\r\n}\r\n\r\nresource aws_route53_record admin_cert_validation {\r\n  zone_id = data.terraform_remote_state.shared.outputs.route53-zone.zone_id\r\n  name    = tolist(aws_acm_certificate.admin_cert.domain_validation_options)[0].resource_record_name\r\n  type    = tolist(aws_acm_certificate.admin_cert.domain_validation_options)[0].resource_record_type\r\n  records = [tolist(aws_acm_certificate.admin_cert.domain_validation_options)[0].resource_record_value]\r\n  ttl     = 60\r\n}\r\n\r\nresource aws_acm_certificate_validation admin_cert {\r\n  certificate_arn         = aws_acm_certificate.admin_cert.arn\r\n  validation_record_fqdns = [aws_route53_record.admin_cert_validation.fqdn]\r\n  provider                = aws.virginia\r\n}\r\n<\/code><\/pre>\n<h5>\u5982\u679c\u672a\u5728AWS\u4e0a\u7ba1\u7406\u4e00\u4e2a\u72ec\u7acb\u7684\u57df\u540d\uff08\u521b\u5efa\u81ea\u7b7e\u540d\u8bc1\u4e66\uff09\u7684\u60c5\u51b5\u4e0b\u3002<\/h5>\n<p>\u6839\u636eQiita\u4e0a\u7684\u6307\u5357\uff0c\u4f7f\u7528AWS\u8bc1\u4e66\u7ba1\u7406\u5668\u5bfc\u5165\u81ea\u7b7e\u540d\u8bc1\u4e66\uff0c\u7136\u540e\u521b\u5efa\u8bc1\u4e66\u3002\u7531\u4e8e\u5b9e\u9645\u4e0a\u662f\u901a\u8fc7\u81ea\u52a8\u5206\u914d\u7684XXXXXXXXXXXXXXXXXX.cloudfront.net\u8fdb\u884cHTTPS\u8bbf\u95ee\uff0c\u56e0\u6b64\u53ef\u4ee5\u4f7f\u7528\u4efb\u4f55\u6709\u6548\u7684\u57df\u540d\u8fdb\u884c\u9a8c\u8bc1\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">mkdir <\/span>certs\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>certs\r\n\r\n<span class=\"c\"># \u30eb\u30fc\u30c8\u8a3c\u660e\u66f8<\/span>\r\ncerts<span class=\"nv\">$ <\/span>openssl genrsa <span class=\"nt\">-out<\/span> root.key <span class=\"nt\">-des3<\/span> 2048\r\nEnter pass phrase <span class=\"k\">for <\/span>root.key:\u30d1\u30b9\u30d5\u30ec\u30fc\u30ba\r\nVerifying - Enter pass phrase <span class=\"k\">for <\/span>root.key:\u30d1\u30b9\u30d5\u30ec\u30fc\u30ba\r\ncerts<span class=\"nv\">$ <\/span>openssl req <span class=\"nt\">-new<\/span> <span class=\"nt\">-x509<\/span> <span class=\"nt\">-key<\/span> root.key <span class=\"nt\">-sha256<\/span> <span class=\"nt\">-days<\/span> 3650 <span class=\"nt\">-out<\/span> root.pem <span class=\"nt\">-subj<\/span> <span class=\"s2\">\"\/C=JP\/ST=Tokyo\/O=example corp.\/CN=example root 2020\"<\/span>\r\nEnter pass phrase <span class=\"k\">for <\/span>root.key:\u30d1\u30b9\u30d5\u30ec\u30fc\u30ba\r\n\r\n<span class=\"c\"># \u4e2d\u9593CA\u8a3c\u660e\u66f8<\/span>\r\ncerts<span class=\"nv\">$ <\/span>openssl genrsa <span class=\"nt\">-out<\/span> intermediate-ca.key <span class=\"nt\">-des3<\/span> 2048\r\nEnter pass phrase <span class=\"k\">for <\/span>intermediate-ca.key:\u30d1\u30b9\u30d5\u30ec\u30fc\u30ba\r\nVerifying - Enter pass phrase <span class=\"k\">for <\/span>intermediate-ca.key:\u30d1\u30b9\u30d5\u30ec\u30fc\u30ba\r\ncerts<span class=\"nv\">$ <\/span>openssl req <span class=\"nt\">-new<\/span> <span class=\"nt\">-key<\/span> intermediate-ca.key <span class=\"nt\">-sha256<\/span> <span class=\"nt\">-outform<\/span> PEM <span class=\"nt\">-keyform<\/span> PEM <span class=\"nt\">-out<\/span> intermediate-ca.csr <span class=\"nt\">-subj<\/span> <span class=\"s2\">\"\/C=JP\/ST=Tokyo\/O=example corp.\/CN=example Inter CA 2020\"<\/span>\r\nEnter pass phrase <span class=\"k\">for <\/span>intermediate-ca.key:\u30d1\u30b9\u30d5\u30ec\u30fc\u30ba\r\ncerts<span class=\"nv\">$ <\/span><span class=\"nb\">cat<\/span> - <span class=\"o\">&lt;&lt;<\/span> <span class=\"no\">EOS<\/span><span class=\"sh\"> &gt;&gt; openssl-sign-intermediate-ca.conf\r\n[ v3_ca ]\r\nbasicConstraints = CA:true, pathlen:0\r\nkeyUsage = cRLSign, keyCertSign\r\nnsCertType = sslCA, emailCA\r\n<\/span><span class=\"no\">EOS\r\n<\/span>certs<span class=\"nv\">$ <\/span>openssl x509 <span class=\"nt\">-extfile<\/span> openssl-sign-intermediate-ca.conf <span class=\"nt\">-req<\/span> <span class=\"nt\">-in<\/span> intermediate-ca.csr <span class=\"nt\">-sha256<\/span> <span class=\"nt\">-CA<\/span> root.pem <span class=\"nt\">-CAkey<\/span> root.key <span class=\"nt\">-set_serial<\/span> 01 <span class=\"nt\">-extensions<\/span> v3_ca <span class=\"nt\">-days<\/span> 3650 <span class=\"nt\">-out<\/span> intermediate-ca.pem\r\nEnter pass phrase <span class=\"k\">for <\/span>root.key:\u30d1\u30b9\u30d5\u30ec\u30fc\u30ba\r\n\r\n<span class=\"c\"># \u30b5\u30fc\u30d0\u8a3c\u660e\u66f8<\/span>\r\ncerts<span class=\"nv\">$ <\/span>openssl genrsa 2048 <span class=\"o\">&gt;<\/span> server.key\r\ncerts<span class=\"nv\">$ <\/span>openssl req <span class=\"nt\">-new<\/span> <span class=\"nt\">-key<\/span> server.key <span class=\"nt\">-outform<\/span> PEM <span class=\"nt\">-keyform<\/span> PEM <span class=\"nt\">-sha256<\/span> <span class=\"nt\">-out<\/span> server.csr <span class=\"nt\">-subj<\/span> <span class=\"s2\">\"\/C=JP\/ST=Tokyo\/O=example corp.\/CN=vpn.example.com\"<\/span>\r\ncerts<span class=\"nv\">$ <\/span>openssl x509 <span class=\"nt\">-req<\/span> <span class=\"nt\">-in<\/span> server.csr <span class=\"nt\">-sha256<\/span> <span class=\"nt\">-CA<\/span> intermediate-ca.pem <span class=\"nt\">-CAkey<\/span> intermediate-ca.key <span class=\"nt\">-set_serial<\/span> 01 <span class=\"nt\">-days<\/span> 3650 <span class=\"nt\">-out<\/span> server.pem\r\nEnter pass phrase <span class=\"k\">for <\/span>intermediate-ca.key:\u30d1\u30b9\u30d5\u30ec\u30fc\u30ba\r\n<\/code><\/pre>\n<h6>\u4f7f\u7528AWS CLI\u8fdb\u884c\u6ce8\u518c\u3002<\/h6>\n<p>\u4f7f\u7528AWS CLI\u8fdb\u884c\u5bfc\u5165-\u6309\u7167AWS Certificate Manager\u7684\u6307\u793a\uff0c\u5728AWS CLI\u4e2d\u8fdb\u884c\u6ce8\u518c\u3002<br \/>\n\u5728\u6b64\u671f\u95f4\uff0c\u6ce8\u518c\u7684\u533a\u57df\u9700\u8981\u8bbe\u7f6e\u4e3a***\u5317\u5f17\u5409\u5c3c\u4e9a(us-east-1)***\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws acm import-certificate <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--region<\/span> us-east-1 <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--certificate<\/span> fileb:\/\/server.pem <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--certificate-chain<\/span> fileb:\/\/intermediate-ca.pem <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--private-key<\/span> fileb:\/\/server.key\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"CertificateArn\"<\/span>: <span class=\"s2\">\"arn:aws:acm:us-east-1:XXXXXXXXXXXX:certificate\/abcdefghijklmnopqrstuvwxyz\"<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h6>\u5728Terraform\u4e2d\u8fdb\u884c\u53d8\u91cf\u5316\u5904\u7406<\/h6>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"nx\">acm_certificate_arn<\/span> <span class=\"err\">=<\/span> <span class=\"s2\">\"arn:aws:acm:us-east-1:XXXXXXXXXXXX:certificate\/abcdefghijklmnopqrstuvwxyz\"<\/span>\r\n<\/code><\/pre>\n<h4>\u6765\u6e90\u8bbf\u95ee\u8eab\u4efd<\/h4>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"nx\">aws_cloudfront_origin_access_identity<\/span> <span class=\"nx\">oai<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">comment<\/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=\"k\">output<\/span> <span class=\"nx\">cloudfront_origin_access_identity<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_cloudfront_origin_access_identity<\/span><span class=\"p\">.<\/span><span class=\"nx\">oai<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h4>S3 \u65e5\u5fd7<\/h4>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"app_name\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"cloudfront_origin_access_identity_iam_arn\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_s3_bucket\"<\/span> <span class=\"s2\">\"logs\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">bucket<\/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\">-logs\"<\/span>\r\n  <span class=\"nx\">acl<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"private\"<\/span>\r\n\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\">-logs\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"logs\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">logs<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"s3_logs\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span>   <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"s3:PutObject\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">resources<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">logs<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/*\"<\/span><span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">principals<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\"<\/span>\r\n      <span class=\"nx\">identifiers<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudfront_origin_access_identity_iam_arn<\/span><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_s3_bucket_policy\"<\/span> <span class=\"s2\">\"logs\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">bucket<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">logs<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">s3_logs<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">module<\/span> <span class=\"s2\">\"s3\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">source<\/span>                                    <span class=\"p\">=<\/span> <span class=\"s2\">\"..\/modules\/s3\"<\/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\">cloudfront_origin_access_identity_iam_arn<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudfront<\/span><span class=\"p\">.<\/span><span class=\"nx\">origin_access_identity<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam_arn<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h4>\u7ba1\u7406\u5458<\/h4>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_cloudfront_distribution\"<\/span> <span class=\"s2\">\"admin\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">enabled<\/span>             <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"nx\">comment<\/span>             <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span>\r\n  <span class=\"nx\">default_root_object<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"index.html\"<\/span>\r\n\r\n  <span class=\"nx\">origin<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">origin_id<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"s3-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">domain_name<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">bucket_domain_name<\/span>\r\n\r\n    <span class=\"nx\">s3_origin_config<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">origin_access_identity<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudfront<\/span><span class=\"p\">.<\/span><span class=\"nx\">origin_access_identity<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudfront_access_identity_path<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">default_cache_behavior<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">target_origin_id<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"s3-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">allowed_methods<\/span>        <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">cached_methods<\/span>         <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">compress<\/span>               <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n    <span class=\"nx\">viewer_protocol_policy<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"redirect-to-https\"<\/span>\r\n    <span class=\"nx\">default_ttl<\/span>            <span class=\"p\">=<\/span> <span class=\"mi\">3600<\/span>\r\n    <span class=\"nx\">min_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"nx\">max_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">86400<\/span>\r\n\r\n    <span class=\"nx\">forwarded_values<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">query_string<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n\r\n      <span class=\"nx\">cookies<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">forward<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"none\"<\/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=\"nx\">restrictions<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">geo_restriction<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">restriction_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"none\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">viewer_certificate<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">acm_certificate_arn<\/span>      <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">acm_certificate_arn<\/span>\r\n    <span class=\"nx\">ssl_support_method<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"sni-only\"<\/span>\r\n    <span class=\"nx\">minimum_protocol_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"TLSv1\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">logging_config<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">bucket<\/span>          <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">s3<\/span><span class=\"p\">.<\/span><span class=\"nx\">logs<\/span><span class=\"p\">.<\/span><span class=\"nx\">bucket_domain_name<\/span>\r\n    <span class=\"nx\">prefix<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/cloudfront\/admin\"<\/span>\r\n    <span class=\"nx\">include_cookies<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\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=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h4>\u5141\u8bb8\u4eceCloudFront\u8bbf\u95ee\u9759\u6001\u5185\u5bb9S3\u3002<\/h4>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"cloudfront_s3_static_contents\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span>   <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"s3:GetObject\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">resources<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/*\"<\/span><span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">principals<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\"<\/span>\r\n      <span class=\"nx\">identifiers<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudfront<\/span><span class=\"p\">.<\/span><span class=\"nx\">origin_access_identity<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam_arn<\/span><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_s3_bucket_policy\"<\/span> <span class=\"s2\">\"static_contents\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">bucket<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudfront_s3_static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h2>\u5e94\u7528\u7a0b\u5e8f\u73af\u5883<\/h2>\n<h3>VPC \u53ef\u4ee5\u7528\u4e2d\u6587\u7ffb\u8bd1\u4e3a\u865a\u62df\u79c1\u6709\u7f51\u7edc\u3002<\/h3>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"nx\">vpc_cidr_block<\/span> <span class=\"err\">=<\/span> <span class=\"s2\">\"10.1.0.0\/16\"<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"vpc_cidr_block\"<\/span> <span class=\"p\">{}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"app_name\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"vpc_cidr_block\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_vpc\"<\/span> <span class=\"s2\">\"vpc\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">cidr_block<\/span>           <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_cidr_block<\/span>\r\n  <span class=\"nx\">instance_tenancy<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"default\"<\/span>\r\n  <span class=\"nx\">enable_dns_support<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"true\"<\/span>\r\n  <span class=\"nx\">enable_dns_hostnames<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"true\"<\/span>\r\n\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=\"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\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">module<\/span> <span class=\"s2\">\"vpc\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">source<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"..\/modules\/vpc\"<\/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\">vpc_cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_cidr_block<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u8e0f\u677f\u670d\u52a1\u5668<\/h3>\n<p>\u521b\u5efa\u7528\u4e8e\u8bbf\u95ee\u5e94\u7528\u7a0b\u5e8f\u670d\u52a1\u5668\u548c\u6570\u636e\u5e93\u7684\u8df3\u677f\u670d\u52a1\u5668\u3002<\/p>\n<h4>\u5b50\u7f51<\/h4>\n<p>\u4e3a\u4e86\u80fd\u591f\u5728\u4e92\u8054\u7f51\u4e0a\u8fdb\u884c\u516c\u5171\u8bbf\u95ee\uff0c\u6211\u4eec\u4e5f\u5c06\u521b\u5efa\u76f8\u5173\u8d44\u6e90\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"nx\">availability_zone_a<\/span> <span class=\"err\">=<\/span> <span class=\"s2\">\"ap-northeast-1a\"<\/span>\r\n\r\n<span class=\"nx\">public_cidr_block_a<\/span> <span class=\"err\">=<\/span> <span class=\"s2\">\"10.1.1.0\/24\"<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"availability_zone_a\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"public_cidr_block_a\"<\/span> <span class=\"p\">{}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_internet_gateway\"<\/span> <span class=\"s2\">\"igw\"<\/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\">vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n\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=\"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<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"app_name\"<\/span> <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=\"k\">variable<\/span> <span class=\"s2\">\"public_cidr_block_a\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"availability_zone_a\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_subnet\"<\/span> <span class=\"s2\">\"public_a\"<\/span> <span class=\"p\">{<\/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\">cidr_block<\/span>        <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_cidr_block_a<\/span>\r\n  <span class=\"nx\">availability_zone<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">availability_zone_a<\/span>\r\n\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\">-public-a\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"public_a_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_a<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><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\">vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n\r\n  <span class=\"nx\">route<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">cidr_block<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"0.0.0.0\/0\"<\/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\">igw<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\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\">-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_table_association\"<\/span> <span class=\"s2\">\"public_a\"<\/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_a<\/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<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">module<\/span> <span class=\"s2\">\"subnet\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">source<\/span>              <span class=\"p\">=<\/span> <span class=\"s2\">\"..\/modules\/subnet\"<\/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\">vpc_id<\/span>              <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">availability_zone_a<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">availability_zone_a<\/span>\r\n  <span class=\"nx\">public_cidr_block_a<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_cidr_block_a<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h4>\u5b89\u5168\u7fa4\u7ec4<\/h4>\n<p>\u4e3a\u4e86\u80fd\u591f\u901a\u8fc7\u5806\u6808\u670d\u52a1\u5668\u8fdb\u884cSSH\u8bbf\u95ee\uff0c\u5c06\u5f00\u653e22\u53f7\u7aef\u53e3\u3002<br \/>\n\u8fd8\u53ef\u4ee5\u53ea\u5141\u8bb8\u6765\u81ea\u56fa\u5b9aIP\u7684SSH\u8bbf\u95ee\uff0c\u4ee5\u786e\u4fdd\u53ea\u6709\u5728\u5bb6\u6216\u516c\u53f8\u5185\u90e8\u624d\u80fd\u8fdb\u884c\u8bbf\u95ee\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"app_name\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"vpc_id\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group\"<\/span> <span class=\"s2\">\"jump\"<\/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\">-jump\"<\/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\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\">-jump\"<\/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_security_group_rule\"<\/span> <span class=\"s2\">\"jump_ssh\"<\/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\">jump<\/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\">22<\/span>\r\n  <span class=\"nx\">to_port<\/span>           <span class=\"p\">=<\/span> <span class=\"mi\">22<\/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> <span class=\"c1\"># \u56fa\u5b9aIP\u304b\u3089\u30a2\u30af\u30bb\u30b9\u3059\u308b\u5834\u5408\u306f\u3053\u3053\u3067\u6307\u5b9a<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"jump_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">jump<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">module<\/span> <span class=\"s2\">\"security_group\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">source<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"..\/modules\/security_group\"<\/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\">vpc_id<\/span>   <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u53ea\u9700\u8981\u4e00\u79cd\u9009\u9879\uff1a\u50cfQiita\u4e0a\u7684Amazon Linux 2 \u4fdd\u62a4 SSH\u90a3\u6837\uff0c\u5982\u679c\u4fee\u6539\u4e86\u7528\u4e8e SSH \u7684\u7aef\u53e3\u53f7\uff0c\u8bf7\u786e\u4fdd\u66f4\u65b0 Terraform\u3002\uff08\u4f8b\u5982\uff1a\u5c06\u5176\u66f4\u6539\u4e3a51921\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code>#-- \u7701\u7565 --#\r\n<span class=\"p\">resource \"aws_security_group_rule\" \"jump_ssh\" {\r\n<\/span>  security_group_id = aws_security_group.jump.id\r\n  type              = \"ingress\"\r\n<span class=\"gd\">- from_port         = 22\r\n<\/span><span class=\"gi\">+ from_port         = 51921\r\n<\/span><span class=\"gd\">- to_port           = 22\r\n<\/span><span class=\"gi\">+ to_port           = 51921\r\n<\/span>  protocol          = \"tcp\"\r\n  cidr_blocks       = [\"0.0.0.0\/0\"]\r\n}\r\n<\/code><\/pre>\n<h4>EC2 \u53ef\u4ee5\u88ab\u7406\u89e3\u4e3a\u4e9a\u9a6c\u900a\u5f39\u6027\u8ba1\u7b97\u4e91\u670d\u52a1\u3002<\/h4>\n<h5>\u83b7\u53d6Amazon Linux 2\u7684\u6700\u65b0AMI ID<\/h5>\n<p>\u6211\u5011\u5c07\u53c3\u8003 DevelopersIO \u7684\u65b9\u6cd5\uff0c\u4f7f\u7528 CloudFormation \u7372\u53d6\u6700\u65b0\u7684 Amazon Linux 2 \u7684 AMI ID \u4e26\u5efa\u7acb EC2\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws ssm get-parameter <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--name<\/span> \/aws\/service\/ami-amazon-linux-latest\/amzn2-ami-hvm-x86_64-gp2 <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--region<\/span> ap-northeast-1 <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"Parameter.Value\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"s2\">\"ami-0064e711cbc7a825e\"<\/span>\r\n<\/code><\/pre>\n<h5>\u521b\u5efa\u7528\u4e8e\u8bbf\u95eeEC2\u7684\u5bc6\u94a5\u5bf9\u3002<\/h5>\n<p>\u4e3a\u4e86\u9632\u6b62\u56e0\u8bef\u64cd\u4f5c\u5bfc\u81f4\u5220\u9664\uff0c\u6211\u4eec\u5c06\u53c2\u8003Amazon EC2\u5bc6\u94a5\u5bf9\u7684\u521b\u5efa\u3001\u663e\u793a\u548c\u5220\u9664 &#8211; AWS\u8eab\u4efd\u548c\u8bbf\u95ee\u7ba1\u7406\u6765\u5728Terraform\u7ba1\u7406\u4e4b\u5916\u521b\u5efa\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws ec2 create-key-pair <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--key-name<\/span> terraform-sample-jump <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s1\">'KeyMaterial'<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--output<\/span> text <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample <span class=\"o\">&gt;<\/span> certs\/terraform-sample-jump.pem\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">chmod <\/span>400 certs\/terraform-sample-jump.pem\r\n<\/code><\/pre>\n<h5>\u4e91\u8ba1\u7b97\u5b9e\u4f8b EC2<\/h5>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"app_name\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"availability_zone_a\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"jump_key_name\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"subnet_id\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"jump_security_group_id\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_instance\"<\/span> <span class=\"s2\">\"jump\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">ami<\/span>                    <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-011facbea5ec0363b\"<\/span> <span class=\"c1\"># \u6700\u65b0AMI ID<\/span>\r\n  <span class=\"nx\">instance_type<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"t2.micro\"<\/span>\r\n  <span class=\"nx\">availability_zone<\/span>      <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">availability_zone_a<\/span>\r\n  <span class=\"nx\">key_name<\/span>               <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">jump_key_name<\/span>\r\n  <span class=\"nx\">monitoring<\/span>             <span class=\"p\">=<\/span> <span class=\"s2\">\"false\"<\/span>\r\n  <span class=\"nx\">subnet_id<\/span>              <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet_id<\/span>\r\n  <span class=\"nx\">vpc_security_group_ids<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">jump_security_group_id<\/span><span class=\"p\">]<\/span>\r\n\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\">-jump\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">module<\/span> <span class=\"s2\">\"ec2\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">source<\/span>                 <span class=\"p\">=<\/span> <span class=\"s2\">\"..\/modules\/ec2\"<\/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\">availability_zone_a<\/span>    <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">availability_zone_a<\/span>\r\n  <span class=\"nx\">jump_key_name<\/span>          <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">jump_key_name<\/span>\r\n  <span class=\"nx\">subnet_id<\/span>              <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_a_id<\/span>\r\n  <span class=\"nx\">jump_security_group_id<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">jump_id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u5f39\u6027IP<\/h5>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_eip\"<\/span> <span class=\"s2\">\"jump\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n\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\">-jump\"<\/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_association\"<\/span> <span class=\"s2\">\"jump\"<\/span> <span class=\"p\">{<\/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\">jump<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">instance_id<\/span>   <span class=\"p\">=<\/span> <span class=\"nx\">aws_instance<\/span><span class=\"p\">.<\/span><span class=\"nx\">jump<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u83b7\u53d6\u8df3\u677f\u670d\u52a1\u5668\u7684\u516c\u5171IP\u5730\u5740<\/h5>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws ec2 describe-instances <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--filter<\/span> <span class=\"s2\">\"Name=tag:Name,Values=terraform-sample-jump\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"Reservations[0].Instances[0].PublicIpAddress\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"s2\">\"XXX.XXX.XXX.XXX\"<\/span>\r\n<\/code><\/pre>\n<h5>\u8bf7\u786e\u8ba4\u8fde\u63a5\u3002<\/h5>\n<p>\u5982\u679c\u80fd\u591f\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u8fde\u63a5\uff0c\u5c31\u4f1a\u8fbe\u5230\u6b63\u786e\u7684\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>ssh <span class=\"nt\">-i<\/span> certs\/terraform-sample-jump.pem ec2-user@XXX.XXX.XXX.XXX\r\nThe authenticity of host <span class=\"s1\">'XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)'<\/span> can<span class=\"s1\">'t be established.\r\nECDSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r\nAre you sure you want to continue connecting (yes\/no)? yes\r\nWarning: Permanently added '<\/span>XXX.XXX.XXX.XXX<span class=\"s1\">' (ECDSA) to the list of known hosts.\r\n\r\n       __|  __|_  )\r\n       _|  (     \/   Amazon Linux 2 AMI\r\n      ___|\\___|___|\r\n\r\nhttps:\/\/aws.amazon.com\/amazon-linux-2\/\r\n[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ \r\n<\/span><\/code><\/pre>\n<p>\u786e\u5b9a\u8981\u7ee7\u7eed\u8fde\u63a5\u5417\uff1f\u8bf7\u952e\u5165\u201c\u662f\u201d\u6216\u201c\u5426\u201d\u3002<\/p>\n<h3>\u4f7f\u7528CodePipeline\u548cCodeBuild\u5b9e\u73b0\u6301\u7eed\u96c6\u6210\u3002<\/h3>\n<h4>\u5b58\u50a8CodePipeline\u7684Artifact\u7684S3\u5b58\u50a8\u6876<\/h4>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_s3_bucket\"<\/span> <span class=\"s2\">\"codepipeline_application_sources\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">bucket<\/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\">-codepipeline-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">acl<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"private\"<\/span>\r\n\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\">-codepipeline-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/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_iam_policy_document\"<\/span> <span class=\"s2\">\"s3_codepipeline_application_sources\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"s3:GetObject\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"s3:GetObjectVersion\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"s3:GetBucketVersioning\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"s3:PutObject\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">resources<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/*\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h4>CodeCommit\u7684\u8bbf\u95ee\u6743\u9650<\/h4>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"application_sources_repository_arn\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"codecommit_application_sources\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"codecommit:GitPull\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codecommit:GetBranch\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codecommit:GetCommit\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codecommit:UploadArchive\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codecommit:GetUploadArchiveStatus\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">resources<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">application_sources_repository_arn<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">application_sources_repository_arn<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/*\"<\/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\">output<\/span> <span class=\"s2\">\"codecommit_application_sources_policy_json\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codecommit_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>#-- \u4e2d\u7565 --#\r\n<span class=\"p\">module \"iam\" {\r\n<\/span>  source                             = \"..\/modules\/iam\"\r\n  static_contents_repository_arn     = var.static_contents_repository_arn\r\n<span class=\"gi\">+ application_sources_repository_arn = var.application_sources_repository_arn\r\n<\/span>}\r\n#-- \u4e2d\u7565 --#\r\n<\/code><\/pre>\n<h4>\u6784\u5efa\u4ee3\u7801<\/h4>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"app_name\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"codebuild_assume_role\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"sts:AssumeRole\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">principals<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">identifiers<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"codebuild.amazonaws.com\"<\/span><span class=\"p\">]<\/span>\r\n      <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"Service\"<\/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\">output<\/span> <span class=\"s2\">\"codebuild_assume_role_policy_json\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codebuild_assume_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"codebuild\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"logs:CreateLogGroup\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"logs:CreateLogStream\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"logs:PutLogEvents\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n    <span class=\"nx\">resources<\/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\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"codebuild:StopBuild\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"ec2:*\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">resources<\/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\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"codebuild_policy_json\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codebuild<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>#-- \u4e2d\u7565 --#\r\n<span class=\"p\">module \"iam\" {\r\n<\/span>  source                             = \"..\/modules\/iam\"\r\n  static_contents_repository_arn     = var.static_contents_repository_arn\r\n  application_sources_repository_arn = var.application_sources_repository_arn\r\n<span class=\"gi\">+ app_name                           = var.app_name\r\n<\/span>}\r\n#-- \u4e2d\u7565 --#\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role\"<\/span> <span class=\"s2\">\"codebuild_admin\"<\/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\">-codebuild-admin\"<\/span>\r\n  <span class=\"nx\">assume_role_policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam<\/span><span class=\"p\">.<\/span><span class=\"nx\">codebuild_assume_role_policy_json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy\"<\/span> <span class=\"s2\">\"codebuild_admin\"<\/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\">codebuild_admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam<\/span><span class=\"p\">.<\/span><span class=\"nx\">codebuild_policy_json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy\"<\/span> <span class=\"s2\">\"s3_codebuild_admin\"<\/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\">codebuild_admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">s3_codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy\"<\/span> <span class=\"s2\">\"kms_codebuild_admin\"<\/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\">codebuild_admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam<\/span><span class=\"p\">.<\/span><span class=\"nx\">kms_policy_json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_codebuild_project\"<\/span> <span class=\"s2\">\"admin\"<\/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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">description<\/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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">build_timeout<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"15\"<\/span>\r\n  <span class=\"nx\">service_role<\/span>  <span class=\"p\">=<\/span> <span class=\"nx\">aws_iam_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">codebuild_admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n\r\n  <span class=\"nx\">artifacts<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"NO_ARTIFACTS\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">cache<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"LOCAL\"<\/span>\r\n    <span class=\"nx\">modes<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"LOCAL_SOURCE_CACHE\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"LOCAL_CUSTOM_CACHE\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">environment<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">compute_type<\/span>                <span class=\"p\">=<\/span> <span class=\"s2\">\"BUILD_GENERAL1_SMALL\"<\/span>\r\n    <span class=\"nx\">image<\/span>                       <span class=\"p\">=<\/span> <span class=\"s2\">\"aws\/codebuild\/standard:2.0\"<\/span>\r\n    <span class=\"nx\">type<\/span>                        <span class=\"p\">=<\/span> <span class=\"s2\">\"LINUX_CONTAINER\"<\/span>\r\n    <span class=\"nx\">image_pull_credentials_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"CODEBUILD\"<\/span>\r\n    <span class=\"nx\">privileged_mode<\/span>             <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">logs_config<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">cloudwatch_logs<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">status<\/span>      <span class=\"p\">=<\/span> <span class=\"s2\">\"ENABLED\"<\/span>\r\n      <span class=\"nx\">group_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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n      <span class=\"nx\">stream_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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">source<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">type<\/span>            <span class=\"p\">=<\/span> <span class=\"s2\">\"CODECOMMIT\"<\/span>\r\n    <span class=\"nx\">buildspec<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"buildspec_admin.yml\"<\/span>\r\n    <span class=\"nx\">git_clone_depth<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">1<\/span>\r\n    <span class=\"nx\">location<\/span>        <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">application_sources_repository_name<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/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_iam_policy_document\"<\/span> <span class=\"s2\">\"codebuild_admin\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"codebuild:BatchGetBuilds\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codebuild:StartBuild\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">resources<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"nx\">aws_codebuild_project<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u5efa\u7b51\u8bbe\u7f6e<\/h5>\n<p>\u5728\u5e94\u7528\u7a0b\u5e8f\u7528\u7684CodeCommit\u4ee3\u7801\u5e93\u4e2d\u521b\u5efa\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"m\">0.2<\/span>\r\n<span class=\"na\">phases<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">install<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">runtime-versions<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">docker<\/span><span class=\"pi\">:<\/span> <span class=\"m\">18<\/span>\r\n    <span class=\"na\">commands<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">echo Install started on `date`<\/span>\r\n    <span class=\"na\">finally<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">echo Install completed on `date`<\/span>\r\n  <span class=\"na\">pre_build<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">commands<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">echo PreBuild started on `date`<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.\/gradlew clean test --info<\/span>\r\n    <span class=\"na\">finally<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">echo PreBuild completed on `date`<\/span>\r\n  <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">commands<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">echo Build started on `date`<\/span>\r\n    <span class=\"na\">finally<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">echo Build completed on `date`<\/span>\r\n  <span class=\"na\">post_build<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">commands<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">echo PostBuild started on `date`<\/span>\r\n    <span class=\"na\">finally<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">echo PostBuild completed on `date`<\/span>\r\n<\/code><\/pre>\n<h4>\u901a\u8fc7CodePipeline\u89e6\u53d1CodeBuild\u5f00\u59cb\u6784\u5efa<\/h4>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"application_sources_target_branch\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"stage\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role\"<\/span> <span class=\"s2\">\"codepipeline_application_sources\"<\/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\">-codepipeline-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">assume_role_policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_assume_role_policy_json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy\"<\/span> <span class=\"s2\">\"codecommit_codepipeline_application_sources\"<\/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\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam<\/span><span class=\"p\">.<\/span><span class=\"nx\">codecommit_application_sources_policy_json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy\"<\/span> <span class=\"s2\">\"s3_codepipeline_application_sources\"<\/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\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">s3_codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy\"<\/span> <span class=\"s2\">\"kms_codepipeline_application_sources\"<\/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\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam<\/span><span class=\"p\">.<\/span><span class=\"nx\">kms_policy_json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy\"<\/span> <span class=\"s2\">\"codebuild_admin_codepipeline_application_sources\"<\/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\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codebuild_admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_codepipeline\"<\/span> <span class=\"s2\">\"application_sources\"<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">role_arn<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_iam_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n\r\n  <span class=\"nx\">artifact_store<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">location<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">bucket<\/span>\r\n    <span class=\"nx\">type<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"S3\"<\/span>\r\n    <span class=\"nx\">encryption_key<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">id<\/span>   <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">kms<\/span><span class=\"p\">.<\/span><span class=\"nx\">alias_arn<\/span>\r\n      <span class=\"nx\">type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"KMS\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">stage<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-source\"<\/span>\r\n\r\n    <span class=\"nx\">action<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-source-action\"<\/span>\r\n      <span class=\"nx\">category<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"Source\"<\/span>\r\n      <span class=\"nx\">owner<\/span>            <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\"<\/span>\r\n      <span class=\"k\">provider<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"CodeCommit\"<\/span>\r\n      <span class=\"nx\">version<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"1\"<\/span>\r\n      <span class=\"nx\">output_artifacts<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"SOURCE\"<\/span><span class=\"p\">]<\/span>\r\n\r\n      <span class=\"nx\">configuration<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">PollForSourceChanges<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"false\"<\/span>\r\n        <span class=\"nx\">RepositoryName<\/span>       <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">application_sources_repository_name<\/span>\r\n        <span class=\"nx\">BranchName<\/span>           <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">application_sources_target_branch<\/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=\"nx\">stage<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-build-admin\"<\/span>\r\n\r\n    <span class=\"nx\">action<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-build-admin-action\"<\/span>\r\n      <span class=\"nx\">category<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"Build\"<\/span>\r\n      <span class=\"nx\">owner<\/span>            <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\"<\/span>\r\n      <span class=\"k\">provider<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"CodeBuild\"<\/span>\r\n      <span class=\"nx\">input_artifacts<\/span>  <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"SOURCE\"<\/span><span class=\"p\">]<\/span>\r\n      <span class=\"nx\">output_artifacts<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"ADMIN_BUILD\"<\/span><span class=\"p\">]<\/span>\r\n      <span class=\"nx\">version<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"1\"<\/span>\r\n\r\n      <span class=\"nx\">configuration<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">ProjectName<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_codebuild_project<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/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<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u786e\u8ba4\u884c\u52a8<\/h5>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws codepipeline start-pipeline-execution <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--name<\/span> terraform-sample-application-sources-stage <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"pipelineExecutionId\"<\/span>: <span class=\"s2\">\"AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE\"<\/span>\r\n<span class=\"o\">}<\/span>\r\n<span class=\"nv\">$ <\/span>aws codepipeline get-pipeline-execution <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--pipeline-name<\/span> terraform-sample-application-sources-stage <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--pipeline-execution-id<\/span> AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"pipelineExecution.status\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"s2\">\"Succeeded\"<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u6210\u529f\u4e86\uff0c\u90a3\u5c31\u6b63\u5e38\u4e86\u3002<\/p>\n<h4>\u68c0\u6d4b\u5230\u5bf9CodeCommit\u5b58\u50a8\u5e93\u4e2d\u76ee\u6807\u5206\u652f\u7684\u63a8\u9001\u3002<\/h4>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role\"<\/span> <span class=\"s2\">\"codepipeline_application_sources_cloudwatch\"<\/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\">-codepipeline-application-sources-cloudwatch-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">assume_role_policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudwatch_assume_role_policy_json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"codepipeline_application_sources_cloudwatch\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"codepipeline:StartPipelineExecution\"<\/span><span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">resources<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"nx\">aws_codepipeline<\/span><span class=\"p\">.<\/span><span class=\"nx\">application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><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\"<\/span> <span class=\"s2\">\"codepipeline_application_sources_cloudwatch\"<\/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\">codepipeline_application_sources_cloudwatch<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_application_sources_cloudwatch<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_cloudwatch_event_rule\"<\/span> <span class=\"s2\">\"codepipeline_application_sources\"<\/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\">-codepipeline-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">event_pattern<\/span> <span class=\"p\">=<\/span> <span class=\"o\">&lt;&lt;<\/span><span class=\"no\">PATTERN<\/span><span class=\"sh\">\r\n  {\r\n    \"source\": [\r\n      \"aws.codecommit\"\r\n    ],\r\n    \"detail-type\": [\r\n      \"CodeCommit Repository State Change\"\r\n    ],\r\n    \"resources\": [\r\n      \"${var.application_sources_repository_arn}\"\r\n    ],\r\n    \"detail\": {\r\n      \"event\": [\r\n        \"referenceCreated\",\r\n        \"referenceUpdated\"\r\n      ],\r\n      \"referenceType\": [\r\n        \"branch\"\r\n      ],\r\n      \"referenceName\": [\r\n        \"${var.application_sources_target_branch}\"\r\n      ]\r\n    }\r\n  }\r\n<\/span><span class=\"no\">PATTERN\r\n<\/span><span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_cloudwatch_event_target\"<\/span> <span class=\"s2\">\"codepipeline_application_sources\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">rule<\/span>      <span class=\"p\">=<\/span> <span class=\"nx\">aws_cloudwatch_event_rule<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">target_id<\/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\">-codepipeline-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">arn<\/span>       <span class=\"p\">=<\/span> <span class=\"nx\">aws_codepipeline<\/span><span class=\"p\">.<\/span><span class=\"nx\">application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n  <span class=\"nx\">role_arn<\/span>  <span class=\"p\">=<\/span> <span class=\"nx\">aws_iam_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_application_sources_cloudwatch<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u786e\u8ba4\u6d3b\u52a8<\/h5>\n<ol>\u5c06\u66f4\u6539\u63a8\u9001\u5230\u901a\u8fc7var.static_contents_target_branch\u6307\u5b9a\u7684\u5206\u652f\u3002\u8bf7\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u8fdb\u884c\u786e\u8ba4\u3002<\/ol>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws codepipeline list-pipeline-executions <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--pipeline-name<\/span> terraform-sample-application-sources-stage <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"pipelineExecutionSummaries\"<\/span>: <span class=\"o\">[<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"pipelineExecutionId\"<\/span>: <span class=\"s2\">\"YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY\"<\/span>,\r\n            <span class=\"s2\">\"status\"<\/span>: <span class=\"s2\">\"Succeeded\"<\/span>,\r\n            <span class=\"s2\">\"startTime\"<\/span>: BBBBBBBBBB.BBB,\r\n            <span class=\"s2\">\"lastUpdateTime\"<\/span>: BBBBBBBBBB.BBB,\r\n            <span class=\"s2\">\"sourceRevisions\"<\/span>: <span class=\"o\">[<\/span>\r\n                <span class=\"o\">{<\/span>\r\n                    <span class=\"s2\">\"actionName\"<\/span>: <span class=\"s2\">\"terraform-sample-application-sources-stage-source-action\"<\/span>,\r\n                    <span class=\"s2\">\"revisionId\"<\/span>: <span class=\"s2\">\"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\"<\/span>,\r\n                    <span class=\"s2\">\"revisionSummary\"<\/span>: <span class=\"s2\">\"Test commit\"<\/span>,\r\n                    <span class=\"s2\">\"revisionUrl\"<\/span>: <span class=\"s2\">\"https:\/\/ap-northeast-1.console.aws.amazon.com\/codecommit\/home#\/repository\/terraform-sample-application-sources\/commit\/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\"<\/span>\r\n                <span class=\"o\">}<\/span>\r\n            <span class=\"o\">]<\/span>,\r\n            <span class=\"s2\">\"trigger\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"triggerType\"<\/span>: <span class=\"s2\">\"CloudWatchEvent\"<\/span>,\r\n                <span class=\"s2\">\"triggerDetail\"<\/span>: <span class=\"s2\">\"arn:aws:events:ap-northeast-1:338927112236:rule\/terraform-sample-codepipeline-application-sources-stage\"<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span>,\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"s2\">\"pipelineExecutionId\"<\/span>: <span class=\"s2\">\"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\"<\/span>,\r\n            <span class=\"s2\">\"status\"<\/span>: <span class=\"s2\">\"Succeeded\"<\/span>,\r\n            <span class=\"s2\">\"startTime\"<\/span>: AAAAAAAAAA.AAA,\r\n            <span class=\"s2\">\"lastUpdateTime\"<\/span>: AAAAAAAAAA.AAA,\r\n            <span class=\"s2\">\"sourceRevisions\"<\/span>: <span class=\"o\">[<\/span>\r\n                <span class=\"o\">{<\/span>\r\n                    <span class=\"s2\">\"actionName\"<\/span>: <span class=\"s2\">\"terraform-sample-application-sources-stage-source-action\"<\/span>,\r\n                    <span class=\"s2\">\"revisionId\"<\/span>: <span class=\"s2\">\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"<\/span>,\r\n                    <span class=\"s2\">\"revisionSummary\"<\/span>: <span class=\"s2\">\"Initial commit\"<\/span>,\r\n                    <span class=\"s2\">\"revisionUrl\"<\/span>: <span class=\"s2\">\"https:\/\/ap-northeast-1.console.aws.amazon.com\/codecommit\/home#\/repository\/terraform-sample-static-contents\/commit\/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"<\/span>\r\n                <span class=\"o\">}<\/span>\r\n            <span class=\"o\">]<\/span>,\r\n            <span class=\"s2\">\"trigger\"<\/span>: <span class=\"o\">{<\/span>\r\n                <span class=\"s2\">\"triggerType\"<\/span>: <span class=\"s2\">\"StartPipelineExecution\"<\/span>,\r\n                <span class=\"s2\">\"triggerDetail\"<\/span>: <span class=\"s2\">\"arn:aws:iam::XXXXXXXXXXXX:user\/terraform-sample\"<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">]<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u89e6\u53d1\u7c7b\u578b\u4e3a&#8221;CloudWatchEvent&#8221;\u7684\u6267\u884c\u8bb0\u5f55\u7684\u72b6\u6001\u4e3a&#8221;Succeeded&#8221;\uff0c\u5219\u8868\u793a\u6b63\u5e38\u3002<\/p>\n<h3>\u5e94\u7528\u7a0b\u5e8f\u670d\u52a1\u5668<\/h3>\n<h4>\u5b50\u7f51<\/h4>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"nx\">availability_zone_c<\/span>  <span class=\"err\">=<\/span> <span class=\"s2\">\"ap-northeast-1c\"<\/span>\r\n<span class=\"nx\">private_cidr_block_a<\/span> <span class=\"err\">=<\/span> <span class=\"s2\">\"10.1.2.0\/24\"<\/span>\r\n<span class=\"nx\">private_cidr_block_c<\/span> <span class=\"err\">=<\/span> <span class=\"s2\">\"10.1.3.0\/24\"<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"availability_zone_c\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"private_cidr_block_a\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"private_cidr_block_c\"<\/span> <span class=\"p\">{}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"availability_zone_c\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"private_cidr_block_a\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"private_cidr_block_c\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_subnet\"<\/span> <span class=\"s2\">\"private_a\"<\/span> <span class=\"p\">{<\/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\">cidr_block<\/span>        <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_cidr_block_a<\/span>\r\n  <span class=\"nx\">availability_zone<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">availability_zone_a<\/span>\r\n\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\">-private-a\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"private_a_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_a<\/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_subnet\"<\/span> <span class=\"s2\">\"private_c\"<\/span> <span class=\"p\">{<\/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\">cidr_block<\/span>        <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_cidr_block_c<\/span>\r\n  <span class=\"nx\">availability_zone<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">availability_zone_c<\/span>\r\n\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\">-private-c\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"private_c_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_c<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>#-- \u4e2d\u7565 --#\r\n<span class=\"p\">module \"subnet\" {\r\n<\/span>  source               = \"..\/modules\/subnet\"\r\n  app_name             = var.app_name\r\n  vpc_id               = module.vpc.id\r\n  availability_zone_a  = var.availability_zone_a\r\n<span class=\"gi\">+ availability_zone_c  = var.availability_zone_c\r\n<\/span>  public_cidr_block_a  = var.public_cidr_block_a\r\n<span class=\"gi\">+ private_cidr_block_a = var.private_cidr_block_a\r\n+ private_cidr_block_c = var.private_cidr_block_c\r\n<\/span>}\r\n#-- \u4e2d\u7565 --#\r\n<\/code><\/pre>\n<h4>\u4e91\u7aef\u670d\u52a1\u5668 EC2 (Elastic Compute Cloud)<\/h4>\n<h5>\u521b\u5efa\u7528\u4e8e\u8bbf\u95eeEC2\u7684\u5bc6\u94a5\u5bf9\u3002<\/h5>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws ec2 create-key-pair <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--key-name<\/span> terraform-sample-stage <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s1\">'KeyMaterial'<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--output<\/span> text <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample <span class=\"o\">&gt;<\/span> certs\/terraform-sample-stage.pem\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">chmod <\/span>400 certs\/terraform-sample-stage.pem\r\n<\/code><\/pre>\n<h6>\u5728\u8e0f\u677f\u670d\u52a1\u5668\u4e0a\u5b89\u88c5\uff0c\u5e76\u4ece\u672c\u5730\u5220\u9664\u3002<\/h6>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>ssh <span class=\"nt\">-i<\/span> certs\/terraform-sample-jump.pem ec2-user@XXX.XXX.XXX.XXX <span class=\"s2\">\"mkdir ~\/.ssh\/pem\"<\/span>\r\n<span class=\"nv\">$ <\/span>scp <span class=\"nt\">-i<\/span> certs\/terraform-sample-jump.pem certs\/terraform-sample-stage.pem ec2-user@XXX.XXX.XXX.XXX:~\/.ssh\/pem\r\n<span class=\"nv\">$ <\/span>ssh <span class=\"nt\">-i<\/span> certs\/terraform-sample-jump.pem ec2-user@XXX.XXX.XXX.XXX <span class=\"s2\">\"chmod 600 ~\/.ssh\/pem\/terraform-sample-stage.pem\"<\/span>\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">rm<\/span> <span class=\"nt\">-f<\/span> certs\/terraform-sample-stage.pem\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"key_name\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">default<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"terraform-sample-stage\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u5b89\u5168\u7ec4<\/h5>\n<p>\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u5b89\u5168\u7ec4\uff0c\u8be5\u5b89\u5168\u7ec4\u4ec5\u5141\u8bb8\u6765\u81ea\u8df3\u677f\u670d\u52a1\u5668\u7684SSH\u8bbf\u95ee\u3002<br \/>\n\u6b64\u5916\uff0c\u6211\u4eec\u5c06\u6dfb\u52a0\u51fa\u7ad9\u89c4\u5219\uff0c\u4ee5\u4fbf\u8df3\u677f\u670d\u52a1\u5668\u53ef\u4ee5\u901a\u8fc7SSH\u8bbf\u95ee Stage \u5b9e\u4f8b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"vpc_cidr_block\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group_rule\"<\/span> <span class=\"s2\">\"jump_ssh_out\"<\/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\">jump<\/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\">22<\/span>\r\n  <span class=\"nx\">to_port<\/span>           <span class=\"p\">=<\/span> <span class=\"mi\">22<\/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=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_cidr_block<\/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\"<\/span> <span class=\"s2\">\"from_jump\"<\/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\">-from-jump\"<\/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\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\">-from-jump\"<\/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_security_group_rule\"<\/span> <span class=\"s2\">\"from_jump_ssh\"<\/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\">from_jump<\/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\">22<\/span>\r\n  <span class=\"nx\">to_port<\/span>                  <span class=\"p\">=<\/span> <span class=\"mi\">22<\/span>\r\n  <span class=\"nx\">protocol<\/span>                 <span class=\"p\">=<\/span> <span class=\"s2\">\"tcp\"<\/span>\r\n  <span class=\"nx\">source_security_group_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">jump<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"from_jump_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">from_jump<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>#-- \u4e2d\u7565 --#\r\n<span class=\"p\">module \"security_group\" {\r\n<\/span>  source         = \"..\/modules\/security_group\"\r\n  app_name       = var.app_name\r\n  vpc_id         = module.vpc.id\r\n<span class=\"gi\">+ vpc_cidr_block = var.vpc_cidr_block\r\n<\/span>}\r\n#-- \u4e2d\u7565 --#\r\n<\/code><\/pre>\n<h5>\u4e9a\u9a6c\u900a\u4e91\u8ba1\u7b97(EC2)\u5b9e\u4f8b<\/h5>\n<p>\u7a0d\u540e\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u5b9e\u4f8b\u4f5c\u4e3aApplicationLoadBalancer\u7684AutoScalingGroup\u7684\u6a21\u677f\uff0c\u5e76\u521b\u5efa\u4e00\u4e2aAMI\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_instance\"<\/span> <span class=\"s2\">\"admin\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">ami<\/span>                    <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-011facbea5ec0363b\"<\/span>\r\n  <span class=\"nx\">instance_type<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"t2.small\"<\/span>\r\n  <span class=\"nx\">availability_zone<\/span>      <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">availability_zone_a<\/span>\r\n  <span class=\"nx\">key_name<\/span>               <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">key_name<\/span>\r\n  <span class=\"nx\">monitoring<\/span>             <span class=\"p\">=<\/span> <span class=\"s2\">\"false\"<\/span>\r\n  <span class=\"nx\">subnet_id<\/span>              <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_a_id<\/span>\r\n  <span class=\"nx\">vpc_security_group_ids<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">from_jump_id<\/span><span class=\"p\">]<\/span>\r\n\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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u83b7\u53d6Stage\u670d\u52a1\u5668\u7684\u79c1\u6709IP\u5730\u5740\u3002<\/h5>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws ec2 describe-instances <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--filter<\/span> <span class=\"s2\">\"Name=tag:Name,Values=terraform-sample-admin-stage\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"Reservations[0].Instances[0].PrivateIpAddress\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"s2\">\"YYY.YYY.YYY.YYY\"<\/span>\r\n<\/code><\/pre>\n<h5>\u8bf7\u786e\u8ba4\u8fde\u63a5<\/h5>\n<p>\u5982\u679c\u80fd\u591f\u8fde\u63a5\u5982\u4e0b\u6240\u793a\uff0c\u5219\u4e3a\u6b63\u786e\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>ssh <span class=\"nt\">-i<\/span> certs\/terraform-sample-stage.pem ec2-user@XXX.XXX.XXX.XXX\r\n<span class=\"o\">[<\/span>ec2-user@ip-XXX-XXX-XXX-XXX ~]<span class=\"nv\">$ <\/span>ssh <span class=\"nt\">-i<\/span> ~\/.ssh\/pem\/terraform-sample-stage.pem ec2-user@YYY.YYY.YYY.YYY\r\nThe authenticity of host <span class=\"s1\">'YYY.YYY.YYY.YYY (YYY.YYY.YYY.YYY)'<\/span> can<span class=\"s1\">'t be established.\r\nECDSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXX\r\nECDSA key fingerprint is MD5:XXXXXXXXXXXXXXXXXXXXXXXXXX\r\nAre you sure you want to continue connecting (yes\/no)? yes\r\nWarning: Permanently added '<\/span>YYY.YYY.YYY.YYY<span class=\"s1\">' (ECDSA) to the list of known hosts.\r\n\r\n       __|  __|_  )\r\n       _|  (     \/   Amazon Linux 2 AMI\r\n      ___|\\___|___|\r\n\r\nhttps:\/\/aws.amazon.com\/amazon-linux-2\/\r\n[ec2-user@ip-YYY-YYY-YYY-YYY ~]$\r\n<\/span><\/code><\/pre>\n<p>\u8bf7\u786e\u8ba4\u60a8\u662f\u5426\u786e\u5b9a\u8981\u7ee7\u7eed\u8fde\u63a5\uff08\u662f\/\u5426\uff09\uff1f\u8bf7\u952e\u5165\u201c\u662f\u201d\u4ee5\u7ee7\u7eed\u3002<\/p>\n<h4>CodeDeploy\u4ee3\u7406<\/h4>\n<p>\u4e3a\u4e86\u80fd\u591f\u8fdb\u884c\u81ea\u52a8\u90e8\u7f72\uff0c\u6211\u4eec\u5c06\u901a\u8fc7yum\u548cwget\u5b89\u88c5agent\u6765\u914d\u7f6eCodeDeploy\u3002<\/p>\n<h5>\u4f7f\u5e94\u7528\u670d\u52a1\u5668\u80fd\u591f\u8fde\u63a5\u5230\u4e92\u8054\u7f51\u3002<\/h5>\n<p>\u901a\u8fc7\u5728\u516c\u5171\u5b50\u7f51\u4e0a\u8bbe\u7f6eNAT\u7f51\u5173\uff0c\u5e76\u5c06\u5176\u914d\u7f6e\u4e3a\u79c1\u6709\u5b50\u7f51\u7684\u9ed8\u8ba4\u8def\u7531\uff0c\u5c06\u4f7f\u5f97\u79c1\u6709\u5b50\u7f51\u5185\u7684EC2\u5b9e\u4f8b\u80fd\u591f\u8bbf\u95ee\u4e92\u8054\u7f51\u3002<br \/>\n\u53c2\u8003:<br \/>\n\u4f7f\u7528Terraform\u6784\u5efa\u516c\u5171\u5b50\u7f51 \u00b7 mzumi&#8217;s\u535a\u5ba2<br \/>\n\u4f7f\u7528Terraform\u6784\u5efa\u79c1\u6709\u5b50\u7f51 \u00b7 mzumi&#8217;s\u535a\u5ba2<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_eip\"<\/span> <span class=\"s2\">\"nat\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">vpc<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n\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\">-nat\"<\/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\"<\/span> <span class=\"p\">{<\/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\">nat<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/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_a<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n\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=\"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<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route_table\"<\/span> <span class=\"s2\">\"private\"<\/span> <span class=\"p\">{<\/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\r\n  <span class=\"nx\">route<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">cidr_block<\/span>     <span class=\"p\">=<\/span> <span class=\"s2\">\"0.0.0.0\/0\"<\/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<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\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\">-private\"<\/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_association\"<\/span> <span class=\"s2\">\"private_a\"<\/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_a<\/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<\/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_c\"<\/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_c<\/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<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h6>\u521b\u5efa\u4e00\u4e2a\u8bbe\u7f6e\u4e86Yum\u548cWget\u7684\u51fa\u7ad9\u89c4\u5219\u7684\u5b89\u5168\u7ec4\u3002<\/h6>\n<p>\u4f7fEC2\u80fd\u591f\u5c06 http\u3001https \u548c DNS \u8bf7\u6c42\u53d1\u9001\u5230\u4e92\u8054\u7f51\u4e0a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group\"<\/span> <span class=\"s2\">\"allow_internet\"<\/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\">-allow-internet\"<\/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\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\">-allow-internet\"<\/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_security_group_rule\"<\/span> <span class=\"s2\">\"allow_internet_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\">allow_internet<\/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\">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\">\"allow_internet_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\">allow_internet<\/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\">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_security_group_rule\"<\/span> <span class=\"s2\">\"allow_internet_dns\"<\/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\">allow_internet<\/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\">53<\/span>\r\n  <span class=\"nx\">to_port<\/span>           <span class=\"p\">=<\/span> <span class=\"mi\">53<\/span>\r\n  <span class=\"nx\">protocol<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"udp\"<\/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\">output<\/span> <span class=\"s2\">\"allow_internet_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">allow_internet<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h6>\u5411EC2\u6dfb\u52a0\u5b89\u5168\u7ec4<\/h6>\n<pre class=\"post-pre\"><code><span class=\"p\">resource \"aws_instance\" \"admin\" {\r\n<\/span>  ami                    = \"ami-011facbea5ec0363b\"\r\n  instance_type          = \"t2.small\"\r\n  availability_zone      = var.availability_zone_a\r\n  key_name               = var.key_name\r\n  monitoring             = \"false\"\r\n  subnet_id              = module.subnet.private_a_id\r\n<span class=\"gd\">- vpc_security_group_ids = [module.security_group.from_jump_id]\r\n<\/span><span class=\"gi\">+ vpc_security_group_ids = [module.security_group.from_jump_id, module.security_group.allow_internet_id]\r\n<\/span>\r\n  tags = {\r\n    Name = \"${var.app_name}-admin-${terraform.workspace}\"\r\n  }\r\n}\r\n<\/code><\/pre>\n<h5>\u83b7\u53d6yum\u66f4\u65b0\u6240\u9700\u7684\u5305\u3002<\/h5>\n<p>\u7528\u7ba1\u7406\u5458\u6743\u9650\u6267\u884c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# yum upgrade <span class=\"nt\">-y<\/span>\r\n<span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# yum <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> wget git ruby\r\n<span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# amazon-linux-extras <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> java-openjdk11\r\n<\/code><\/pre>\n<p>\u5982\u679c\u5c4f\u5e55\u4e0a\u663e\u793a\u201c\u5b8c\u6210\uff01\u201d\u6216\u201c\u5df2\u5b8c\u6210\uff01\u201d\uff0c\u90a3\u5c31\u8868\u793a\u6210\u529f\u3002<\/p>\n<h5>\u5b89\u88c5CodeDeploy\u4ee3\u7406<\/h5>\n<pre class=\"post-pre\"><code><span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# wget https:\/\/aws-codedeploy-ap-northeast-1.s3.amazonaws.com\/latest\/install\r\n<span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# <span class=\"nb\">chmod<\/span> +x .\/install\r\n<span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# .\/install auto\r\n<\/code><\/pre>\n<p>\u5982\u679c\u663e\u793a\u76f8\u5e94\u7684&#8221;complete!&#8221;\u6216\u8005&#8221;\u5b8c\u4e86!&#8221;\uff0c\u90a3\u5c31\u8868\u793a\u6210\u529f\u3002<\/p>\n<h4>\u4ee3\u7801\u90e8\u7f72 (Daima BuShu)<\/h4>\n<h5>\u5c06\u542f\u52a8\u7684SpringBoot\u5e94\u7528\u7a0b\u5e8f\u6ce8\u518c\u5230Systemctl\u4e2d\u3002<\/h5>\n<p>\u6839\u636e Qiita \u4e0a\u7684\u53c2\u8003\uff0c\u6211\u4eec\u5c06 \/var\/lib\/springboot\/boot.jar\uff08\u901a\u8fc7 CodeDeploy \u8fdb\u884c\u90e8\u7f72\u7684\u53ef\u6267\u884c Jar\uff09\u6ce8\u518c\u4e3a\u670d\u52a1\u6765\u8fd0\u884c SpringBoot \u5e94\u7528\u7a0b\u5e8f\u7684\u65b9\u6cd5\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# adduser application <span class=\"c\">#\u3000\u30b0\u30eb\u30fc\u30d7\u3082\u540c\u6642\u306b\u4f5c\u6210\u3055\u308c\u307e\u3059<\/span>\r\n<span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# <span class=\"nb\">id <\/span>application\r\n<span class=\"nv\">uid<\/span><span class=\"o\">=<\/span>1001<span class=\"o\">(<\/span>application<span class=\"o\">)<\/span> <span class=\"nv\">gid<\/span><span class=\"o\">=<\/span>1001<span class=\"o\">(<\/span>application<span class=\"o\">)<\/span> <span class=\"nb\">groups<\/span><span class=\"o\">=<\/span>1001<span class=\"o\">(<\/span>application<span class=\"o\">)<\/span>\r\n<span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# <span class=\"nb\">mkdir<\/span> \/var\/lib\/springboot\/\r\n<span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# <span class=\"nb\">mkdir<\/span> \/var\/lib\/springboot\/logs\r\n<span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# <span class=\"nb\">chown<\/span> <span class=\"nt\">-R<\/span> application:application \/var\/lib\/springboot\/\r\n<span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# <span class=\"nb\">cat<\/span> - <span class=\"o\">&lt;&lt;<\/span> <span class=\"no\">EOS<\/span><span class=\"sh\"> &gt;&gt; \/var\/lib\/springboot\/boot.conf\r\nexport JAVA_OPTS=\"-Dspring.profiles.active=stage\"\r\nexport LANG=\"ja_JP.utf8\"\r\n<\/span><span class=\"no\">EOS\r\n<\/span><span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# <span class=\"nb\">cat<\/span> - <span class=\"o\">&lt;&lt;<\/span> <span class=\"no\">EOS<\/span><span class=\"sh\"> &gt;&gt; \/etc\/systemd\/system\/springboot.service\r\n[Unit]\r\nDescription = springboot application\r\n[Service]\r\nExecStart = \/bin\/sh -c 'java -jar \/var\/lib\/springboot\/boot.jar &amp;&gt;&gt; \/var\/lib\/springboot\/logs\/stage.log'\r\nRestart = always\r\nType = simple\r\nUser = application\r\nGroup = application\r\nSuccessExitStatus = 143\r\n[Install]\r\nWantedBy = multi-user.target\r\n<\/span><span class=\"no\">EOS\r\n<\/span><span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# systemctl <span class=\"nb\">enable <\/span>springboot.service\r\n<\/code><\/pre>\n<h5>\u811a\u672c<\/h5>\n<p>\u8bf7\u5728\u5e94\u7528\u7a0b\u5e8f\u7684CodeCommit\u4ed3\u5e93\u4e2d\u521b\u5efa\u3002<br \/>\n\u6839\u636e\u73af\u5883\u7684\u4e0d\u540c\uff0c\u8bf7\u6dfb\u52a0\u76f8\u5e94\u7684\u547d\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">echo <\/span>application stop\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nb\">echo <\/span>before <span class=\"nb\">install\r\n<\/span>systemctl stop springboot.service\r\n<span class=\"nb\">rm<\/span> <span class=\"nt\">-f<\/span> \/var\/lib\/springboot\/boot.jar\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nb\">echo <\/span>after <span class=\"nb\">install<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nb\">echo <\/span>application start\r\nsystemctl start springboot.service\r\n<\/code><\/pre>\n<h5>\u8bbe\u5b9a\u6587\u4ef6<\/h5>\n<p>\u5728\u5e94\u7528\u7a0b\u5e8f\u7684CodeCommit\u4ee3\u7801\u5e93\u4e2d\u8fdb\u884c\u521b\u5efa\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"m\">0.0<\/span>\r\n<span class=\"na\">os<\/span><span class=\"pi\">:<\/span> <span class=\"s\">linux<\/span>\r\n<span class=\"na\">files<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"pi\">-<\/span> <span class=\"na\">source<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/boot.jar<\/span>\r\n    <span class=\"na\">destination<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/var\/lib\/springboot\/<\/span>\r\n<span class=\"na\">hooks<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">ApplicationStop<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">location<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/application_stop.sh<\/span>\r\n      <span class=\"na\">timeout<\/span><span class=\"pi\">:<\/span> <span class=\"m\">300<\/span>\r\n      <span class=\"na\">runas<\/span><span class=\"pi\">:<\/span> <span class=\"s\">root<\/span>\r\n  <span class=\"na\">BeforeInstall<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">location<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/before_install.sh<\/span>\r\n      <span class=\"na\">timeout<\/span><span class=\"pi\">:<\/span> <span class=\"m\">300<\/span>\r\n      <span class=\"na\">runas<\/span><span class=\"pi\">:<\/span> <span class=\"s\">root<\/span>\r\n  <span class=\"na\">AfterInstall<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">location<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/after_install.sh<\/span>\r\n      <span class=\"na\">timeout<\/span><span class=\"pi\">:<\/span> <span class=\"m\">300<\/span>\r\n      <span class=\"na\">runas<\/span><span class=\"pi\">:<\/span> <span class=\"s\">root<\/span>\r\n  <span class=\"na\">ApplicationStart<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">location<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/application_start.sh<\/span>\r\n      <span class=\"na\">timeout<\/span><span class=\"pi\">:<\/span> <span class=\"m\">300<\/span>\r\n      <span class=\"na\">runas<\/span><span class=\"pi\">:<\/span> <span class=\"s\">root<\/span>\r\n<\/code><\/pre>\n<h5>\u5c06\u6784\u5efa\u7ed3\u679c\u4fdd\u5b58\u5230S3\u4e2d\u7684CodeBuild\u3002<\/h5>\n<pre class=\"post-pre\"><code>#-- \u7701\u7565 --#\r\n  build:\r\n    commands:\r\n      - echo Build started on `date`\r\n<span class=\"gi\">+     - .\/gradlew admin:build -x test\r\n<\/span>    finally:\r\n      - echo Build completed on `date`\r\n  post_build:\r\n    commands:\r\n      - echo PostBuild started on `date`\r\n<span class=\"gi\">+     - cp -p admin\/build\/libs\/admin-0.0.1-SNAPSHOT.jar boot.jar\r\n<\/span>    finally:\r\n      - echo PostBuild completed on `date`\r\n<span class=\"gi\">+artifacts:\r\n+ files:\r\n+   - 'boot.jar'\r\n+   - 'appspec.yml'\r\n+   - 'data\/script\/*'\r\n+ discard-paths: yes\r\n<\/span><\/code><\/pre>\n<h5>CodeDeploy\u5e94\u7528\u7a0b\u5e8f<\/h5>\n<p>KEY: Deploy, Value: \u5e0c\u671b\u5c06\u5e26\u6709${var.app_name}-admin-${terraform.workspace}\u6807\u7b7e\u7684EC2\u90e8\u7f72\u4e3a\u76ee\u6807\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">resource \"aws_instance\" \"admin\" {\r\n<\/span>  ami                    = \"ami-011facbea5ec0363b\"\r\n  instance_type          = \"t2.small\"\r\n  availability_zone      = var.availability_zone_a\r\n  key_name               = var.key_name\r\n  monitoring             = \"false\"\r\n  subnet_id              = module.subnet.private_a_id\r\n  vpc_security_group_ids = [module.security_group.from_jump_id, module.security_group.allow_internet_id]\r\n\r\n  tags = {\r\n    Name   = \"${var.app_name}-admin-${terraform.workspace}\"\r\n<span class=\"gi\">+   Deploy = \"${var.app_name}-admin-${terraform.workspace}\"\r\n<\/span>  }\r\n}\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"codedeploy_assume_role\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"sts:AssumeRole\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">principals<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">identifiers<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"codedeploy.amazonaws.com\"<\/span><span class=\"p\">]<\/span>\r\n      <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"Service\"<\/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\"<\/span> <span class=\"s2\">\"codedeploy\"<\/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_name<\/span>\r\n  <span class=\"nx\">assume_role_policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codedeploy_assume_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"codedeploy_role_arn\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_iam_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">codedeploy<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"codedeploy\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"ec2:DescribeInstances\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"ec2:DescribeInstanceStatus\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"tag:GetTags\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"tag:GetResources\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n    <span class=\"nx\">resources<\/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\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy\"<\/span> <span class=\"s2\">\"codedeploy\"<\/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\">codedeploy<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codedeploy<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_codedeploy_app\"<\/span> <span class=\"s2\">\"admin\"<\/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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">compute_platform<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Server\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_codedeploy_deployment_group\"<\/span> <span class=\"s2\">\"admin\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">deployment_group_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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">app_name<\/span>               <span class=\"p\">=<\/span> <span class=\"nx\">aws_codedeploy_app<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">deployment_config_name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"CodeDeployDefault.OneAtATime\"<\/span>\r\n  <span class=\"nx\">service_role_arn<\/span>       <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam<\/span><span class=\"p\">.<\/span><span class=\"nx\">codedeploy_role_arn<\/span>\r\n  <span class=\"nx\">ec2_tag_filter<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">key<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"Deploy\"<\/span>\r\n    <span class=\"nx\">value<\/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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">type<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"KEY_AND_VALUE\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u5c06CodePipeline\u4e0e\u5176\u76f8\u5173\u8054\u3002<\/h5>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"codedeploy_codepipeline\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"codedeploy:CreateDeployment\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codedeploy:GetApplication\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codedeploy:GetApplicationRevision\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codedeploy:GetDeployment\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codedeploy:GetDeploymentConfig\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"codedeploy:RegisterApplicationRevision\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n    <span class=\"nx\">resources<\/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\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"codedeploy_codepipeline_policy_json\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codedeploy_codepipeline<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy\"<\/span> <span class=\"s2\">\"codedeploy_codepipeline_application_sources\"<\/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\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam<\/span><span class=\"p\">.<\/span><span class=\"nx\">codedeploy_codepipeline_policy_json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_codepipeline\"<\/span> <span class=\"s2\">\"application_sources\"<\/span> <span class=\"p\">{<\/span>\r\n<span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n  <span class=\"nx\">stage<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-source\"<\/span>\r\n<span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">stage<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-build-admin\"<\/span>\r\n<span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">stage<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-deploy-admin\"<\/span>\r\n\r\n    <span class=\"nx\">action<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-deploy-admin-action\"<\/span>\r\n      <span class=\"nx\">category<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"Deploy\"<\/span>\r\n      <span class=\"nx\">owner<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\"<\/span>\r\n      <span class=\"k\">provider<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"CodeDeploy\"<\/span>\r\n      <span class=\"nx\">input_artifacts<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"ADMIN_BUILD\"<\/span><span class=\"p\">]<\/span>\r\n      <span class=\"nx\">version<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"1\"<\/span>\r\n\r\n      <span class=\"nx\">configuration<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">ApplicationName<\/span>     <span class=\"p\">=<\/span> <span class=\"nx\">aws_codedeploy_app<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"nx\">DeploymentGroupName<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_codedeploy_deployment_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">deployment_group_name<\/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<\/code><\/pre>\n<h5>EC2\u6743\u9650\u8bbe\u7f6e\u3002<\/h5>\n<p>\u7531\u4e8eEC2\u4e0a\u5b89\u88c5\u7684CodeDeploy Agent\u65e0\u6cd5\u8bbf\u95ee\u5b58\u50a8\u4e86CodePipeline\u6784\u5efa\u7ed3\u679c\u7684S3\uff0c\u56e0\u6b64\u9700\u8981\u6dfb\u52a0\u5404\u79cd\u6743\u9650\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"ec2_assume_role\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"sts:AssumeRole\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">principals<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">identifiers<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"ec2.amazonaws.com\"<\/span><span class=\"p\">]<\/span>\r\n      <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"Service\"<\/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\">output<\/span> <span class=\"s2\">\"ec2_assume_role_policy_json\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">ec2_assume_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"s3_codepipeline_application_sources_codedeploy\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"s3:Get*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"s3:List*\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n    <span class=\"nx\">resources<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-us-east-2\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-us-east-1\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-us-west-1\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-us-west-2\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-ca-central-1\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-eu-west-1\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-eu-west-2\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-eu-west-3\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-eu-central-1\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-ap-east-1\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-ap-northeast-1\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-ap-northeast-2\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-ap-southeast-1\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-ap-southeast-2\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-ap-south-1\/*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"arn:aws:s3:::aws-codedeploy-sa-east-1\/*\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role\"<\/span> <span class=\"s2\">\"ec2_codedeploy\"<\/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\">-ec2-codedeploy-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">assume_role_policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam<\/span><span class=\"p\">.<\/span><span class=\"nx\">ec2_assume_role_policy_json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy\"<\/span> <span class=\"s2\">\"ec2_codedeploy\"<\/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\">ec2_codedeploy<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">s3_codepipeline_application_sources_codedeploy<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy\"<\/span> <span class=\"s2\">\"ec2_codedeploy_kms\"<\/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\">ec2_codedeploy<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam<\/span><span class=\"p\">.<\/span><span class=\"nx\">kms_policy_json<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_instance_profile\"<\/span> <span class=\"s2\">\"ec2_codedeploy\"<\/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\">-ec2-codedeploy-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/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\">ec2_codedeploy<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"p\">resource \"aws_instance\" \"admin\" {\r\n<\/span>  ami                    = \"ami-011facbea5ec0363b\"\r\n  instance_type          = \"t2.small\"\r\n  availability_zone      = var.availability_zone_a\r\n  key_name               = var.key_name\r\n  monitoring             = \"false\"\r\n  subnet_id              = module.subnet.private_a_id\r\n  vpc_security_group_ids = [module.security_group.from_jump_id, module.security_group.allow_internet_id]\r\n<span class=\"gi\">+ iam_instance_profile   = aws_iam_instance_profile.ec2_codedeploy.name\r\n<\/span>\r\n  tags = {\r\n    Name   = \"${var.app_name}-admin-${terraform.workspace}\"\r\n    Deploy = \"${var.app_name}-admin-${terraform.workspace}\"\r\n  }\r\n}\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n<span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"codepipeline_application_sources_bucket_policy\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <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\">principals<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">identifiers<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"nx\">aws_iam_role<\/span><span class=\"p\">.<\/span><span class=\"nx\">ec2_codedeploy<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"p\">]<\/span>\r\n      <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"nx\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"s3:Get*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"s3:List*\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n    <span class=\"nx\">resources<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/*\"<\/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_s3_bucket_policy\"<\/span> <span class=\"s2\">\"codepipeline-bucket\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">bucket<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codepipeline_application_sources_bucket_policy<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h6>\u91cd\u65b0\u542f\u52a8<\/h6>\n<p>\u7531\u4e8e\u5728EC2\u4e0a\u8bbe\u7f6e\u4e86IAM\u5b9e\u4f8b\u914d\u7f6e\u6587\u4ef6\uff0c\u6240\u4ee5\u9700\u8981\u91cd\u65b0\u542f\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws ec2 describe-instances <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--filter<\/span> <span class=\"s2\">\"Name=tag:Name,Values=terraform-sample-admin-stage\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"Reservations[0].Instances[0].InstanceId\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"s2\">\"i-XXXXXXXXXXXXXXXX\"<\/span>\r\n<span class=\"nv\">$ <\/span>aws ec2 reboot-instances <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--instance-ids<\/span> i-XXXXXXXXXXXXXXXX <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<\/code><\/pre>\n<h5>\u786e\u8ba4\u52a8\u4f5c<\/h5>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5c06\u66f4\u6539\u63a8\u9001\u5230\u7531var.static_contents_target_branch\u6307\u5b9a\u7684\u5206\u652f\u4e0a\u3002<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u8fdb\u884c\u786e\u8ba4\u3002<\/ol>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws deploy list-deployments <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--application-name<\/span> terraform-sample-admin-stage <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--deployment-group-name<\/span> terraform-sample-admin-stage <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"deployments[0]\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"s2\">\"d-XXXXXXXXX\"<\/span>\r\n<span class=\"nv\">$ <\/span>aws deploy get-deployment <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--deployment-id<\/span> d-XXXXXXXXX <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"deploymentInfo.status\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"s2\">\"Succeeded\"<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u6210\u529f\uff0c\u5219\u4e00\u5207\u6b63\u5e38\u3002<br \/>\n\u5982\u679c\u5931\u8d25\uff0c\u8bf7\u68c0\u67e5\u5e94\u7528\u7a0b\u5e8f\u670d\u52a1\u5668\u4e2d\u7684\/var\/log\/aws\/codedeploy-agent\/codedeploy-agent.log\u6216\/var\/log\/aws\/codedeploy-agent\/codedeploy-agent.YYYYMMDD.log\u3002<\/p>\n<p>\u67e5\u770b\u90e8\u7f72\u7684SpringBoot\u5e94\u7528\u7a0b\u5e8f\u7684\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# systemctl status springboot.service \r\n\u25cf springboot.service - springboot application\r\n   Loaded: loaded <span class=\"o\">(<\/span>\/etc\/systemd\/system\/springboot.service<span class=\"p\">;<\/span> disabled<span class=\"p\">;<\/span> vendor preset: disabled<span class=\"o\">)<\/span>\r\n   Active: active <span class=\"o\">(<\/span>running<span class=\"o\">)<\/span> since Fri YYYY-MM-DD HH:mm:SS UTC<span class=\"p\">;<\/span> XXs ago\r\n Main PID: XXXX <span class=\"o\">(<\/span>sh<span class=\"o\">)<\/span>\r\n   CGroup: \/system.slice\/springboot.service\r\n           \u251c\u2500XXXX \/bin\/sh <span class=\"nt\">-c<\/span> \/var\/lib\/springboot\/boot.jar &amp;&gt;&gt; \/var\/lib\/springboot\/logs\/stage.log\r\n           \u251c\u2500XXXX \/bin\/bash \/var\/lib\/springboot\/boot.jar\r\n           \u2514\u2500XXXX \/usr\/bin\/java <span class=\"nt\">-Dsun<\/span>.misc.URLClassPath.disableJarChecking<span class=\"o\">=<\/span><span class=\"nb\">true<\/span> <span class=\"nt\">-Dspring<\/span>.profiles.active<span class=\"o\">=<\/span>stage <span class=\"nt\">-jar<\/span> \/var\/lib\/springboot\/boot.jar\r\n<\/code><\/pre>\n<p>\u5982\u679c\u72c0\u614b\u70baactive (running)\uff0c\u5247\u8868\u793a\u6b63\u5e38\u3002<br \/>\n\u5982\u679c\u56e0java.net.SocketException: Permission denied\u800c\u767c\u751f\u932f\u8aa4\uff0c\u8acb\u5617\u8a66\u4ee5\u4e0b\u6307\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# <span class=\"nb\">echo<\/span> <span class=\"s1\">'net.ipv4.ip_unprivileged_port_start=0'<\/span> <span class=\"o\">&gt;&gt;<\/span> \/etc\/sysctl.conf\r\n<\/code><\/pre>\n<p>\u6211\u4f1a\u901a\u8fc7HTTP\u8fdb\u884c\u8bbf\u95ee\u786e\u8ba4\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">[<\/span>root@ip-YYY-YYY-YYY-YYY ~]# curl <span class=\"nt\">-o<\/span> \/dev\/null <span class=\"nt\">-w<\/span> <span class=\"s1\">'%{http_code}\\n'<\/span> <span class=\"nt\">-s<\/span> http:\/\/localhost\/login\r\n200\r\n<\/code><\/pre>\n<p>\u5982\u679c\u662f200\uff0c\u90a3\u5c31\u662f\u6b63\u5e38\u7684\u3002<\/p>\n<h5>\u5141\u8bb8\u6765\u81ea\u5e94\u7528\u7a0b\u5e8f\u670d\u52a1\u5668\u5916\u90e8\u7684HTTP\uff08HTTPS\uff09\u8bf7\u6c42\u3002<\/h5>\n<p>\u56e0\u4e3a\u5728\u5f53\u524d\u7684\u57fa\u7840\u67b6\u6784\u4e2d\uff0c\u6211\u4eec\u5c06\u4f7f\u7528CloudFront\u548cApplicationLoadBalancer(ALB)\u8fdb\u884cHTTPS\u8ba4\u8bc1\uff0c\u6240\u4ee5ALB-EC2\u5b9e\u4f8b\u4e4b\u95f4\u5c06\u901a\u8fc7HTTP\u8fdb\u884c\u8bbf\u95ee\u3002<br \/>\n\u7531\u4e8eALB\u5c1a\u672a\u521b\u5efa\uff0c\u6211\u4eec\u6682\u65f6\u5141\u8bb8\u6765\u81ea\u8df3\u677f\u670d\u52a1\u5668\u7684\u8bf7\u6c42\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group_rule\"<\/span> <span class=\"s2\">\"jump_http_out\"<\/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\">jump<\/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\">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=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc_cidr_block<\/span><span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group\"<\/span> <span class=\"s2\">\"application_server\"<\/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\">-application-server\"<\/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\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\">-application-server\"<\/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_security_group_rule\"<\/span> <span class=\"s2\">\"application_server_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\">application_server<\/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\">source_security_group_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">jump<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"application_server_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">application_server<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"p\">resource \"aws_instance\" \"admin\" {\r\n<\/span>  ami                    = \"ami-011facbea5ec0363b\"\r\n  instance_type          = \"t2.small\"\r\n  availability_zone      = var.availability_zone_a\r\n  key_name               = var.key_name\r\n  monitoring             = \"false\"\r\n  subnet_id              = module.subnet.private_a_id\r\n<span class=\"gd\">- vpc_security_group_ids = [module.security_group.from_jump_id, module.security_group.allow_internet_id]\r\n<\/span><span class=\"gi\">+ vpc_security_group_ids = [module.security_group.from_jump_id, module.security_group.allow_internet_id, module.security_group.application_server_id]\r\n<\/span>  iam_instance_profile   = aws_iam_instance_profile.ec2_codedeploy.name\r\n\r\n  tags = {\r\n    Name   = \"${var.app_name}-admin-${terraform.workspace}\"\r\n    Deploy = \"${var.app_name}-admin-${terraform.workspace}\"\r\n  }\r\n}\r\n<\/code><\/pre>\n<h6>\u8fdb\u884c\u884c\u52a8\u786e\u8ba4<\/h6>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>curl <span class=\"nt\">-o<\/span> \/dev\/null <span class=\"nt\">-w<\/span> <span class=\"s1\">'%{http_code}\\n'<\/span> <span class=\"nt\">-s<\/span> http:\/\/YYY.YYY.YYY.YYY\/login\r\n200\r\n<\/code><\/pre>\n<p>\u5982\u679c\u662f200\uff0c\u90a3\u5c31\u662f\u6b63\u5e38\u7684\u3002<\/p>\n<h4>\u5e94\u7528\u8d1f\u8f7d\u5747\u8861\u5668 (ALB)<\/h4>\n<h5>\u5b89\u5168\u7ec4<\/h5>\n<pre class=\"post-pre\"><code><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\">-alb\"<\/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\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\">-alb\"<\/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_security_group_rule\"<\/span> <span class=\"s2\">\"alb_http_in\"<\/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_http_out\"<\/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\">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\">source_security_group_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">application_server<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"security_group_alb_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/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=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>S3\u7528\u4e8e\u65e5\u5fd7<\/h5>\n<p>\u6839\u636e Elastic Load Balancing \u7684\u8bf4\u660e\uff0c\u5404\u4e2a\u5730\u533a\u7684 AWS \u8d26\u6237 ID \u8bbe\u7f6e\u6709\u6240\u4e0d\u540c\uff0c\u8fd9\u91cc\u6211\u4eec\u4f7f\u7528\u4e1c\u4eac\u5730\u533a\u7684\u8bbe\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code>#-- \u4e2d\u7565 --#\r\n<span class=\"p\">data \"aws_iam_policy_document\" \"s3_logs\" {\r\n<\/span>  statement {\r\n    effect    = \"Allow\"\r\n    actions   = [\"s3:PutObject\"]\r\n    resources = [\"${aws_s3_bucket.logs.arn}\/*\"]\r\n\r\n    principals {\r\n      type        = \"AWS\"\r\n<span class=\"gd\">-     identifiers = [var.cloudfront_origin_access_identity_iam_arn]\r\n<\/span><span class=\"gi\">+     identifiers = [\r\n+       var.cloudfront_origin_access_identity_iam_arn,\r\n+       \"arn:aws:iam::582318560864:root\"\r\n+     ]\r\n<\/span>    }\r\n  }\r\n}\r\n<\/code><\/pre>\n<h5>\u516c\u5171\u5b50\u7f51<\/h5>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"nx\">public_cidr_block_c<\/span>  <span class=\"err\">=<\/span> <span class=\"s2\">\"10.1.4.0\/24\"<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"public_cidr_block_c\"<\/span> <span class=\"p\">{}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">variable<\/span> <span class=\"s2\">\"availability_zone_c\"<\/span> <span class=\"p\">{}<\/span>\r\n<span class=\"k\">variable<\/span> <span class=\"s2\">\"public_cidr_block_c\"<\/span> <span class=\"p\">{}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_subnet\"<\/span> <span class=\"s2\">\"public_c\"<\/span> <span class=\"p\">{<\/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\">cidr_block<\/span>        <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_cidr_block_c<\/span>\r\n  <span class=\"nx\">availability_zone<\/span> <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">availability_zone_c<\/span>\r\n\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\">-public-c\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"public_c_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_c<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"gd\">-variable \"availability_zone_c\" {}\r\n<\/span><\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u4e2d\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_route_table_association\"<\/span> <span class=\"s2\">\"public_c\"<\/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_c<\/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<\/code><\/pre>\n<pre class=\"post-pre\"><code>#-- \u4e2d\u7565 --#\r\n<span class=\"p\">module \"subnet\" {\r\n<\/span>  source               = \"..\/modules\/subnet\"\r\n  app_name             = var.app_name\r\n  vpc_id               = module.vpc.id\r\n  availability_zone_a  = var.availability_zone_a\r\n  availability_zone_c  = var.availability_zone_c\r\n  public_cidr_block_a  = var.public_cidr_block_a\r\n<span class=\"gi\">+ public_cidr_block_c  = var.public_cidr_block_c\r\n<\/span>  private_cidr_block_a = var.private_cidr_block_a\r\n  private_cidr_block_c = var.private_cidr_block_c\r\n}\r\n#-- \u4e2d\u7565 --#\r\n<\/code><\/pre>\n<h5>ALB: \u963f\u5c14\u5df4\u5c3c\u4e9a<\/h5>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_lb\"<\/span> <span class=\"s2\">\"admin\"<\/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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">internal<\/span>                   <span class=\"p\">=<\/span> <span class=\"kc\">false<\/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=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">alb_id<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">subnets<\/span>                    <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_a_id<\/span><span class=\"p\">,<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">public_c_id<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">enable_http2<\/span>               <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"nx\">enable_deletion_protection<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n\r\n  <span class=\"nx\">access_logs<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">bucket<\/span>  <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">s3<\/span><span class=\"p\">.<\/span><span class=\"nx\">logs<\/span><span class=\"p\">.<\/span><span class=\"nx\">bucket<\/span>\r\n    <span class=\"nx\">prefix<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/alb\/admin\"<\/span>\r\n    <span class=\"nx\">enabled<\/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\">resource<\/span> <span class=\"s2\">\"aws_alb_target_group\"<\/span> <span class=\"s2\">\"admin\"<\/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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/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\">vpc_id<\/span>   <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">vpc<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n\r\n  <span class=\"nx\">health_check<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">interval<\/span>            <span class=\"p\">=<\/span> <span class=\"mi\">60<\/span>\r\n    <span class=\"nx\">path<\/span>                <span class=\"p\">=<\/span> <span class=\"s2\">\"\/login\"<\/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\">timeout<\/span>             <span class=\"p\">=<\/span> <span class=\"mi\">5<\/span>\r\n    <span class=\"nx\">unhealthy_threshold<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">2<\/span>\r\n    <span class=\"nx\">matcher<\/span>             <span class=\"p\">=<\/span> <span class=\"mi\">200<\/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_alb_listener\"<\/span> <span class=\"s2\">\"admin\"<\/span> <span class=\"p\">{<\/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\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/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\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\">\"forward\"<\/span>\r\n    <span class=\"nx\">target_group_arn<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_alb_target_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u5141\u8bb8\u4eceALB\u53d1\u9001HTTP\u8bf7\u6c42\u5230\u5e94\u7528\u670d\u52a1\u5668\u3002<\/h5>\n<pre class=\"post-pre\"><code>#-- \u4e2d\u7565 --#\r\n<span class=\"gd\">-resource \"aws_security_group_rule\" \"jump_http_out\" {\r\n-  security_group_id = aws_security_group.jump.id\r\n-  type              = \"egress\"\r\n-  from_port         = 80\r\n-  to_port           = 80\r\n-  protocol          = \"tcp\"\r\n-  cidr_blocks       = [var.vpc_cidr_block]\r\n-}\r\n<\/span><\/code><\/pre>\n<pre class=\"post-pre\"><code>#-- \u4e2d\u7565 --#\r\n<span class=\"p\">resource \"aws_security_group_rule\" \"application_server_http\" {\r\n<\/span>  security_group_id        = aws_security_group.application_server.id\r\n  type                     = \"ingress\"\r\n  from_port                = 80\r\n  to_port                  = 80\r\n  protocol                 = \"tcp\"\r\n<span class=\"gd\">- source_security_group_id = aws_security_group.jump.id\r\n<\/span><span class=\"gi\">+ source_security_group_id = aws_security_group.alb.id\r\n<\/span>}\r\n<\/code><\/pre>\n<h5>\u5c06ALB\u6dfb\u52a0\u5230\u76ee\u6807\u4e2d\u3002<\/h5>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_alb_target_group_attachment\"<\/span> <span class=\"s2\">\"admin\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">target_group_arn<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_alb_target_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n  <span class=\"nx\">target_id<\/span>        <span class=\"p\">=<\/span> <span class=\"nx\">aws_instance<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n  <span class=\"nx\">port<\/span>             <span class=\"p\">=<\/span> <span class=\"mi\">80<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u786e\u8ba4\u884c\u52a8<\/h5>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws elbv2 describe-load-balancers <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--names<\/span> terraform-sample-admin-stage <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"LoadBalancers[0].DNSName\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"s2\">\"terraform-sample-admin-stage-XXXXXXXX.ap-northeast-1.elb.amazonaws.com\"<\/span>\r\n<span class=\"nv\">$ <\/span>curl <span class=\"nt\">-o<\/span> \/dev\/null <span class=\"nt\">-w<\/span> <span class=\"s1\">'%{http_code}\\n'<\/span> <span class=\"nt\">-s<\/span> http:\/\/terraform-sample-admin-stage-XXXXXXXX.ap-northeast-1.elb.amazonaws.com\/login\r\n200\r\n<\/code><\/pre>\n<p>\u5982\u679c\u6570\u5b57\u662f200\u7684\u8bdd\uff0c\u5c31\u662f\u6b63\u5e38\u7684\u3002<\/p>\n<h5>\u5c06ALB\u4e0eCloudFront\u8fdb\u884c\u5173\u8054<\/h5>\n<p>\u6211\u4e4b\u524d\u5c06\u9ed8\u8ba4\u8bbe\u7f6e\u4e3a\u5f15\u7528S3\uff0c\u4f46\u73b0\u5728\u8981\u5c06ALB\u8bbe\u7f6e\u4e3a\u9ed8\u8ba4\uff0c\u5e76\u5c06\u53ea\u5f15\u7528S3\u7684\u9759\u6001\u5185\u5bb9\u8fdb\u884c\u66f4\u6539\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_cloudfront_distribution\"<\/span> <span class=\"s2\">\"admin\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">enabled<\/span>             <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"nx\">comment<\/span>             <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span>\r\n  <span class=\"nx\">default_root_object<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"index.html\"<\/span>\r\n\r\n  <span class=\"nx\">origin<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">origin_id<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"s3-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">domain_name<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">static_contents<\/span><span class=\"p\">.<\/span><span class=\"nx\">bucket_domain_name<\/span>\r\n\r\n    <span class=\"nx\">s3_origin_config<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">origin_access_identity<\/span> <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudfront<\/span><span class=\"p\">.<\/span><span class=\"nx\">origin_access_identity<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudfront_access_identity_path<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">origin<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">origin_id<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"alb-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">domain_name<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_lb<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">dns_name<\/span>\r\n\r\n    <span class=\"nx\">custom_origin_config<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">http_port<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">80<\/span>\r\n      <span class=\"nx\">https_port<\/span>               <span class=\"p\">=<\/span> <span class=\"mi\">443<\/span>\r\n      <span class=\"nx\">origin_protocol_policy<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"http-only\"<\/span>\r\n      <span class=\"nx\">origin_ssl_protocols<\/span>     <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"TLSv1\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"TLSv1.1\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"TLSv1.2\"<\/span><span class=\"p\">]<\/span>\r\n      <span class=\"nx\">origin_keepalive_timeout<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">60<\/span>\r\n      <span class=\"nx\">origin_read_timeout<\/span>      <span class=\"p\">=<\/span> <span class=\"mi\">60<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">ordered_cache_behavior<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">path_pattern<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"\/js\/*\"<\/span>\r\n    <span class=\"nx\">target_origin_id<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"s3-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">allowed_methods<\/span>        <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">cached_methods<\/span>         <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">compress<\/span>               <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n    <span class=\"nx\">viewer_protocol_policy<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"redirect-to-https\"<\/span>\r\n    <span class=\"nx\">default_ttl<\/span>            <span class=\"p\">=<\/span> <span class=\"mi\">3600<\/span>\r\n    <span class=\"nx\">min_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"nx\">max_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">86400<\/span>\r\n\r\n    <span class=\"nx\">forwarded_values<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">query_string<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n\r\n      <span class=\"nx\">cookies<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">forward<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"none\"<\/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=\"nx\">ordered_cache_behavior<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">path_pattern<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"\/css\/*\"<\/span>\r\n    <span class=\"nx\">target_origin_id<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"s3-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">allowed_methods<\/span>        <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">cached_methods<\/span>         <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">compress<\/span>               <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n    <span class=\"nx\">viewer_protocol_policy<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"redirect-to-https\"<\/span>\r\n    <span class=\"nx\">default_ttl<\/span>            <span class=\"p\">=<\/span> <span class=\"mi\">3600<\/span>\r\n    <span class=\"nx\">min_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"nx\">max_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">86400<\/span>\r\n\r\n    <span class=\"nx\">forwarded_values<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">query_string<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n\r\n      <span class=\"nx\">cookies<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">forward<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"none\"<\/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=\"nx\">ordered_cache_behavior<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">path_pattern<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"\/img\/*\"<\/span>\r\n    <span class=\"nx\">target_origin_id<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"s3-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">allowed_methods<\/span>        <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">cached_methods<\/span>         <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">compress<\/span>               <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n    <span class=\"nx\">viewer_protocol_policy<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"redirect-to-https\"<\/span>\r\n    <span class=\"nx\">default_ttl<\/span>            <span class=\"p\">=<\/span> <span class=\"mi\">3600<\/span>\r\n    <span class=\"nx\">min_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"nx\">max_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">86400<\/span>\r\n\r\n    <span class=\"nx\">forwarded_values<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">query_string<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n\r\n      <span class=\"nx\">cookies<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">forward<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"none\"<\/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=\"nx\">ordered_cache_behavior<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">path_pattern<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"*.html\"<\/span>\r\n    <span class=\"nx\">target_origin_id<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"s3-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">allowed_methods<\/span>        <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">cached_methods<\/span>         <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">compress<\/span>               <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n    <span class=\"nx\">viewer_protocol_policy<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"redirect-to-https\"<\/span>\r\n    <span class=\"nx\">default_ttl<\/span>            <span class=\"p\">=<\/span> <span class=\"mi\">3600<\/span>\r\n    <span class=\"nx\">min_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"nx\">max_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">86400<\/span>\r\n\r\n    <span class=\"nx\">forwarded_values<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">query_string<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n\r\n      <span class=\"nx\">cookies<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">forward<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"none\"<\/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=\"nx\">ordered_cache_behavior<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">path_pattern<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"favicon*\"<\/span>\r\n    <span class=\"nx\">target_origin_id<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"s3-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">allowed_methods<\/span>        <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">cached_methods<\/span>         <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">compress<\/span>               <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n    <span class=\"nx\">viewer_protocol_policy<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"redirect-to-https\"<\/span>\r\n    <span class=\"nx\">default_ttl<\/span>            <span class=\"p\">=<\/span> <span class=\"mi\">3600<\/span>\r\n    <span class=\"nx\">min_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"nx\">max_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">86400<\/span>\r\n\r\n    <span class=\"nx\">forwarded_values<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">query_string<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n\r\n      <span class=\"nx\">cookies<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">forward<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"none\"<\/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=\"nx\">ordered_cache_behavior<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">path_pattern<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"\/\"<\/span>\r\n    <span class=\"nx\">target_origin_id<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"s3-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">allowed_methods<\/span>        <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">cached_methods<\/span>         <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">compress<\/span>               <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n    <span class=\"nx\">viewer_protocol_policy<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"redirect-to-https\"<\/span>\r\n    <span class=\"nx\">default_ttl<\/span>            <span class=\"p\">=<\/span> <span class=\"mi\">3600<\/span>\r\n    <span class=\"nx\">min_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"nx\">max_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">86400<\/span>\r\n\r\n    <span class=\"nx\">forwarded_values<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">query_string<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n\r\n      <span class=\"nx\">cookies<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">forward<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"none\"<\/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=\"nx\">default_cache_behavior<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">target_origin_id<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"alb-<\/span><span class=\"k\">${<\/span><span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span><span class=\"k\">}<\/span><span class=\"s2\">-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">allowed_methods<\/span>        <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"DELETE\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"POST\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"OPTIONS\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"PUT\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"PATCH\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">cached_methods<\/span>         <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"GET\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">compress<\/span>               <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n    <span class=\"nx\">viewer_protocol_policy<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"redirect-to-https\"<\/span>\r\n    <span class=\"nx\">default_ttl<\/span>            <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"nx\">min_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"nx\">max_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n\r\n    <span class=\"nx\">forwarded_values<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">query_string<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n      <span class=\"nx\">headers<\/span>      <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"*\"<\/span><span class=\"p\">]<\/span>\r\n\r\n      <span class=\"nx\">cookies<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">forward<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"all\"<\/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=\"nx\">restrictions<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">geo_restriction<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">restriction_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"none\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">viewer_certificate<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">acm_certificate_arn<\/span>      <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">acm_certificate_arn<\/span>\r\n    <span class=\"nx\">ssl_support_method<\/span>       <span class=\"p\">=<\/span> <span class=\"s2\">\"sni-only\"<\/span>\r\n    <span class=\"nx\">minimum_protocol_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"TLSv1\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">logging_config<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">bucket<\/span>          <span class=\"p\">=<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">s3<\/span><span class=\"p\">.<\/span><span class=\"nx\">logs<\/span><span class=\"p\">.<\/span><span class=\"nx\">bucket_domain_name<\/span>\r\n    <span class=\"nx\">prefix<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/cloudfront\/admin\"<\/span>\r\n    <span class=\"nx\">include_cookies<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\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=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_domain<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u8bf7\u786e\u8ba4\u52a8\u4f5c<\/h5>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws cloudfront list-distributions <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"DistributionList.Items[0].DomainName\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"s2\">\"XXXXXXXXXXXXXX.cloudfront.net\"<\/span>\r\n<span class=\"nv\">$ <\/span>curl <span class=\"nt\">-o<\/span> \/dev\/null <span class=\"nt\">-w<\/span> <span class=\"s1\">'%{http_code}\\n'<\/span> <span class=\"nt\">-s<\/span> https:\/\/XXXXXXXXXXXXXX.cloudfront.net\/login\r\n200\r\n<\/code><\/pre>\n<p>200\u7684\u8bdd\u5c31\u662f\u6b63\u5e38\u7684\u3002<\/p>\n<h4>\u81ea\u52a8\u6269\u5c55\u7ec4\uff08ASG\uff09<\/h4>\n<p>\u7531\u4e8e\u53ef\u4ee5\u5728CodeDeploy\u4e0a\u5c06\u4ee3\u7801\u90e8\u7f72\u5230EC2\u4e0a\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u6784\u5efa\u4e00\u4e2a\u5047\u8bbe\u5728ASG\u4e2d\u8fd0\u884c\u7684\u7cfb\u7edf\u3002<\/p>\n<h5>\u83b7\u5f97AMI\u3002<\/h5>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws ec2 describe-instances <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--filter<\/span> <span class=\"s2\">\"Name=tag:Name,Values=terraform-sample-admin-stage\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"Reservations[0].Instances[0].InstanceId\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample <span class=\"se\">\\<\/span>\r\n<span class=\"s2\">\"i-XXXXXXXXXXXXX\"<\/span>\r\n<span class=\"nv\">$ <\/span>aws ec2 create-image <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--instance-id<\/span> i-XXXXXXXXXXXXX <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--reboot<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--name<\/span> <span class=\"s2\">\"\u4efb\u610f\u306eAMI\u540d\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"ImageId\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"s2\">\"ami-XXXXXXXXXXXXXXXXXX\"<\/span>\r\n<\/code><\/pre>\n<h5>\u542f\u52a8\u6a21\u677f<\/h5>\n<p>\u8fd9\u662f\u63cf\u8ff0 stage\/admin_ec2.tf \u6587\u4ef6\u9664\u7f51\u7edc\u90e8\u5206\u4e4b\u5916\u7684\u5185\u5bb9\u7684\u5f62\u8c61\u63cf\u8ff0\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_launch_template\"<\/span> <span class=\"s2\">\"admin\"<\/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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">description<\/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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">image_id<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"ami-096ca23b0da9b4e9d\"<\/span>\r\n  <span class=\"nx\">iam_instance_profile<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">arn<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_iam_instance_profile<\/span><span class=\"p\">.<\/span><span class=\"nx\">ec2_codedeploy<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">instance_type<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"t2.small\"<\/span>\r\n  <span class=\"nx\">key_name<\/span>                <span class=\"p\">=<\/span> <span class=\"kd\">var<\/span><span class=\"p\">.<\/span><span class=\"nx\">key_name<\/span>\r\n  <span class=\"nx\">vpc_security_group_ids<\/span>  <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">from_jump_id<\/span><span class=\"p\">,<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">allow_internet_id<\/span><span class=\"p\">,<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">application_server_id<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">disable_api_termination<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n  <span class=\"nx\">ebs_optimized<\/span>           <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n  <span class=\"nx\">monitoring<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">enabled<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">tag_specifications<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">resource_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"instance\"<\/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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n      <span class=\"nx\">Deploy<\/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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>ASG (Auto Scaling Group)<\/h5>\n<p>\u4ee5\u4e0b\u662f\u63cf\u8ff0 stage\/admin_ec2.tf \u6587\u4ef6\u4e2d\u7684\u7f51\u7edc\u90e8\u5206\u7684\u6982\u5ff5\u3002\u5728\u5b8c\u6210\u6b64\u90e8\u5206\u540e\uff0c\u5c06\u5220\u9664 stage_ec2.tf \u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_autoscaling_group\"<\/span> <span class=\"s2\">\"admin\"<\/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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">max_size<\/span>                  <span class=\"p\">=<\/span> <span class=\"mi\">10<\/span>\r\n  <span class=\"nx\">min_size<\/span>                  <span class=\"p\">=<\/span> <span class=\"mi\">1<\/span>\r\n  <span class=\"nx\">desired_capacity<\/span>          <span class=\"p\">=<\/span> <span class=\"mi\">1<\/span>\r\n  <span class=\"nx\">vpc_zone_identifier<\/span>       <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_a_id<\/span><span class=\"p\">,<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_c_id<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">default_cooldown<\/span>          <span class=\"p\">=<\/span> <span class=\"mi\">300<\/span>\r\n  <span class=\"nx\">health_check_grace_period<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">300<\/span>\r\n  <span class=\"nx\">health_check_type<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"ELB\"<\/span>\r\n  <span class=\"nx\">force_delete<\/span>              <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n  <span class=\"nx\">target_group_arns<\/span>         <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"nx\">aws_alb_target_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">termination_policies<\/span>      <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"Default\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">protect_from_scale_in<\/span>     <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n  <span class=\"nx\">launch_template<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">id<\/span>      <span class=\"p\">=<\/span> <span class=\"nx\">aws_launch_template<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n    <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"err\">$<\/span><span class=\"s2\">Latest\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u7f29\u653e\u8bbe\u7f6e<\/h5>\n<p>\u6211\u5011\u5c07\u5236\u5b9a\u4ee5\u4e0b\u898f\u5247\u3002<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5982\u679cASG\u7ec4\u5185\u6240\u6709\u5b9e\u4f8b\u5728\u6700\u8fd1\u76843\u5206\u949f\u4e2d\u76842\u5206\u949f\u5185\u5e73\u5747CPU\u4f7f\u7528\u7387\u4e3a50-70\uff05\uff0c\u5219\u589e\u52a0\u5b9e\u4f8b\u6570\u91cf50\uff05\u3002<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5982\u679cASG\u7ec4\u5185\u6240\u6709\u5b9e\u4f8b\u5728\u6700\u8fd1\u76843\u5206\u949f\u4e2d\u76842\u5206\u949f\u5185\u5e73\u5747CPU\u4f7f\u7528\u7387\u8d85\u8fc770\uff05\uff0c\u5219\u589e\u52a0\u5b9e\u4f8b\u6570\u91cf100\uff05\u3002<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\u5982\u679cASG\u7ec4\u5185\u6240\u6709\u5b9e\u4f8b\u5728\u6700\u8fd1\u76843\u5206\u949f\u4e2d\u76842\u5206\u949f\u5185\u5e73\u5747CPU\u4f7f\u7528\u7387\u4e3a30-40\uff05\uff0c\u5219\u51cf\u5c11\u5b9e\u4f8b\u6570\u91cf25\uff05\u3002<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\u5982\u679cASG\u7ec4\u5185\u6240\u6709\u5b9e\u4f8b\u5728\u6700\u8fd1\u76843\u5206\u949f\u4e2d\u76842\u5206\u949f\u5185\u5e73\u5747CPU\u4f7f\u7528\u7387\u4f4e\u4e8e30\uff05\uff0c\u5219\u51cf\u5c11\u5b9e\u4f8b\u6570\u91cf50\uff05\u3002<\/ol>\n<p>\u6211\u4e0d\u77e5\u9053\u5982\u4f55\u8bbe\u7f6e\u5b9e\u4f8b\u6570\u91cf\u7684\u6700\u5c0f\u548c\u6700\u5927\u503c\uff08\u4f8b\u5982\uff0c\u572810\u4e2a\u5b9e\u4f8b\u8fd0\u884c\u65f6\uff0c\u901a\u5e38\u4f1a\u589e\u52a05\u4e2a\u5b9e\u4f8b\uff0c\u4f46\u6700\u5c11\u8981\u589e\u52a07\u4e2a\u7b49\uff09\u3002\u5982\u679c\u6709\u4eba\u77e5\u9053\uff0c\u8bf7\u544a\u8bc9\u6211\uff0c\u8c22\u8c22\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_autoscaling_policy\"<\/span> <span class=\"s2\">\"admin_scaleout\"<\/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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-scaleout\"<\/span>\r\n  <span class=\"nx\">autoscaling_group_name<\/span>    <span class=\"p\">=<\/span> <span class=\"nx\">aws_autoscaling_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">adjustment_type<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"PercentChangeInCapacity\"<\/span>\r\n  <span class=\"nx\">policy_type<\/span>               <span class=\"p\">=<\/span> <span class=\"s2\">\"StepScaling\"<\/span>\r\n  <span class=\"nx\">estimated_instance_warmup<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">300<\/span>\r\n  <span class=\"nx\">metric_aggregation_type<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"Average\"<\/span>\r\n  <span class=\"nx\">step_adjustment<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">scaling_adjustment<\/span>          <span class=\"p\">=<\/span> <span class=\"mi\">50<\/span>\r\n    <span class=\"nx\">metric_interval_lower_bound<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"nx\">metric_interval_upper_bound<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">20<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">step_adjustment<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">scaling_adjustment<\/span>          <span class=\"p\">=<\/span> <span class=\"mi\">100<\/span>\r\n    <span class=\"nx\">metric_interval_lower_bound<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">20<\/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_cloudwatch_metric_alarm\"<\/span> <span class=\"s2\">\"admin_scaleout\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">alarm_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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-scaleout\"<\/span>\r\n  <span class=\"nx\">alarm_description<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"This metric monitors ec2 cpu utilization\"<\/span>\r\n  <span class=\"nx\">comparison_operator<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"GreaterThanOrEqualToThreshold\"<\/span>\r\n  <span class=\"nx\">period<\/span>              <span class=\"p\">=<\/span> <span class=\"mi\">60<\/span>\r\n  <span class=\"nx\">evaluation_periods<\/span>  <span class=\"p\">=<\/span> <span class=\"mi\">3<\/span>\r\n  <span class=\"nx\">datapoints_to_alarm<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">2<\/span>\r\n  <span class=\"nx\">metric_name<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"CPUUtilization\"<\/span>\r\n  <span class=\"nx\">namespace<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\/EC2\"<\/span>\r\n  <span class=\"nx\">statistic<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"Average\"<\/span>\r\n  <span class=\"nx\">threshold<\/span>           <span class=\"p\">=<\/span> <span class=\"mi\">50<\/span>\r\n  <span class=\"nx\">actions_enabled<\/span>     <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"nx\">alarm_actions<\/span>       <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"nx\">aws_autoscaling_policy<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_scaleout<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"p\">]<\/span>\r\n\r\n  <span class=\"nx\">dimensions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">AutoScalingGroupName<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_autoscaling_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/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=\"s2\">\"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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-scaleout\"<\/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_autoscaling_policy\"<\/span> <span class=\"s2\">\"admin_scalein\"<\/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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-scalein\"<\/span>\r\n  <span class=\"nx\">autoscaling_group_name<\/span>    <span class=\"p\">=<\/span> <span class=\"nx\">aws_autoscaling_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">adjustment_type<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"PercentChangeInCapacity\"<\/span>\r\n  <span class=\"nx\">policy_type<\/span>               <span class=\"p\">=<\/span> <span class=\"s2\">\"StepScaling\"<\/span>\r\n  <span class=\"nx\">estimated_instance_warmup<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">300<\/span>\r\n  <span class=\"nx\">metric_aggregation_type<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"Average\"<\/span>\r\n  <span class=\"nx\">step_adjustment<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">scaling_adjustment<\/span>          <span class=\"p\">=<\/span> <span class=\"err\">-<\/span><span class=\"mi\">25<\/span>\r\n    <span class=\"nx\">metric_interval_lower_bound<\/span> <span class=\"p\">=<\/span> <span class=\"err\">-<\/span><span class=\"mi\">10<\/span>\r\n    <span class=\"nx\">metric_interval_upper_bound<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n  <span class=\"p\">}<\/span>\r\n  <span class=\"nx\">step_adjustment<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">scaling_adjustment<\/span>          <span class=\"p\">=<\/span> <span class=\"err\">-<\/span><span class=\"mi\">50<\/span>\r\n    <span class=\"nx\">metric_interval_upper_bound<\/span> <span class=\"p\">=<\/span> <span class=\"err\">-<\/span><span class=\"mi\">10<\/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_cloudwatch_metric_alarm\"<\/span> <span class=\"s2\">\"admin_scalein\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">alarm_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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-scalein\"<\/span>\r\n  <span class=\"nx\">alarm_description<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"This metric monitors ec2 cpu utilization\"<\/span>\r\n  <span class=\"nx\">comparison_operator<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"LessThanOrEqualToThreshold\"<\/span>\r\n  <span class=\"nx\">period<\/span>              <span class=\"p\">=<\/span> <span class=\"mi\">60<\/span>\r\n  <span class=\"nx\">evaluation_periods<\/span>  <span class=\"p\">=<\/span> <span class=\"mi\">3<\/span>\r\n  <span class=\"nx\">datapoints_to_alarm<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">2<\/span>\r\n  <span class=\"nx\">metric_name<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"CPUUtilization\"<\/span>\r\n  <span class=\"nx\">namespace<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\/EC2\"<\/span>\r\n  <span class=\"nx\">statistic<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"Average\"<\/span>\r\n  <span class=\"nx\">threshold<\/span>           <span class=\"p\">=<\/span> <span class=\"mi\">40<\/span>\r\n  <span class=\"nx\">actions_enabled<\/span>     <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"nx\">alarm_actions<\/span>       <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"nx\">aws_autoscaling_policy<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin_scalein<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"p\">]<\/span>\r\n\r\n  <span class=\"nx\">dimensions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">AutoScalingGroupName<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_autoscaling_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">admin<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/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=\"s2\">\"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\">-admin-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-scalein\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u786e\u8ba4\u64cd\u4f5c<\/h5>\n<p>\u6211\u5011\u5c07\u9032\u884c\u58d3\u529b\u6e2c\u8a66\uff0c\u4ee5\u78ba\u8a8d\u5be6\u4f8b\u662f\u5426\u6703\u589e\u52a0\u3002\u53c3\u8003 Qiita \u4e0a\u7684 stress-ng \u547d\u4ee4\u7528\u6cd5\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">[<\/span>root@ip-ZZZ-ZZZ-ZZZ-ZZZ ~]# amazon-linux-extras <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> epel\r\n<span class=\"o\">[<\/span>root@ip-ZZZ-ZZZ-ZZZ-ZZZ ~]# yum <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> stress-ng\r\n<span class=\"o\">[<\/span>root@ip-ZZZ-ZZZ-ZZZ-ZZZ ~]# stress-ng <span class=\"nt\">-V<\/span>\r\nstress-ng, version 0.07.29\r\n<span class=\"o\">[<\/span>root@ip-ZZZ-ZZZ-ZZZ-ZZZ ~]# stress-ng <span class=\"nt\">-c<\/span> 1 <span class=\"nt\">-l<\/span> 80 <span class=\"nt\">-q<\/span> &amp;\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws autoscaling describe-scaling-activities <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--auto-scaling-group-name<\/span> terraform-sample-admin-stage <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"Activities[0].Cause\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"s2\">\"At YYYY-MM-DDTHH:mm:ssZ a monitor alarm terraform-sample-admin-stage-scaleout in state ALARM triggered policy terraform-sample-admin-stage-scaleout changing the desired capacity from 1 to 2.  At YYYY-MM-DDTHH:mm:ssZ an instance was started in response to a difference between desired and actual capacity, increasing the capacity from 1 to 2.\"<\/span>\r\n<span class=\"c\">#-- \u7701\u7565 --#<\/span>\r\n<\/code><\/pre>\n<p>\u53ea\u8981\u6709\u6269\u5c55\u89c4\u6a21\u7684\u610f\u56fe\uff0c\u5c31\u4f1a\u6210\u529f\u3002\u4e0d\u8981\u5fd8\u8bb0\u7ec8\u6b62\u538b\u529b\u6d4b\u8bd5\u7684\u6d41\u7a0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">[<\/span>root@ip-ZZZ-ZZZ-ZZZ-ZZZ ~]# <span class=\"nb\">jobs<\/span>\r\n<span class=\"o\">[<\/span>1]+  Running                 stress-ng <span class=\"nt\">-c<\/span> 1 <span class=\"nt\">-l<\/span> 80 <span class=\"nt\">-q<\/span> &amp;\r\n<span class=\"o\">[<\/span>root@ip-ZZZ-ZZZ-ZZZ-ZZZ ~]# <span class=\"nb\">kill<\/span> %1\r\n<span class=\"o\">[<\/span>1]+  Done                    stress-ng <span class=\"nt\">-c<\/span> 1 <span class=\"nt\">-l<\/span> 80 <span class=\"nt\">-q<\/span>\u201c\u201c\r\n<\/code><\/pre>\n<h2>\u521b\u5efa\u7528\u6237\u73af\u5883<\/h2>\n<p>\u5982\u679c\u6b64\u524d\u7684\u8bbe\u7f6e\u6ca1\u6709\u95ee\u9898\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u521b\u5efaUsers\u7aef\u7684CloudFront\u3001ALB\u7b49\u3002<br \/>\n\u5982\u679c\u9700\u8981\u66f4\u6539\u9002\u5f53\u7684\u8bbe\u7f6e\uff0c\u8bf7\u5728\u5e94\u7528\u4e4b\u524d\u8fdb\u884c\u8c03\u6574\u3002<\/p>\n<pre class=\"post-pre\"><code>stage<span class=\"nv\">$ <\/span><span class=\"k\">for <\/span>file <span class=\"k\">in <\/span>admin<span class=\"k\">*<\/span><span class=\"p\">;<\/span> <span class=\"k\">do <\/span><span class=\"nb\">cat<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">file<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> | <span class=\"nb\">sed<\/span> <span class=\"nt\">-e<\/span> <span class=\"s1\">'s\/admin\/user\/g'<\/span> <span class=\"o\">&gt;<\/span> <span class=\"sb\">`<\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">file<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> | <span class=\"nb\">sed<\/span> <span class=\"nt\">-e<\/span> <span class=\"s1\">'s\/admin\/user\/g'<\/span><span class=\"sb\">`<\/span><span class=\"p\">;<\/span> <span class=\"k\">done<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_iam_role_policy\"<\/span> <span class=\"s2\">\"codebuild_user_codepipeline_application_sources\"<\/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\">codepipeline_application_sources<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"k\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">codebuild_user<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span>\r\n<span class=\"p\">}<\/span>\r\n<span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_codepipeline\"<\/span> <span class=\"s2\">\"application_sources\"<\/span> <span class=\"p\">{<\/span>\r\n<span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n  <span class=\"nx\">stage<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-source\"<\/span>\r\n<span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">stage<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-build-admin\"<\/span>\r\n<span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">stage<\/span> <span class=\"p\">{<\/span>\r\n<span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">stage<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-build-user\"<\/span>\r\n\r\n    <span class=\"nx\">action<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-build-user-action\"<\/span>\r\n      <span class=\"nx\">category<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"Build\"<\/span>\r\n      <span class=\"nx\">owner<\/span>            <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\"<\/span>\r\n      <span class=\"k\">provider<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"CodeBuild\"<\/span>\r\n      <span class=\"nx\">input_artifacts<\/span>  <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"SOURCE\"<\/span><span class=\"p\">]<\/span>\r\n      <span class=\"nx\">output_artifacts<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"USER_BUILD\"<\/span><span class=\"p\">]<\/span>\r\n      <span class=\"nx\">version<\/span>          <span class=\"p\">=<\/span> <span class=\"s2\">\"1\"<\/span>\r\n\r\n      <span class=\"nx\">configuration<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">ProjectName<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_codebuild_project<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/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=\"nx\">stage<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-deploy-user\"<\/span>\r\n\r\n    <span class=\"nx\">action<\/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\">-application-sources-<\/span><span class=\"k\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-deploy-user-action\"<\/span>\r\n      <span class=\"nx\">category<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"Deploy\"<\/span>\r\n      <span class=\"nx\">owner<\/span>           <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\"<\/span>\r\n      <span class=\"k\">provider<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"CodeDeploy\"<\/span>\r\n      <span class=\"nx\">input_artifacts<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"USER_BUILD\"<\/span><span class=\"p\">]<\/span>\r\n      <span class=\"nx\">version<\/span>         <span class=\"p\">=<\/span> <span class=\"s2\">\"1\"<\/span>\r\n\r\n      <span class=\"nx\">configuration<\/span> <span class=\"p\">=<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">ApplicationName<\/span>     <span class=\"p\">=<\/span> <span class=\"nx\">aws_codedeploy_app<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"nx\">DeploymentGroupName<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_codedeploy_deployment_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">deployment_group_name<\/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<\/code><\/pre>\n<h2>\u5173\u7cfb\u578b\u6570\u636e\u5e93\u670d\u52a1 (RDS)<\/h2>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group\"<\/span> <span class=\"s2\">\"database\"<\/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\">-database\"<\/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\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\">-database\"<\/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_security_group_rule\"<\/span> <span class=\"s2\">\"database_in\"<\/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\">database<\/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\">5432<\/span>\r\n  <span class=\"nx\">to_port<\/span>                  <span class=\"p\">=<\/span> <span class=\"mi\">5432<\/span>\r\n  <span class=\"nx\">protocol<\/span>                 <span class=\"p\">=<\/span> <span class=\"s2\">\"tcp\"<\/span>\r\n  <span class=\"nx\">source_security_group_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">application_server<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">output<\/span> <span class=\"s2\">\"database_id\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">database<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">#-- \u7701\u7565 --#<\/span>\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_security_group_rule\"<\/span> <span class=\"s2\">\"application_server_postgres\"<\/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\">application_server<\/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\">5432<\/span>\r\n  <span class=\"nx\">to_port<\/span>                  <span class=\"p\">=<\/span> <span class=\"mi\">5432<\/span>\r\n  <span class=\"nx\">protocol<\/span>                 <span class=\"p\">=<\/span> <span class=\"s2\">\"tcp\"<\/span>\r\n  <span class=\"nx\">source_security_group_id<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">aws_security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">database<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_db_parameter_group\"<\/span> <span class=\"s2\">\"postgres\"<\/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\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">description<\/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\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">family<\/span>      <span class=\"p\">=<\/span> <span class=\"s2\">\"postgres10\"<\/span>\r\n\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\">\"timezone\"<\/span>\r\n    <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"Asia\/Tokyo\"<\/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\">\"client_encoding\"<\/span>\r\n    <span class=\"nx\">value<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"UTF8\"<\/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_db_subnet_group\"<\/span> <span class=\"s2\">\"postgres\"<\/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\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">description<\/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\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">subnet_ids<\/span>  <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_a_id<\/span><span class=\"p\">,<\/span> <span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">subnet<\/span><span class=\"p\">.<\/span><span class=\"nx\">private_c_id<\/span><span class=\"p\">]<\/span>\r\n\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\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/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_db_instance\"<\/span> <span class=\"s2\">\"postgres\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">allocated_storage<\/span>               <span class=\"p\">=<\/span> <span class=\"mi\">20<\/span>\r\n  <span class=\"nx\">max_allocated_storage<\/span>           <span class=\"p\">=<\/span> <span class=\"mi\">30<\/span>\r\n  <span class=\"nx\">allow_major_version_upgrade<\/span>     <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n  <span class=\"nx\">auto_minor_version_upgrade<\/span>      <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"nx\">apply_immediately<\/span>               <span class=\"p\">=<\/span> <span class=\"kc\">true<\/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\">postgres<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span>\r\n  <span class=\"nx\">parameter_group_name<\/span>            <span class=\"p\">=<\/span> <span class=\"nx\">aws_db_parameter_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">postgres<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/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\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">instance_class<\/span>                  <span class=\"p\">=<\/span> <span class=\"s2\">\"db.t2.small\"<\/span>\r\n  <span class=\"nx\">multi_az<\/span>                        <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n  <span class=\"nx\">deletion_protection<\/span>             <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"nx\">enabled_cloudwatch_logs_exports<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"postgresql\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"upgrade\"<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"nx\">engine<\/span>                          <span class=\"p\">=<\/span> <span class=\"s2\">\"postgres\"<\/span>\r\n  <span class=\"nx\">engine_version<\/span>                  <span class=\"p\">=<\/span> <span class=\"s2\">\"10.10\"<\/span>\r\n  <span class=\"nx\">skip_final_snapshot<\/span>             <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n  <span class=\"nx\">final_snapshot_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\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">-final\"<\/span>\r\n  <span class=\"nx\">storage_type<\/span>                    <span class=\"p\">=<\/span> <span class=\"s2\">\"gp2\"<\/span>\r\n  <span class=\"nx\">port<\/span>                            <span class=\"p\">=<\/span> <span class=\"mi\">5432<\/span>\r\n  <span class=\"nx\">username<\/span>                        <span class=\"p\">=<\/span> <span class=\"s2\">\"postgres\"<\/span>\r\n  <span class=\"nx\">password<\/span>                        <span class=\"p\">=<\/span> <span class=\"s2\">\"postgres\"<\/span>\r\n  <span class=\"nx\">publicly_accessible<\/span>             <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n  <span class=\"nx\">backup_retention_period<\/span>         <span class=\"p\">=<\/span> <span class=\"mi\">1<\/span>\r\n  <span class=\"nx\">vpc_security_group_ids<\/span>          <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"k\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">security_group<\/span><span class=\"p\">.<\/span><span class=\"nx\">database_id<\/span><span class=\"p\">]<\/span>\r\n\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\">${terraform<\/span><span class=\"p\">.<\/span><span class=\"nx\">workspace<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u7531\u4e8e\u5bc6\u7801\u4ee5\u660e\u6587\u5f62\u5f0f\u4fdd\u7559\u4e0b\u6765\uff0c\u56e0\u6b64\u5728\u8fde\u63a5\u786e\u8ba4\u65f6\u540c\u65f6\u66f4\u6539\u5bc6\u7801\u3002<\/p>\n<h3>\u786e\u8ba4\u8fde\u63a5<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws rds describe-db-instances <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--db-instance-identifier<\/span> terraform-sample-stage <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--query<\/span> <span class=\"s2\">\"DBInstances[0].Endpoint.Address\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--profile<\/span> terraform-sample\r\n<span class=\"s2\">\"terraform-sample-stage.XXXXXXXXXXXXXX.ap-northeast-1.rds.amazonaws.com\"<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"o\">[<\/span>root@ip-ZZZ-ZZZ-ZZZ-ZZZ ~]# amazon-linux-extras <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> postgresql10\r\n<span class=\"o\">[<\/span>root@ip-ZZZ-ZZZ-ZZZ-ZZZ ~]# psql <span class=\"nt\">-U<\/span> postgres <span class=\"nt\">-d<\/span> postgres <span class=\"nt\">-h<\/span> terraform-sample-stage.XXXXXXXXXXXXXX.ap-northeast-1.rds.amazonaws.com\r\nPassword <span class=\"k\">for <\/span>user postgres: \r\npsql <span class=\"o\">(<\/span>10.4, server 10.10<span class=\"o\">)<\/span>\r\nSSL connection <span class=\"o\">(<\/span>protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off<span class=\"o\">)<\/span>\r\nType <span class=\"s2\">\"help\"<\/span> <span class=\"k\">for <\/span>help.\r\n\r\n<span class=\"nv\">postgres<\/span><span class=\"o\">=&gt;<\/span> \r\n<\/code><\/pre>\n<h3>\u8bf7\u8f93\u5165\u65b0\u5bc6\u7801<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nv\">postgres<\/span><span class=\"o\">=&gt;<\/span> ALTER USER postgres WITH PASSWORD <span class=\"s1\">'\u4efb\u610f\u306e\u30d1\u30b9\u30ef\u30fc\u30c9'<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<h1>\u642d\u5efa\u751f\u4ea7\u73af\u5883<\/h1>\n<p>\u539f\u672c\u672c\u6765\u662f\u6253\u7b97\u5c06stage\u76ee\u5f55\u5b8c\u5168\u590d\u5236\u5e76\u521b\u5efa\uff0c\u4f46\u65e0\u6cd5\u5171\u4eabmodules\u76ee\u5f55\u4ee5\u4e0b\u7684\u8d44\u6e90\u3002<br \/>\n\u7406\u60f3\u60c5\u51b5\u662f\uff0c\u5e0c\u671b\u5728\u4e0d\u540c\u73af\u5883\u4e2d\u5171\u4eabmodules\u76ee\u5f55\u4e0b\u7684\u8d44\u6e90\uff0c\u5e76\u5355\u72ec\u7ba1\u7406\u5176\u4ed6\u76ee\u5f55\u4e0b\u7684\u8d44\u6e90\u3002<br \/>\n\u5982\u679c\u6709\u4efb\u4f55\u4e86\u89e3\u8fd9\u65b9\u9762\u95ee\u9898\u7684\u4eba\uff0c\u671f\u5f85\u60a8\u7684\u8bc4\u8bba\u3002<\/p>\n<h1>\u5584\u5f8c\u5de5\u4f5c<\/h1>\n<p>\u5220\u9664Terraform\u7528\u6237\u6743\u9650<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>aws iam detach-user-policy <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--user-name<\/span> terraform-sample <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--policy-arn<\/span> arn:aws:iam::aws:policy\/AdministratorAccess\r\n<\/code><\/pre>\n<h1>\u6700\u540e<\/h1>\n<p>\u6211\u5728\u56fe\u7247\u7f16\u8f91\u4e0a\u611f\u5230\u75b2\u60eb\u4e0d\u582a\u3002<br \/>\n\u6211\u4f1a\u5728\u4e4b\u540e\u7684\u67d0\u4e00\u5929\u5b8c\u6210\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u203b \u6807\u9898\u6709\u70b9\u5938\u5f20 \u7248\u672c\u66f4\u65b0\u4fe1\u606f 2021\u5e746\u670823\u65e5 \u540d\u79f0\u66f4\u65b0\u524d\u30d0\u30fc\u30b8\u30e7\u30f3\u66f4\u65b0\u5f8c\u30d0\u30fc\u30b8\u30e7\u30f3OSMac OS 1 [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48895","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>\u4f7f\u7528Terraform\u6784\u5efa\u6211\u60f3\u8c61\u4e2d\u7684\u6700\u5f3aAWS\u4e0a\u7684Springboot\u73af\u5883 - 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\/\u4f7f\u7528terraform\u6784\u5efa\u6211\u60f3\u8c61\u4e2d\u7684\u6700\u5f3aaws\u4e0a\u7684springboot\u73af\u5883\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528Terraform\u6784\u5efa\u6211\u60f3\u8c61\u4e2d\u7684\u6700\u5f3aAWS\u4e0a\u7684Springboot\u73af\u5883\" \/>\n<meta property=\"og:description\" content=\"\u203b \u6807\u9898\u6709\u70b9\u5938\u5f20 \u7248\u672c\u66f4\u65b0\u4fe1\u606f 2021\u5e746\u670823\u65e5 \u540d\u79f0\u66f4\u65b0\u524d\u30d0\u30fc\u30b8\u30e7\u30f3\u66f4\u65b0\u5f8c\u30d0\u30fc\u30b8\u30e7\u30f3OSMac OS 1 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528terraform\u6784\u5efa\u6211\u60f3\u8c61\u4e2d\u7684\u6700\u5f3aaws\u4e0a\u7684springboot\u73af\u5883\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-26T09:44:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-03T21:06:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d883b913a08637a6c2649\/6-0.png\" \/>\n<meta name=\"author\" content=\"\u96c5, \u609f\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u96c5, \u609f\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"45 \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\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82\/\",\"name\":\"\u4f7f\u7528Terraform\u6784\u5efa\u6211\u60f3\u8c61\u4e2d\u7684\u6700\u5f3aAWS\u4e0a\u7684Springboot\u73af\u5883 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-10-26T09:44:46+00:00\",\"dateModified\":\"2024-05-03T21:06:23+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528Terraform\u6784\u5efa\u6211\u60f3\u8c61\u4e2d\u7684\u6700\u5f3aAWS\u4e0a\u7684Springboot\u73af\u5883\"}]},{\"@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\/f044a4b7fa4ee2701702942002419ca6\",\"name\":\"\u96c5, \u609f\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"caption\":\"\u96c5, \u609f\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528Terraform\u6784\u5efa\u6211\u60f3\u8c61\u4e2d\u7684\u6700\u5f3aAWS\u4e0a\u7684Springboot\u73af\u5883 - 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\/\u4f7f\u7528terraform\u6784\u5efa\u6211\u60f3\u8c61\u4e2d\u7684\u6700\u5f3aaws\u4e0a\u7684springboot\u73af\u5883\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528Terraform\u6784\u5efa\u6211\u60f3\u8c61\u4e2d\u7684\u6700\u5f3aAWS\u4e0a\u7684Springboot\u73af\u5883","og_description":"\u203b \u6807\u9898\u6709\u70b9\u5938\u5f20 \u7248\u672c\u66f4\u65b0\u4fe1\u606f 2021\u5e746\u670823\u65e5 \u540d\u79f0\u66f4\u65b0\u524d\u30d0\u30fc\u30b8\u30e7\u30f3\u66f4\u65b0\u5f8c\u30d0\u30fc\u30b8\u30e7\u30f3OSMac OS 1 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528terraform\u6784\u5efa\u6211\u60f3\u8c61\u4e2d\u7684\u6700\u5f3aaws\u4e0a\u7684springboot\u73af\u5883\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-10-26T09:44:46+00:00","article_modified_time":"2024-05-03T21:06:23+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d883b913a08637a6c2649\/6-0.png"}],"author":"\u96c5, \u609f","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u96c5, \u609f","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"45 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82\/","name":"\u4f7f\u7528Terraform\u6784\u5efa\u6211\u60f3\u8c61\u4e2d\u7684\u6700\u5f3aAWS\u4e0a\u7684Springboot\u73af\u5883 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-10-26T09:44:46+00:00","dateModified":"2024-05-03T21:06:23+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528Terraform\u6784\u5efa\u6211\u60f3\u8c61\u4e2d\u7684\u6700\u5f3aAWS\u4e0a\u7684Springboot\u73af\u5883"}]},{"@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\/f044a4b7fa4ee2701702942002419ca6","name":"\u96c5, \u609f","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","caption":"\u96c5, \u609f"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8terraform%e6%9e%84%e5%bb%ba%e6%88%91%e6%83%b3%e8%b1%a1%e4%b8%ad%e7%9a%84%e6%9c%80%e5%bc%baaws%e4%b8%8a%e7%9a%84springboot%e7%8e%af%e5%a2%83%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\/48895","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\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48895"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48895\/revisions"}],"predecessor-version":[{"id":96291,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48895\/revisions\/96291"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48895"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48895"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48895"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}