├── 4_EC2_CONFIG.md ├── http └── ip.http ├── src ├── main │ ├── resources │ │ ├── application.yml │ │ └── static │ │ │ └── index.html │ └── java │ │ └── com │ │ └── github │ │ └── jojoldu │ │ └── aws │ │ └── deploy │ │ └── Application.java └── test │ └── java │ └── com │ └── github │ └── jojoldu │ └── aws │ └── deploy │ └── ApplicationTest.java ├── images ├── auto1.png ├── auto2.png ├── auto3.png ├── auto4.png ├── pipe1.png ├── pipe2.png ├── pipe3.png ├── pipe4.png ├── pipe5.png ├── pipe7.png ├── pipe8.png ├── pipe6-1.png ├── pipe6-2.png ├── formation1.png ├── formation2.png ├── formation3.png ├── elb_asg │ ├── ami1.png │ ├── ami2.png │ ├── ami3.png │ ├── ami4.png │ ├── ami5.png │ ├── ami6.png │ ├── ami7.png │ ├── ami8.png │ ├── ami9.png │ ├── asg2.png │ ├── asg3.png │ ├── asg4.png │ ├── asg5.png │ ├── asg6.png │ ├── asg7.png │ ├── asg8.png │ ├── asg9.png │ ├── elb1.png │ ├── elb2.png │ ├── elb3.png │ ├── elb4.png │ ├── elb5.png │ ├── elb6.png │ ├── elb7.png │ ├── elb8.png │ ├── elb9.png │ ├── alarm1.png │ ├── alarm2.png │ ├── ami10.png │ ├── ami11.png │ ├── ami12.png │ ├── ami13.png │ ├── asg10.png │ ├── elb10.png │ ├── script1.png │ ├── codedeploy1.png │ ├── codedeploy2.png │ └── codedeploy3.png ├── github │ ├── ami1.png │ ├── ami2.png │ ├── ami3.png │ ├── role1.png │ ├── role2.png │ ├── role3.png │ ├── role4.png │ ├── role5.png │ ├── role6.png │ ├── role7.png │ ├── ec2-iam1.png │ ├── ec2-iam2.png │ ├── pipeline1.png │ ├── pipeline10.png │ ├── pipeline11.png │ ├── pipeline12.png │ ├── pipeline13.png │ ├── pipeline2.png │ ├── pipeline3.png │ ├── pipeline4.png │ ├── pipeline5.png │ ├── pipeline6.png │ ├── pipeline7.png │ ├── pipeline8.png │ └── pipeline9.png ├── autoscaling │ ├── 1.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 그룹1.png │ ├── 그룹2.png │ ├── 그룹3.png │ ├── 그룹4.png │ ├── 그룹5.png │ ├── 그룹6.png │ ├── 그룹7.png │ ├── 그룹8.png │ ├── 그룹9.png │ ├── asg2.png │ ├── asg3.png │ ├── asg4.png │ ├── asg5.png │ ├── asg6.png │ ├── asg7.png │ ├── asg8.png │ ├── asg9.png │ ├── 사용자1.png │ ├── 사용자2.png │ ├── 사용자3.png │ ├── 사용자4.png │ ├── 사용자5.png │ ├── agent1.png │ └── agent2.png ├── codebuild │ ├── 아키텍처1.png │ ├── codebuild1.png │ ├── codebuild2.png │ ├── codebuild3.png │ ├── codebuild5.png │ ├── codebuild6.png │ ├── codebuild7.png │ ├── codebuild4-1.png │ ├── codebuild4-2.png │ ├── codebuild4-3.png │ ├── codebuild4-4.png │ ├── codebuild4-5.png │ ├── codebuild8-1.png │ ├── codebuild8-2.png │ ├── codebuild9-1.png │ ├── codebuild9-2.png │ ├── codepipeline1.png │ └── codepipeline2.png ├── codedeploy │ ├── ec1.png │ ├── ec2.png │ ├── ec3.png │ ├── ec4.png │ ├── ec5.png │ ├── ec6.png │ ├── ec7.png │ ├── ec8.png │ ├── role1.png │ ├── role2.png │ ├── role3.png │ ├── role4.png │ ├── role5.png │ ├── cloudwatch2.png │ ├── cloudwatch3.png │ ├── cloudwatch4.png │ ├── cloudwatch5.png │ ├── cloudwatch8.png │ ├── cloudwatch9.png │ ├── codedeploy1.png │ ├── codedeploy2.png │ ├── codedeploy3.png │ ├── codedeploy4.png │ ├── codedeploy5.png │ ├── codedeploy6.png │ ├── codedeploy7.png │ ├── codedeploy8.png │ ├── codedeploy9.png │ ├── codedeploy10.png │ ├── codedeploy11.png │ ├── codedeploy12.png │ ├── codedeploy4-1.png │ ├── codedeploy4-2.png │ ├── codedeploy4-3.png │ ├── ec2-setting1.png │ ├── ec2-setting10.png │ ├── ec2-setting11.png │ ├── ec2-setting12.png │ ├── ec2-setting13.png │ ├── ec2-setting14.png │ ├── ec2-setting15.png │ ├── ec2-setting16.png │ ├── ec2-setting17.png │ ├── ec2-setting18.png │ ├── ec2-setting19.png │ ├── ec2-setting2.png │ ├── ec2-setting3.png │ ├── ec2-setting4.png │ ├── ec2-setting5.png │ ├── ec2-setting6.png │ ├── ec2-setting7.png │ ├── ec2-setting8.png │ ├── ec2-setting9.png │ ├── codedeploy-role1.png │ ├── codedeploy-role2.png │ ├── codedeploy-role3.png │ ├── codedeploy-role4.png │ └── codedeploy-role5.png ├── etc │ └── codebuild-jar.png └── codepipeline │ ├── springboot1.png │ ├── springboot2.png │ ├── springboot3.png │ ├── springboot4.png │ ├── springboot5.png │ ├── springboot6.png │ ├── springboot7.png │ ├── codepipeline10.png │ ├── codepipeline11.png │ ├── codepipeline12.png │ ├── codepipeline13.png │ ├── codepipeline14.png │ ├── codepipeline15.png │ ├── codepipeline16.png │ ├── codepipeline17.png │ ├── codepipeline18.png │ ├── codepipeline19.png │ ├── codepipeline20.png │ ├── codepipeline3.png │ ├── codepipeline4.png │ ├── codepipeline6.png │ ├── codepipeline7.png │ ├── codepipeline8.png │ ├── codepipeline9.png │ ├── codepipeline5-1.png │ └── codepipeline5-2.png ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── appspec.yml ├── README.md ├── scripts ├── healthCheck.sh └── deploy.sh ├── TEST_CODE_DEPLOY.md ├── gradlew.bat ├── TEST_AUTO_SCALING.md ├── 2_CODE_BUILD.md ├── gradlew ├── 3_CODE_PIPELINE.md └── 1_CODE_DEPLOY.md /4_EC2_CONFIG.md: -------------------------------------------------------------------------------- 1 | # 4. EC2 설정하기 -------------------------------------------------------------------------------- /http/ip.http: -------------------------------------------------------------------------------- 1 | GET localhost:8080/ip 2 | 3 | ### -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | jpa: 3 | open-in-view: false 4 | -------------------------------------------------------------------------------- /images/auto1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/auto1.png -------------------------------------------------------------------------------- /images/auto2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/auto2.png -------------------------------------------------------------------------------- /images/auto3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/auto3.png -------------------------------------------------------------------------------- /images/auto4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/auto4.png -------------------------------------------------------------------------------- /images/pipe1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/pipe1.png -------------------------------------------------------------------------------- /images/pipe2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/pipe2.png -------------------------------------------------------------------------------- /images/pipe3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/pipe3.png -------------------------------------------------------------------------------- /images/pipe4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/pipe4.png -------------------------------------------------------------------------------- /images/pipe5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/pipe5.png -------------------------------------------------------------------------------- /images/pipe7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/pipe7.png -------------------------------------------------------------------------------- /images/pipe8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/pipe8.png -------------------------------------------------------------------------------- /images/pipe6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/pipe6-1.png -------------------------------------------------------------------------------- /images/pipe6-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/pipe6-2.png -------------------------------------------------------------------------------- /images/formation1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/formation1.png -------------------------------------------------------------------------------- /images/formation2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/formation2.png -------------------------------------------------------------------------------- /images/formation3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/formation3.png -------------------------------------------------------------------------------- /images/elb_asg/ami1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/ami1.png -------------------------------------------------------------------------------- /images/elb_asg/ami2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/ami2.png -------------------------------------------------------------------------------- /images/elb_asg/ami3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/ami3.png -------------------------------------------------------------------------------- /images/elb_asg/ami4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/ami4.png -------------------------------------------------------------------------------- /images/elb_asg/ami5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/ami5.png -------------------------------------------------------------------------------- /images/elb_asg/ami6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/ami6.png -------------------------------------------------------------------------------- /images/elb_asg/ami7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/ami7.png -------------------------------------------------------------------------------- /images/elb_asg/ami8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/ami8.png -------------------------------------------------------------------------------- /images/elb_asg/ami9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/ami9.png -------------------------------------------------------------------------------- /images/elb_asg/asg2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/asg2.png -------------------------------------------------------------------------------- /images/elb_asg/asg3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/asg3.png -------------------------------------------------------------------------------- /images/elb_asg/asg4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/asg4.png -------------------------------------------------------------------------------- /images/elb_asg/asg5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/asg5.png -------------------------------------------------------------------------------- /images/elb_asg/asg6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/asg6.png -------------------------------------------------------------------------------- /images/elb_asg/asg7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/asg7.png -------------------------------------------------------------------------------- /images/elb_asg/asg8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/asg8.png -------------------------------------------------------------------------------- /images/elb_asg/asg9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/asg9.png -------------------------------------------------------------------------------- /images/elb_asg/elb1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/elb1.png -------------------------------------------------------------------------------- /images/elb_asg/elb2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/elb2.png -------------------------------------------------------------------------------- /images/elb_asg/elb3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/elb3.png -------------------------------------------------------------------------------- /images/elb_asg/elb4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/elb4.png -------------------------------------------------------------------------------- /images/elb_asg/elb5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/elb5.png -------------------------------------------------------------------------------- /images/elb_asg/elb6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/elb6.png -------------------------------------------------------------------------------- /images/elb_asg/elb7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/elb7.png -------------------------------------------------------------------------------- /images/elb_asg/elb8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/elb8.png -------------------------------------------------------------------------------- /images/elb_asg/elb9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/elb9.png -------------------------------------------------------------------------------- /images/github/ami1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/ami1.png -------------------------------------------------------------------------------- /images/github/ami2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/ami2.png -------------------------------------------------------------------------------- /images/github/ami3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/ami3.png -------------------------------------------------------------------------------- /images/github/role1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/role1.png -------------------------------------------------------------------------------- /images/github/role2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/role2.png -------------------------------------------------------------------------------- /images/github/role3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/role3.png -------------------------------------------------------------------------------- /images/github/role4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/role4.png -------------------------------------------------------------------------------- /images/github/role5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/role5.png -------------------------------------------------------------------------------- /images/github/role6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/role6.png -------------------------------------------------------------------------------- /images/github/role7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/role7.png -------------------------------------------------------------------------------- /images/autoscaling/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/1.png -------------------------------------------------------------------------------- /images/autoscaling/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/16.png -------------------------------------------------------------------------------- /images/autoscaling/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/17.png -------------------------------------------------------------------------------- /images/autoscaling/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/18.png -------------------------------------------------------------------------------- /images/autoscaling/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/19.png -------------------------------------------------------------------------------- /images/autoscaling/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/2.png -------------------------------------------------------------------------------- /images/autoscaling/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/3.png -------------------------------------------------------------------------------- /images/autoscaling/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/4.png -------------------------------------------------------------------------------- /images/autoscaling/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/5.png -------------------------------------------------------------------------------- /images/autoscaling/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/6.png -------------------------------------------------------------------------------- /images/autoscaling/그룹1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/그룹1.png -------------------------------------------------------------------------------- /images/autoscaling/그룹2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/그룹2.png -------------------------------------------------------------------------------- /images/autoscaling/그룹3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/그룹3.png -------------------------------------------------------------------------------- /images/autoscaling/그룹4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/그룹4.png -------------------------------------------------------------------------------- /images/autoscaling/그룹5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/그룹5.png -------------------------------------------------------------------------------- /images/autoscaling/그룹6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/그룹6.png -------------------------------------------------------------------------------- /images/autoscaling/그룹7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/그룹7.png -------------------------------------------------------------------------------- /images/autoscaling/그룹8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/그룹8.png -------------------------------------------------------------------------------- /images/autoscaling/그룹9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/그룹9.png -------------------------------------------------------------------------------- /images/codebuild/아키텍처1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/아키텍처1.png -------------------------------------------------------------------------------- /images/codedeploy/ec1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec1.png -------------------------------------------------------------------------------- /images/codedeploy/ec2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2.png -------------------------------------------------------------------------------- /images/codedeploy/ec3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec3.png -------------------------------------------------------------------------------- /images/codedeploy/ec4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec4.png -------------------------------------------------------------------------------- /images/codedeploy/ec5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec5.png -------------------------------------------------------------------------------- /images/codedeploy/ec6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec6.png -------------------------------------------------------------------------------- /images/codedeploy/ec7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec7.png -------------------------------------------------------------------------------- /images/codedeploy/ec8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec8.png -------------------------------------------------------------------------------- /images/elb_asg/alarm1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/alarm1.png -------------------------------------------------------------------------------- /images/elb_asg/alarm2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/alarm2.png -------------------------------------------------------------------------------- /images/elb_asg/ami10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/ami10.png -------------------------------------------------------------------------------- /images/elb_asg/ami11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/ami11.png -------------------------------------------------------------------------------- /images/elb_asg/ami12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/ami12.png -------------------------------------------------------------------------------- /images/elb_asg/ami13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/ami13.png -------------------------------------------------------------------------------- /images/elb_asg/asg10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/asg10.png -------------------------------------------------------------------------------- /images/elb_asg/elb10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/elb10.png -------------------------------------------------------------------------------- /images/elb_asg/script1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/script1.png -------------------------------------------------------------------------------- /images/github/ec2-iam1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/ec2-iam1.png -------------------------------------------------------------------------------- /images/github/ec2-iam2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/ec2-iam2.png -------------------------------------------------------------------------------- /images/autoscaling/asg2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/asg2.png -------------------------------------------------------------------------------- /images/autoscaling/asg3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/asg3.png -------------------------------------------------------------------------------- /images/autoscaling/asg4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/asg4.png -------------------------------------------------------------------------------- /images/autoscaling/asg5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/asg5.png -------------------------------------------------------------------------------- /images/autoscaling/asg6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/asg6.png -------------------------------------------------------------------------------- /images/autoscaling/asg7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/asg7.png -------------------------------------------------------------------------------- /images/autoscaling/asg8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/asg8.png -------------------------------------------------------------------------------- /images/autoscaling/asg9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/asg9.png -------------------------------------------------------------------------------- /images/autoscaling/사용자1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/사용자1.png -------------------------------------------------------------------------------- /images/autoscaling/사용자2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/사용자2.png -------------------------------------------------------------------------------- /images/autoscaling/사용자3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/사용자3.png -------------------------------------------------------------------------------- /images/autoscaling/사용자4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/사용자4.png -------------------------------------------------------------------------------- /images/autoscaling/사용자5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/사용자5.png -------------------------------------------------------------------------------- /images/codedeploy/role1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/role1.png -------------------------------------------------------------------------------- /images/codedeploy/role2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/role2.png -------------------------------------------------------------------------------- /images/codedeploy/role3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/role3.png -------------------------------------------------------------------------------- /images/codedeploy/role4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/role4.png -------------------------------------------------------------------------------- /images/codedeploy/role5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/role5.png -------------------------------------------------------------------------------- /images/etc/codebuild-jar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/etc/codebuild-jar.png -------------------------------------------------------------------------------- /images/github/pipeline1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/pipeline1.png -------------------------------------------------------------------------------- /images/github/pipeline10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/pipeline10.png -------------------------------------------------------------------------------- /images/github/pipeline11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/pipeline11.png -------------------------------------------------------------------------------- /images/github/pipeline12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/pipeline12.png -------------------------------------------------------------------------------- /images/github/pipeline13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/pipeline13.png -------------------------------------------------------------------------------- /images/github/pipeline2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/pipeline2.png -------------------------------------------------------------------------------- /images/github/pipeline3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/pipeline3.png -------------------------------------------------------------------------------- /images/github/pipeline4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/pipeline4.png -------------------------------------------------------------------------------- /images/github/pipeline5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/pipeline5.png -------------------------------------------------------------------------------- /images/github/pipeline6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/pipeline6.png -------------------------------------------------------------------------------- /images/github/pipeline7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/pipeline7.png -------------------------------------------------------------------------------- /images/github/pipeline8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/pipeline8.png -------------------------------------------------------------------------------- /images/github/pipeline9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/github/pipeline9.png -------------------------------------------------------------------------------- /images/autoscaling/agent1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/agent1.png -------------------------------------------------------------------------------- /images/autoscaling/agent2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/autoscaling/agent2.png -------------------------------------------------------------------------------- /images/codebuild/codebuild1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild1.png -------------------------------------------------------------------------------- /images/codebuild/codebuild2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild2.png -------------------------------------------------------------------------------- /images/codebuild/codebuild3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild3.png -------------------------------------------------------------------------------- /images/codebuild/codebuild5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild5.png -------------------------------------------------------------------------------- /images/codebuild/codebuild6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild6.png -------------------------------------------------------------------------------- /images/codebuild/codebuild7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild7.png -------------------------------------------------------------------------------- /images/elb_asg/codedeploy1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/codedeploy1.png -------------------------------------------------------------------------------- /images/elb_asg/codedeploy2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/codedeploy2.png -------------------------------------------------------------------------------- /images/elb_asg/codedeploy3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/elb_asg/codedeploy3.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /images/codebuild/codebuild4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild4-1.png -------------------------------------------------------------------------------- /images/codebuild/codebuild4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild4-2.png -------------------------------------------------------------------------------- /images/codebuild/codebuild4-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild4-3.png -------------------------------------------------------------------------------- /images/codebuild/codebuild4-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild4-4.png -------------------------------------------------------------------------------- /images/codebuild/codebuild4-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild4-5.png -------------------------------------------------------------------------------- /images/codebuild/codebuild8-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild8-1.png -------------------------------------------------------------------------------- /images/codebuild/codebuild8-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild8-2.png -------------------------------------------------------------------------------- /images/codebuild/codebuild9-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild9-1.png -------------------------------------------------------------------------------- /images/codebuild/codebuild9-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codebuild9-2.png -------------------------------------------------------------------------------- /images/codedeploy/cloudwatch2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/cloudwatch2.png -------------------------------------------------------------------------------- /images/codedeploy/cloudwatch3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/cloudwatch3.png -------------------------------------------------------------------------------- /images/codedeploy/cloudwatch4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/cloudwatch4.png -------------------------------------------------------------------------------- /images/codedeploy/cloudwatch5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/cloudwatch5.png -------------------------------------------------------------------------------- /images/codedeploy/cloudwatch8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/cloudwatch8.png -------------------------------------------------------------------------------- /images/codedeploy/cloudwatch9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/cloudwatch9.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy1.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy2.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy3.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy4.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy5.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy6.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy7.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy8.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy9.png -------------------------------------------------------------------------------- /images/codebuild/codepipeline1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codepipeline1.png -------------------------------------------------------------------------------- /images/codebuild/codepipeline2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codebuild/codepipeline2.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy10.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy11.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy12.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy4-1.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy4-2.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy4-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy4-3.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting1.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting10.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting11.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting12.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting13.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting14.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting15.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting16.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting17.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting18.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting19.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting2.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting3.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting4.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting5.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting6.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting7.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting8.png -------------------------------------------------------------------------------- /images/codedeploy/ec2-setting9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/ec2-setting9.png -------------------------------------------------------------------------------- /images/codepipeline/springboot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/springboot1.png -------------------------------------------------------------------------------- /images/codepipeline/springboot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/springboot2.png -------------------------------------------------------------------------------- /images/codepipeline/springboot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/springboot3.png -------------------------------------------------------------------------------- /images/codepipeline/springboot4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/springboot4.png -------------------------------------------------------------------------------- /images/codepipeline/springboot5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/springboot5.png -------------------------------------------------------------------------------- /images/codepipeline/springboot6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/springboot6.png -------------------------------------------------------------------------------- /images/codepipeline/springboot7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/springboot7.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy-role1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy-role1.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy-role2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy-role2.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy-role3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy-role3.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy-role4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy-role4.png -------------------------------------------------------------------------------- /images/codedeploy/codedeploy-role5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codedeploy/codedeploy-role5.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline10.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline11.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline12.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline13.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline14.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline15.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline16.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline17.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline18.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline19.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline20.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline3.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline4.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline6.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline7.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline8.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline9.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline5-1.png -------------------------------------------------------------------------------- /images/codepipeline/codepipeline5-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jojoldu/springboot-deploy/HEAD/images/codepipeline/codepipeline5-2.png -------------------------------------------------------------------------------- /src/main/resources/static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SpringBoot & AWS Blue Green Deploy & CloudFormation 6 | 7 | 8 |

Version.4

9 | 10 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Feb 06 12:27:20 CET 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.5.1-bin.zip 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | 5 | out 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | nbproject/private/ 24 | build/ 25 | nbbuild/ 26 | dist/ 27 | nbdist/ 28 | .nb-gradle/ -------------------------------------------------------------------------------- /appspec.yml: -------------------------------------------------------------------------------- 1 | version: 0.0 2 | os: linux 3 | files: 4 | - source: / 5 | destination: /home/ec2-user/build/ 6 | 7 | permissions: 8 | - object: / 9 | pattern: "**" 10 | owner: ec2-user 11 | group: ec2-user 12 | 13 | hooks: 14 | ApplicationStart: 15 | - location: deploy.sh 16 | timeout: 60 17 | runas: ec2-user 18 | ValidateService: 19 | - location: healthCheck.sh 20 | timeout: 60 21 | runas: ec2-user -------------------------------------------------------------------------------- /src/test/java/com/github/jojoldu/aws/deploy/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.github.jojoldu.aws.deploy; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit4.SpringRunner; 7 | 8 | @RunWith(SpringRunner.class) 9 | @SpringBootTest 10 | public class ApplicationTest { 11 | 12 | @Test 13 | public void contextLoads() { 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SpringBoot & AWS Blue Green Deploy 2 | 3 | * Auto Scaling 4 | * ELB 5 | * Code Build & Code Deploy 6 | * Blue & Green deploy 7 | 8 | 9 | ## Auto Scaling 10 | 11 | * Instance 생성 12 | * 기본세팅 13 | * Java8 설치 14 | * Code Deploy Agent 설치 15 | * Cloud Watch 세팅 16 | * 준비된 인스턴스로 AMI 생성 17 | * Auto Scaling Group에서 Launch Configuration 생성 18 | 19 | ## 참고 20 | 21 | * [blue-green-deployment-using-aws-cloudformation-and-lambda](https://blog.powerupcloud.com/blue-green-deployment-using-aws-cloudformation-and-lambda-1555054aab3a) 22 | * [performing-bluegreen-deployments-with-aws-codedeploy-and-auto-scaling-groups](https://aws.amazon.com/ko/blogs/devops/performing-bluegreen-deployments-with-aws-codedeploy-and-auto-scaling-groups/) -------------------------------------------------------------------------------- /scripts/healthCheck.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "> Health check 시작" 3 | echo "> curl -s http://localhost:8080/actuator/health " 4 | 5 | for RETRY_COUNT in {1..15} 6 | do 7 | RESPONSE=$(curl -s http://localhost:8080/actuator/health) 8 | UP_COUNT=$(echo $RESPONSE | grep 'UP' | wc -l) 9 | 10 | if [ $UP_COUNT -ge 1 ] 11 | then # $up_count >= 1 ("UP" 문자열이 있는지 검증) 12 | echo "> Health check 성공" 13 | break 14 | else 15 | echo "> Health check의 응답을 알 수 없거나 혹은 status가 UP이 아닙니다." 16 | echo "> Health check: ${RESPONSE}" 17 | fi 18 | 19 | if [ $RETRY_COUNT -eq 10 ] 20 | then 21 | echo "> Health check 실패. " 22 | exit 1 23 | fi 24 | 25 | echo "> Health check 연결 실패. 재시도..." 26 | sleep 10 27 | done 28 | exit 0 -------------------------------------------------------------------------------- /scripts/deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | BUILD_PATH=$(ls /home/ec2-user/build/*.jar) 3 | JAR_NAME=$(basename $BUILD_PATH) 4 | echo "> build 파일명: $JAR_NAME" 5 | 6 | echo "> build 파일 복사" 7 | DEPLOY_PATH=/home/ec2-user/ 8 | cp $BUILD_PATH $DEPLOY_PATH 9 | 10 | echo "> springboot-deploy.jar 교체" 11 | CP_JAR_PATH=$DEPLOY_PATH$JAR_NAME 12 | APPLICATION_JAR_NAME=springboot-deploy.jar 13 | APPLICATION_JAR=$DEPLOY_PATH$APPLICATION_JAR_NAME 14 | 15 | ln -Tfs $CP_JAR_PATH $APPLICATION_JAR 16 | 17 | echo "> 현재 실행중인 애플리케이션 pid 확인" 18 | CURRENT_PID=$(pgrep -f $APPLICATION_JAR_NAME) 19 | 20 | if [ -z $CURRENT_PID ] 21 | then 22 | echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." 23 | else 24 | echo "> kill -15 $CURRENT_PID" 25 | kill -15 $CURRENT_PID 26 | sleep 5 27 | fi 28 | 29 | echo "> $APPLICATION_JAR 배포" 30 | nohup java -jar $APPLICATION_JAR > /dev/null 2> /dev/null < /dev/null & -------------------------------------------------------------------------------- /src/main/java/com/github/jojoldu/aws/deploy/Application.java: -------------------------------------------------------------------------------- 1 | package com.github.jojoldu.aws.deploy; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | import java.io.BufferedReader; 9 | import java.io.IOException; 10 | import java.io.InputStreamReader; 11 | import java.net.URL; 12 | import java.time.LocalDate; 13 | import java.time.format.DateTimeFormatter; 14 | 15 | @RestController 16 | @SpringBootApplication 17 | public class Application { 18 | 19 | public static void main(String[] args) { 20 | SpringApplication.run(Application.class, args); 21 | } 22 | 23 | @GetMapping("/version") 24 | public String getVersion() { 25 | return "1"; 26 | } 27 | 28 | @GetMapping("/ip") 29 | public String getIp() throws Exception { 30 | URL url = new URL("http://checkip.amazonaws.com"); 31 | BufferedReader in = null; 32 | try { 33 | in = new BufferedReader(new InputStreamReader( 34 | url.openStream())); 35 | return in.readLine(); 36 | } finally { 37 | if (in != null) { 38 | try { 39 | in.close(); 40 | } catch (IOException e) { 41 | e.printStackTrace(); 42 | } 43 | } 44 | } 45 | } 46 | 47 | @GetMapping("/block") 48 | public String block() throws InterruptedException { 49 | String currentDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); 50 | System.out.println("/block: "+currentDate); 51 | Thread.sleep(2000L); 52 | 53 | return currentDate; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /TEST_CODE_DEPLOY.md: -------------------------------------------------------------------------------- 1 | # Github & AWS Code Deploy 연동 2 | 3 | 4 | ![codedeploy1](./images/github/codedeploy1.png) 5 | 6 | ```yml 7 | version: 0.0 8 | os: linux 9 | files: 10 | - source: / 11 | destination: /home/ec2-user/build/ 12 | ``` 13 | 14 | 15 | ![codedeploy2](./images/github/codedeploy2.png) 16 | 17 | CodeDeploy 로그 확인 18 | 19 | ```bash 20 | cd /var/log/aws/codedeploy-agent 21 | ``` 22 | 23 | ![codedeploy3](./images/github/codedeploy3.png) 24 | 25 | ![codedeploy4](./images/github/codedeploy4.png) 26 | 27 | ![codedeploy5](./images/github/codedeploy5.png) 28 | 29 | ![codedeploy6](./images/github/codedeploy6.png) 30 | 31 | ![codedeploy7](./images/github/codedeploy7.png) 32 | 33 | ![codedeploy8](./images/github/codedeploy8.png) 34 | 35 | ![codedeploy9](./images/github/codedeploy9.png) 36 | 37 | ![codedeploy10](./images/github/codedeploy10.png) 38 | 39 | ![codedeploy11](./images/github/codedeploy11.png) 40 | 41 | ![codedeploy12](./images/github/codedeploy12.png) 42 | 43 | ## CloudWatch로 CodeDeploy 로그 전송 44 | 45 | ```bash 46 | wget https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py 47 | wget https://s3.amazonaws.com/aws-codedeploy-us-east-1/cloudwatch/codedeploy_logs.conf 48 | chmod +x ./awslogs-agent-setup.py 49 | sudo python awslogs-agent-setup.py -n -r ap-northeast-2 -c s3://aws-codedeploy-us-east-1/cloudwatch/awslogs.conf 50 | sudo mkdir -p /var/awslogs/etc/config 51 | sudo cp codedeploy_logs.conf /var/awslogs/etc/config/ 52 | ``` 53 | 54 | log 그룹을 변경하겠습니다. 55 | 56 | ```bash 57 | sudo vim /var/awslogs/etc/config/codedeploy_logs.conf 58 | ``` 59 | 60 | ```bash 61 | [codedeploy-agent-logs] 62 | datetime_format = %Y-%m-%d %H:%M:%S 63 | file = /var/log/aws/codedeploy-agent/codedeploy-agent.log 64 | log_stream_name = {instance_id}-codedeploy-agent-log 65 | log_group_name = dwlee-codedeploy-agent-log 66 | 67 | [codedeploy-updater-logs] 68 | file = /tmp/codedeploy-agent.update.log 69 | log_stream_name = {instance_id}-codedeploy-updater-log 70 | log_group_name = dwlee-codedeploy-updater-log 71 | 72 | [codedeploy-deployment-logs] 73 | file = /opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent-deployments.log 74 | log_stream_name = {instance_id}-codedeploy-deployments-log 75 | log_group_name = dwlee-codedeploy-deployments-log 76 | ``` 77 | 78 | ```bash 79 | sudo service awslogs restart 80 | ``` 81 | 82 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /TEST_AUTO_SCALING.md: -------------------------------------------------------------------------------- 1 | # AWS Auto Scaling 2 | 3 | 4 | ## 1. EC2 인스턴스 생성 5 | 6 | 7 | ### 1-1. Java8 설치 8 | 9 | EC2 인스턴스로 ssh 접속후 다음의 명령어를 실행합니다. 10 | 11 | ```bash 12 | sudo yum update 13 | sudo yum install -y java-1.8.0-openjdk-devel.x86_64 14 | sudo /usr/sbin/alternatives --config java 15 | sudo yum remove java-1.7.0-openjdk 16 | java -version 17 | ``` 18 | 19 | ![1](./images/autoscaling/1.png) 20 | 21 | git을 설치합니다. 22 | 23 | ```bash 24 | sudo yum install git 25 | git --version 26 | ``` 27 | 28 | ```bash 29 | mkdir ~/app/ 30 | mkdir ~/build/ 31 | ``` 32 | 33 | 여기서 ```~/app/```은 초기 인스턴스가 생성시 가장 최신의 프로젝트를 Git에서 받아서 저장할 디렉토리입니다. 34 | 그리고 ```~/build/```은 CodeDeploy 를 통해서 배포용 파일들을 받을 디렉토리입니다. 35 | 이외에 필요한 것들이 더 있으시면 설치하시면 됩니다. 36 | 37 | ### 1-2. Code Deploy Agent 설치 38 | 39 | #### 그룹 생성 40 | 41 | ```json 42 | { 43 | "Version": "2012-10-17", 44 | "Statement": [ 45 | { 46 | "Effect": "Allow", 47 | "Action": [ 48 | "autoscaling:*", 49 | "codedeploy:*", 50 | "ec2:*", 51 | "lambda:*", 52 | "elasticloadbalancing:*", 53 | "s3:*", 54 | "cloudwatch:*", 55 | "logs:*", 56 | "sns:*" 57 | ], 58 | "Resource": "*" 59 | } 60 | ] 61 | } 62 | ``` 63 | 64 | #### 사용자 추가 65 | 66 | ![사용자1](./images/autoscaling/사용자1.png) 67 | 68 | ![사용자2](./images/autoscaling/사용자2.png) 69 | 70 | #### EC2에 Code Deploy Agent 설치 71 | 72 | ```bash 73 | sudo yum install -y aws-cli 74 | ``` 75 | 76 | ```bash 77 | cd /home/ec2-user/ 78 | sudo aws configure 79 | ``` 80 | 81 | ![agent1](./images/autoscaling/agent1.png) 82 | 83 | * Access Key 84 | * Secret Access Key 85 | * region name 86 | * ap-northeast-2 87 | * 서울 리전을 얘기합니다. 88 | * output format 89 | * json 90 | 91 | 92 | 설치파일 받기 93 | 94 | ```bash 95 | wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install 96 | ``` 97 | 98 | ```bash 99 | chmod +x ./install 100 | ``` 101 | 102 | ```bash 103 | sudo ./install auto 104 | ``` 105 | 106 | 설치가 완료되셨으면 아래 명령어로 Agent가 실행중인지 확인합니다. 107 | 108 | ```bash 109 | sudo service codedeploy-agent status 110 | ``` 111 | 112 | 마지막으로 EC2 인스턴스가 부팅되면 자동으로 AWS CodeDeploy Agent가 실행될 수 있도록 /etc/init.d/에 쉘 스크립트 파일을 하나 생성하겠습니다. 113 | 114 | ```bash 115 | sudo vim /etc/init.d/codedeploy-startup.sh 116 | ``` 117 | 118 | ```bash 119 | #!/bin/bash 120 | echo 'Starting codedeploy-agent' 121 | sudo service codedeploy-agent start 122 | ``` 123 | 124 | ### 1-3. Cloud Watch 세팅 125 | 126 | 127 | ## 2. AMI 생성 128 | 129 | ![2](./images/autoscaling/2.png) 130 | 131 | ![3](./images/autoscaling/3.png) 132 | 133 | ![4](./images/autoscaling/4.png) 134 | 135 | ![5](./images/autoscaling/5.png) 136 | 137 | pending이 avaliable로 변경되면 이미지 생성이 완료된 것입니다. 138 | 139 | ## 3. Auto Scaling Group에서 Launch Configuration 생성 140 | 141 | 사용자 데이터 142 | 143 | ```bash 144 | #!/bin/bash 145 | 146 | cd /home/ec2-user 147 | git clone https://github.com/jojoldu/springboot-deploy.git 148 | cd springboot-deploy 149 | ./gradlew build 150 | cp /home/ec2-user/springboot-deploy/build/libs/*.jar /home/ec2-user/build/ 151 | chown ec2-user:ec2-user /home/ec2-user/build/*.jar 152 | su ec2-user ./scripts/deploy.sh 153 | ``` 154 | 155 | 개선 156 | 157 | ```bash 158 | #!/bin/bash 159 | 160 | cd /home/ec2-user 161 | su ec2-user git clone https://github.com/jojoldu/springboot-deploy.git 162 | su ec2-user /home/ec2-user/springboot-deploy/scripts/init.sh 163 | ``` 164 | 165 | ```bash 166 | #!/bin/bash 167 | ./gradlew build 168 | cp /home/ec2-user/springboot-deploy/build/libs/*.jar /home/ec2-user/build/ 169 | ./deploy.sh 170 | ``` 171 | 172 | 173 | ## CodePipeline CloudWatch Alarm 174 | 175 | ```json 176 | { 177 | "source": [ 178 | "aws.codepipeline" 179 | ], 180 | "detail-type": [ 181 | "CodePipeline Action Execution State Change" 182 | ], 183 | "detail": { 184 | "state": [ 185 | "FAILED" 186 | ], 187 | "type": { 188 | "category": [ 189 | "Deploy", 190 | "Build" 191 | ] 192 | } 193 | } 194 | } 195 | ``` 196 | 197 | 198 | ## 알게된 것들 199 | 200 | ### 팁 201 | 202 | * appspec.yml -> hooks에 실행시킬 스크립트 안에서 다시 다른 스크립트를 실행하면 CodeDeploy의 로그가 남겨지지 않는다 203 | 204 | ex) 205 | 206 | appspec.yml 207 | 208 | ```yml 209 | hooks: 210 | ApplicationStart: 211 | - location: scripts/start.sh 212 | timeout: 60 213 | runas: ec2-user 214 | ``` 215 | 216 | start.sh 217 | 218 | ```bash 219 | #!/bin/bash 220 | ./deploy.sh 221 | ``` 222 | 223 | 224 | ### 로그 위치 225 | 226 | -------------------------------------------------------------------------------- /2_CODE_BUILD.md: -------------------------------------------------------------------------------- 1 | # 2. AWS Code Build로 빌드하기 2 | 3 | [지난 시간](http://jojoldu.tistory.com/281)에 Code Deploy 사용하는 방법에 대해 설명드렸습니다. 4 | 5 | AWS와 같은 클라우드 서비스가 등장하기전까지 IDC 환경에선 젠킨스 혹은 TravisCI와 같은 CI Tool에서 **Build & Test & Deploy를 다같이 처리**했었습니다. 6 | 즉, Build & Test가 완료된 WAR/JAR 를 배포 서버로 바로 전송(```scp```)하여 배포했었습니다. 7 | 하지만, AWS와 같이 오토 스케일링이 되는 클라우드 환경에선 트래픽에 따라 갑자기 서버가 늘었다/줄었다 할 수 있기 때문에 **배포서버 목록을 고정시키기가 어렵습니다**. 8 | (물론 AWS CLI에서 서버 리스트를 가져온다던가 할수도 있습니다) 9 | 10 | 그래서 이런 문제를 **Code Deploy**를 통해 해결합니다. 11 | Code Deploy는 **ASG를 대상으로 배포가 가능**하기 때문인데요. 12 | 13 | > 제가 처음 ASG를 들었을때 배포가 어떻게 되는거지 라는 의문이 있었는데 Code Deploy로 ASG에 배포할 수 있다는걸 알게되서 의문이 해결됐습니다. 14 | 15 | 여기서 중요한 점은 "**그럼 빌드된 WAR/JAR를 어떻게 Code Deploy에 전달할 것인가**" 입니다. 16 | Code Deploy에서 배포할 파일을 가져오는 방법은 2가지가 있습니다. 17 | 18 | * Github 19 | * S3 20 | 21 | 배포 파일(WAR/JAR)을 Github에 다시 올리는건 너무 이상합니다. 22 | 그래서 보통은 **S3에 배포파일을 올리고 이를 Code Deploy에서 가져와서 EC2 혹은 ASG에 배포**하는게 기존의 AWS 배포 방식이였습니다. 23 | 24 | ![아키텍처1](./images/codebuild/아키텍처1.png) 25 | 26 | 이 방식으로 할 경우 개발자는 아래를 구축해야 합니다. 27 | 28 | * 별도의 CI Tool 구축 29 | * AWS CLI 스크립트 작성 30 | * 빌드파일 S3 업로드 31 | * Code Deploy 배포 32 | 33 | 당장 서비스 만들기가 급한 상황에선 이런 작업들도 전부 공수가 들어가니, 쉽게 구축할 수 있는 방법이 필요합니다. 34 | 그래서 AWS는 **Code Build**와 **Code Pipeline**를 제공합니다. 35 | 36 | ![codepipeline1](./images/codebuild/codepipeline1.png) 37 | 38 | * [Code Build](https://aws.amazon.com/ko/codebuild/) 39 | * AWS가 제공하는 Build Tool 40 | * 지정된 위치에서 소스코드를 가져와 Build & Test 수행 41 | 42 | * [Code Pipeline](https://aws.amazon.com/ko/codepipeline/) 43 | * AWS가 제공하는 통합 빌드 환경 44 | * 어느곳에서 소스코드를 가져오고, 어떤 툴을 통해 빌드하고, 어떤 툴을 통해 배포할지 전체 Flow를 관리 45 | 46 | 이번 시간엔 이 Code Build와 Code Pipeline을 이용해 배포환경을 구축해보겠습니다. 47 | 전체 Flow는 아래와 같습니다. 48 | 49 | ![codepipeline2](./images/codebuild/codepipeline2.png) 50 | 51 | * Github에서 Source 코드를 가져오고 52 | * Code Build를 통해 Build 해서 53 | * Code Deploy를 통해 배포합니다. 54 | 55 | 자 그럼 이제 본격적으로 시작해보겠습니다! 56 | 57 | > 저도 AWS Code Pipeline이 처음이다보니, 진행하다가 운영 배포환경에서 해결이 안되는 문제가 있다면 기존처럼 **젠킨스 CI + Code Deploy**로 배포하는 방식을 사용수도 있습니다. 58 | 59 | ## 2-1. Code Build 구축하기 60 | 61 | Code Build 부터 차례로 구축하겠습니다. 62 | Code Build 서비스로 이동하신뒤, **프로젝트 만들기** 버튼을 클릭합니다. 63 | 64 | ![codebuild1](./images/codebuild/codebuild1.png) 65 | 66 | Github연결 버튼을 클릭합니다. 67 | 68 | ![codebuild2](./images/codebuild/codebuild2.png) 69 | 70 | OAuth 인증을 하시고 71 | 72 | ![codebuild3](./images/codebuild/codebuild3.png) 73 | 74 | 본인의 Github 저장소 URL을 등록합니다. 75 | 76 | ![codebuild4-1](./images/codebuild/codebuild4-1.png) 77 | 78 | Java8의 빌드환경을 가질테니 Java8을 선택합니다. 79 | (현재 자바8과 9만 지원됩니다.) 80 | 여기서 빌드를 어떤식으로 진행할지 선택하는 방법이 2가지있습니다. 81 | 82 | * buildspec.yml 83 | * code build 편집창에서 직접 커맨드 추가 84 | 85 | 보편적으로 이런 인프라 환경은 **코드로 관리**하는걸 추천합니다. 86 | (코드로 관리하게 되면, Git을 통해 이전에 설정한 값을 다시 찾기도 쉬울뿐더러, 누가 어떤 사유로 수정했는지도 추적하기 쉽습니다. 87 | 또한, Code Build 설정이 삭제됐다하더라도, 코드에 그대로 남아있어 재설정하기가 굉장히 편리합니다.) 88 | 여기서도 마찬가지로 buildspec.yml로 코드관리를 진행하겠습니다. 89 | 90 | ![codebuild4-2](./images/codebuild/codebuild4-2.png) 91 | 92 | 미리 생성한 S3 버킷 정보를 입력합니다. 93 | (참고로 버킷 목록에 본인의 버킷이 보이지 않는다면, 다시 Code Build 생성 페이지로 들어와 보세요. 94 | 목록 갱신이 실시간이 아니라서 생성 페이지로 이동할때만 다시 불러옵니다.) 95 | 96 | ![codebuild4-3](./images/codebuild/codebuild4-3.png) 97 | 98 | * 아티팩트 99 | * 빌드된 WAR/JAR를 보관할 위치를 나타냅니다. 100 | * 캐시 101 | * 빌드에 필요한 의존성들을 캐시 102 | * Maven/Gradle을 사용할 경우 필요한 라이브러리를 다운 받아야하는데요. 103 | * 이 파일들을 빌드할때마다 새로 받는게 아니라, 한번 받은 내용들은 S3에 올려놓고 빌드시에는 이미 받은 내용을 다시 받지 않도록 *캐시**하는 역할을 합니다. 104 | 105 | 미리 생성한 S3는 다음과 같습니다. 106 | 107 | ![codebuild4-4](./images/codebuild/codebuild4-4.png) 108 | 109 | IAM Role의 경우 여기서 즉시 생성합니다. 110 | 111 | ![codebuild4-5](./images/codebuild/codebuild4-5.png) 112 | 113 | 그럼 Code Build가 생성되었습니다! 114 | 115 | ## 2-2. Code Build 실행하기 116 | 117 | 방금 생성한 Code Build를 선택하고 **빌드 시작**버튼을 클릭합니다. 118 | 119 | ![codebuild5](./images/codebuild/codebuild5.png) 120 | 121 | 기본값으로 두고 바로 빌드시작을 하면 되는데요. 122 | 여기서 잠깐! 123 | 124 | ![codebuild6](./images/codebuild/codebuild6.png) 125 | 126 | buildspec.yml이 아직 프로젝트에 추가되지 않았기 때문에 해당 파일을 추가하겠습니다. 127 | 프로젝트 안에 ```buildspec.yml```파일을 생성하고 아래와 같이 코드를 추가합니다. 128 | 129 | ![codebuild7](./images/codebuild/codebuild7.png) 130 | 131 | ```yml 132 | version: 0.2 133 | 134 | phases: 135 | build: 136 | commands: 137 | - echo Build Starting on `date` 138 | - chmod +x ./gradlew 139 | - ./gradlew build 140 | post_build: 141 | commands: 142 | - echo $(basename ./build/libs/*.jar) 143 | - pwd 144 | 145 | cache: 146 | paths: 147 | - '/root/.gradle/caches/**/*' 148 | ``` 149 | 150 | * phases.build 151 | * 프로젝트 빌드 시점입니다. 152 | * 여기서는 ```chmod +x ./gradlew```를 통해 gradlew에 실행권한을 추가하고, 153 | * ```./gradlew build```로 build를 수행합니다. 154 | 155 | * phases.post_build 156 | * phases.build가 끝난 후에 실행되는 시점입니다. 157 | * 현재는 딱히 할게 없기 때문에 **빌드 결과물을 노출**시키는 명령어만 추가합니다. 158 | * cache.paths 159 | * 여기에 지정된 위치의 파일들을 S3에 캐시파일로 등록합니다. 160 | * gradle의 경우 ```/root/.gradle/caches/**/*```에 다운받은 의존성 파일들이 있기 때문에 이 위치를 캐시영역으로 지정합니다. 161 | * maven: ```'/root/.m2/**/*'``` 162 | * 그 외 Path [참고](https://aws.amazon.com/ko/blogs/devops/how-to-enable-caching-for-aws-codebuild/) 163 | 164 | ![codebuild8-1](./images/codebuild/codebuild8-1.png) 165 | 166 | (Build가 **1분 4초**가 소모된걸 확인할 수 있습니다.) 167 | 168 | Build 로그를 보시면 원하던대로 커맨드가 실행되서 로그 출력 되는걸 확인할 수 있습니다. 169 | 170 | ![codebuild8-2](./images/codebuild/codebuild8-2.png) 171 | 172 | 자 Build가 정상적으로 수행되는건 확인되었습니다. 173 | 그럼 캐시 기능이 잘 되는지 한번 확인해보겠습니다. 174 | 빌드 화면 위를 보시면 **재시도**버튼이 있습니다. 175 | 재시도 해봅니다. 176 | 177 | ![codebuild9-1](./images/codebuild/codebuild9-1.png) 178 | 179 | 재시로 로그를 보시면 기존에 받던 의존성들을 더이상 받지 않고 S3에서 파일을 하나 받아 ```unzip``` 하는걸 알 수 있습니다. 180 | 181 | ![codebuild9-2](./images/codebuild/codebuild9-2.png) 182 | 183 | 실제로 Build 수행 시간도 1분이 넘던 것이 **36초로 대폭 개선**된 것을 볼 수 있습니다. 184 | 185 | Code Deploy와 Code Build를 모두 생성해봤습니다! 186 | 다음 시간에는 **Code Pipeline**으로 이들을 연결해보겠습니다. 187 | 188 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn ( ) { 37 | echo "$*" 38 | } 39 | 40 | die ( ) { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save ( ) { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /3_CODE_PIPELINE.md: -------------------------------------------------------------------------------- 1 | # 3. AWS Code Pipeline으로 배포하기 2 | 3 | 이번 시간에는 앞서 진행된 [Code Deploy](http://jojoldu.tistory.com/281), [Code Build](http://jojoldu.tistory.com/282)를 Code Pipeline에서 통합해서 사용하는 방법을 소개 드리겠습니다. 4 | 5 | > 모든 코드는 [Github](https://github.com/jojoldu/springboot-deploy)에 있으니 참고 바랍니다 6 | 7 | ## 3-1. Code Pipeline 구축하기 8 | 9 | 먼저 Code Pipeline 웹콘솔로 이동합니다. 10 | **파이프라인 생성**버튼을 클릭합니다. 11 | 12 | ![codepipeline3](./images/codepipeline/codepipeline3.png) 13 | 14 | Code Pipeline 이름을 등록합니다. 15 | 16 | ![codepipeline4](./images/codepipeline/codepipeline4.png) 17 | 18 | 소스를 Github에 가져오도록 선택하고, **Github에 연결**을 클릭합니다. 19 | 20 | ![codepipeline5-1](./images/codepipeline/codepipeline5-1.png) 21 | 22 | OAuth 리다이렉트가 끝나면 리포지토리와 브랜치를 선택합니다. 23 | 24 | ![codepipeline5-2](./images/codepipeline/codepipeline5-2.png) 25 | 26 | 여기서 고급을 보면 실행 트리거가 2개가 있습니다. 27 | 28 | * master 브랜치에 PUSH 발생시 자동 실행 29 | * 파이프라인 수동 실행 30 | 31 | 이번 포스팅에선 **수동 실행**을 선택하겠습니다. 32 | 33 | ![codepipeline6](./images/codepipeline/codepipeline6.png) 34 | 35 | 기존에 등록한 Code Deploy를 선택합니다. 36 | 37 | ![codepipeline7](./images/codepipeline/codepipeline7.png) 38 | 39 | Code Build와 마찬가지로 필요한 IAM Role을 여기서 바로 생성하겠습니다. 40 | 41 | ![codepipeline8](./images/codepipeline/codepipeline8.png) 42 | 43 | ![codepipeline9](./images/codepipeline/codepipeline9.png) 44 | 45 | IAM Role 생성이 끝나면 자동으로 등록됩니다. 46 | 47 | ![codepipeline10](./images/codepipeline/codepipeline10.png) 48 | 49 | 최종적으로 본인이 지정한 스펙을 검토하신뒤 생성합니다. 50 | 51 | ![codepipeline11](./images/codepipeline/codepipeline11.png) 52 | 53 | ![codepipeline12](./images/codepipeline/codepipeline12.png) 54 | 55 | 배포하기 전에 Code Deploy로 채워진 ```~/build/``` 디렉토리를 싹 비우겠습니다. 56 | 57 | ```bash 58 | sudo rm -rf ~/build/* 59 | ``` 60 | 61 | ![codepipeline13](./images/codepipeline/codepipeline13.png) 62 | 63 | 자 현재 ```~/build/``` 에는 아무것도 없습니다. 64 | 배포가 완료되면 배포 파일들이 있겠죠? 65 | 그럼 배포를 진행해볼텐데요. 66 | 그전에! Code Build & Code Deploy을 연계하기 위해 각각의 yml들을 수정하겠습니다. 67 | 먼저 ```buildspec.yml```을 수정하겠습니다. 68 | 69 | ![codepipeline14](./images/codepipeline/codepipeline14.png) 70 | 71 | ```yml 72 | version: 0.2 73 | 74 | phases: 75 | build: 76 | commands: 77 | - echo Build Starting on `date` 78 | - chmod +x ./gradlew 79 | - ./gradlew build 80 | post_build: 81 | commands: 82 | - echo $(basename ./build/libs/*.jar) 83 | - pwd 84 | 85 | artifacts: 86 | files: 87 | - appspec.yml 88 | - build/libs/*.jar 89 | discard-paths: yes 90 | 91 | cache: 92 | paths: 93 | - '/root/.gradle/caches/**/*' 94 | ``` 95 | 96 | 여기서 변경된건 2가지입니다. 97 | 98 | * artifacts.files 99 | * S3로 업로드할 대상을 지정합니다. 100 | * 여기서 지정된 파일들이 zip파일로 되어 S3로 업로드 됩니다. 101 | * jar외에 appspec.yml도 추가된 이유는, Code Deploy때문입니다. 102 | * **Code Build가 끝난후, Code Deploy를 실행시키기 위해** 빌드 파일 목록에 appspec.yml도 추가해야만 합니다. 103 | * artifacts.discard-paths 104 | * 파일의 Path를 버리고 파일만 가져갈지를 선택합니다. 105 | * 예)```build/libs/*.jar``` 106 | * 디폴트: ```/home/ec2-user/build/build/libs/springboot-deploy.jar```가 생성 107 | * ```yes:```: ```/home/ec2-user/build/springboot-deploy.jar```로 생성 108 | * yes로 할 경우엔 해당 파일만 바라보기 때문 109 | 110 | Code Deploy 배포 스펙을 결정하는 appspec.yml로 수정합니다. 111 | 112 | ![codepipeline15](./images/codepipeline/codepipeline15.png) 113 | 114 | ```yml 115 | version: 0.0 116 | os: linux 117 | files: 118 | - source: / 119 | destination: /home/ec2-user/build/ 120 | 121 | permissions: 122 | - object: / 123 | pattern: "**" 124 | owner: ec2-user 125 | group: ec2-user 126 | ``` 127 | 128 | 여기서 추가된건 1가지입니다. 129 | 바로 ```permissions```입니다. 130 | 이게 없다면 code deploy로 전달되는 파일들의 **사용자/그룹이 모두 root**로 됩니다. 131 | ec2의 기본 사용자가 ec2-user이기 때문에 배포파일들도 모두 ec2-user에 권한이 있도록 변경합니다. 132 | 자 그럼 이제 Code Pipeline으로 배포를 해보겠습니다. 133 | 134 | ![codepipeline16](./images/codepipeline/codepipeline16.png) 135 | 136 | Code Deploy까지 성공적으로 끝나면 본인의 EC2로 접속해서 build 디렉토리에 배포파일들이 있는지 확인해봅니다. 137 | 138 | ![codepipeline17](./images/codepipeline/codepipeline17.png) 139 | 140 | ec2-user 사용자로 appspec.yml과 jar파일이 있는것이 확인됩니다! 141 | 여기서 한가지 이상한게 있는데요. 142 | jar명이 springboot-deploy (프로젝트명)이 아닌 **src로 되어있는 것**입니다. 143 | 이유를 파악하기 위해 Code Build 로그를 보겠습니다. 144 | 145 | ![codepipeline18](./images/codepipeline/codepipeline18.png) 146 | 147 | Code Build가 Github에서 바로 코드를 가져올때와 달리, Code Pipeline에서 Code Build로 소스코드를 넣어서 실행할때는 **src라는 임시 디렉토리**를 생성해서 실행합니다. 148 | Gradle에서 별도로 jar명을 지정안했기 때문에 프로젝트 **코드가 있는 디렉토리명이 jar명**이 되어 src라는 jar가 생성된 것입니다. 149 | 이를 해결하기 위해 **build.gradle**에 jar명을 강제지정하겠습니다. 150 | 151 | ```groovy 152 | archivesBaseName = 'springboot-deploy' 153 | ``` 154 | 155 | ![codepipeline19](./images/codepipeline/codepipeline19.png) 156 | 157 | 다시 배포를 실행해봅니다. 158 | 159 | ![codepipeline20](./images/codepipeline/codepipeline20.png) 160 | 161 | 원하던 프로젝트명으로 Jar가 생성되어서 전달되었음을 확인할 수 있습니다! 162 | 163 | ## 3-2. Code Pipeline으로 스프링부트 실행하기 164 | 165 | 자 이제 Code Pipeline으로 빌드된 Jar를 EC2에 전송하는것까지가 완성되었습니다. 166 | 배포가 여기서 끝이 아니죠? 167 | 결국 **서버에서 배포된 Jar를 자동 실행**하고, 잘 **실행되었는지 체크**까지 되야만 합니다. 168 | 이 부분 역시 AWS 내부에서 해결하지 않고, 코드로 해결해보겠습니다. 169 | 먼저 프로젝트 내부에 ```scripts```라는 디렉토리를 생성합니다. 170 | 그리고 이 디렉토리 안에 2개의 쉘 스크립트 파일을 생성합니다. 171 | 172 | * deploy.sh 173 | * 배포된 스프링부트 Jar를 실행시킬 스크립트 174 | * healthCheck.sh 175 | * 스프링부트 Jar가 잘 수행되었는지 확인하는 스크립트 176 | 177 | 178 | ![springboot1](./images/codepipeline/springboot1.png) 179 | 180 | 각각의 스크립트 코드는 아래와 같습니다. 181 | 182 | **deploy.sh** 183 | 184 | ```bash 185 | #!/bin/bash 186 | BUILD_PATH=$(ls /home/ec2-user/build/*.jar) 187 | JAR_NAME=$(basename $BUILD_PATH) 188 | echo "> build 파일명: $JAR_NAME" 189 | 190 | echo "> build 파일 복사" 191 | DEPLOY_PATH=/home/ec2-user/ 192 | cp $BUILD_PATH $DEPLOY_PATH 193 | 194 | echo "> springboot-deploy.jar 교체" 195 | CP_JAR_PATH=$DEPLOY_PATH$JAR_NAME 196 | APPLICATION_JAR_NAME=springboot-deploy.jar 197 | APPLICATION_JAR=$DEPLOY_PATH$APPLICATION_JAR_NAME 198 | 199 | ln -Tfs $CP_JAR_PATH $APPLICATION_JAR 200 | 201 | echo "> 현재 실행중인 애플리케이션 pid 확인" 202 | CURRENT_PID=$(pgrep -f $APPLICATION_JAR_NAME) 203 | 204 | if [ -z $CURRENT_PID ] 205 | then 206 | echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." 207 | else 208 | echo "> kill -15 $CURRENT_PID" 209 | kill -15 $CURRENT_PID 210 | sleep 5 211 | fi 212 | 213 | echo "> $APPLICATION_JAR 배포" 214 | nohup java -jar $APPLICATION_JAR > /dev/null 2> /dev/null < /dev/null & 215 | ``` 216 | 217 | **healthCheck.sh** 218 | 219 | ```bash 220 | #!/bin/bash 221 | echo "> Health check 시작" 222 | echo "> curl -s http://localhost:8080/actuator/health " 223 | 224 | for RETRY_COUNT in {1..15} 225 | do 226 | RESPONSE=$(curl -s http://localhost:8080/actuator/health) 227 | UP_COUNT=$(echo $RESPONSE | grep 'UP' | wc -l) 228 | 229 | if [ $UP_COUNT -ge 1 ] 230 | then # $up_count >= 1 ("UP" 문자열이 있는지 검증) 231 | echo "> Health check 성공" 232 | break 233 | else 234 | echo "> Health check의 응답을 알 수 없거나 혹은 status가 UP이 아닙니다." 235 | echo "> Health check: ${RESPONSE}" 236 | fi 237 | 238 | if [ $RETRY_COUNT -eq 10 ] 239 | then 240 | echo "> Health check 실패. " 241 | exit 1 242 | fi 243 | 244 | echo "> Health check 연결 실패. 재시도..." 245 | sleep 10 246 | done 247 | exit 0 248 | ``` 249 | 250 | 이 스크립트들은 Code Deploy로 배포파일을 받은 후에 실행되어야 합니다. 251 | 252 | AWS Code Deploy의 Hooks 시점은 아래와 같습니다. 253 | (여기서 회식 표시된 시점은 사용자가 커스텀하게 Hook처리를 할수 없습니다.) 254 | 255 | ![springboot2](./images/codepipeline/springboot2.png) 256 | 257 | 여기서 Install이 전달받은 Zip 파일을 푸는 시점입니다. 258 | 즉, Jar를 실행하고, 검증하는 부분은 이 이후 시점에 진행되어야하는데요. 259 | 권장하는 시점은 260 | 261 | * 프로젝트 실행: ApplicationStart 262 | * 검증: ValidateService 263 | 264 | 입니다. 265 | 266 | 그래서 2개의 스크립트 실행시점을 appspec.yml에 설정하겠습니다. 267 | 268 | ![springboot3](./images/codepipeline/springboot3.png) 269 | 270 | ```yml 271 | version: 0.0 272 | os: linux 273 | files: 274 | - source: / 275 | destination: /home/ec2-user/build/ 276 | 277 | permissions: 278 | - object: / 279 | pattern: "**" 280 | owner: ec2-user 281 | group: ec2-user 282 | 283 | hooks: 284 | ApplicationStart: 285 | - location: deploy.sh 286 | timeout: 60 287 | runas: ec2-user 288 | ValidateService: 289 | - location: healthCheck.sh 290 | timeout: 60 291 | runas: ec2-user 292 | ``` 293 | 294 | 그리고 scripts 디렉토리도 Code Build 대상에 포함되도록 buildspec.yml도 수정합니다. 295 | 296 | ![springboot4](./images/codepipeline/springboot4.png) 297 | 298 | ```yml 299 | version: 0.2 300 | 301 | phases: 302 | build: 303 | commands: 304 | - echo Build Starting on `date` 305 | - chmod +x ./gradlew 306 | - ./gradlew build 307 | post_build: 308 | commands: 309 | - echo $(basename ./build/libs/*.jar) 310 | - pwd 311 | 312 | artifacts: 313 | files: 314 | - appspec.yml 315 | - build/libs/*.jar 316 | - scripts/** 317 | discard-paths: yes 318 | 319 | cache: 320 | paths: 321 | - '/root/.gradle/caches/**/*' 322 | ``` 323 | 324 | 이렇게 수정후 PUSH 한뒤에 다시 배포를 해보겠습니다. 325 | 326 | ![springboot5](./images/codepipeline/springboot5.png) 327 | 328 | 배포가 성공적으로 진행된 후, EC2 에서 확인해보시면 스프링부트 프로젝트가 정상적으로 실행되어있음을 알 수 있습니다. 329 | 330 | ![springboot6](./images/codepipeline/springboot6.png) 331 | 332 | 자 그럼 실제로 브라우저에서 접속해보시면! 333 | 334 | ![springboot7](./images/codepipeline/springboot7.png) 335 | 336 | 정상적으로 프로젝트가 실행되어서 호스팅되고 있습니다! 337 | 338 | **Code Pipeline으로 배포 환경을 구축**해봤습니다! 339 | 여기까지 과정은 하나의 EC2에 배포하는 과정이였습니다. 340 | 다음 시간엔 **EC2 배포에서 ASG(Auto Scaling Group) 배포로 확장**하는 방법을 소개드리겠습니다. 341 | 감사합니다^^ 342 | -------------------------------------------------------------------------------- /1_CODE_DEPLOY.md: -------------------------------------------------------------------------------- 1 | # 1. AWS Code Deploy로 배포하기 2 | 3 | AWS로 전체 시스템 구축해야 할 일이 생겨 AWS 배포 환경 시리즈를 시작합니다. 4 | 시리즈 과정은 CodeDeploy -> Code Pipeline -> ELB & Auto Scaling Group -> Beanstalk 으로 진행될 예정입니다. 5 | 6 | > Code Pipeline vs Beanstalk 비교가 목표입니다. 7 | 8 | 포스팅에서 사용된 코드는 모두 [Github](https://github.com/jojoldu/springboot-deploy)에 있습니다. 9 | 10 | > 여기서 사용되는 모든 과정은 **프리 티어라도 비용이 청구**될수 있습니다. 11 | 비용에 관한 어떠한 책임도 여기서 책임지지 않으니 주의해주세요! 12 | 프리티어 내에서 완전 무료로 AWS 배포를 경험하고 싶으시다면 [이전 포스팅](http://jojoldu.tistory.com/265)을 참고하시길 추천드립니다. 13 | 14 | 처음 과정은 단순하게 AWS Code Deploy만으로 진행합니다. 15 | 16 | ## 1-1. IAM Role 생성 17 | 18 | EC2를 생성하기 전에, EC2가 사용할 수 있는 IAM Role을 먼저 생성하겠습니다. 19 | 서비스에서 IAM을 검색후 **역할 만들기**를 클릭합니다. 20 | 21 | ![role1](./images/codedeploy/role1.png) 22 | 23 | 이 역할은 EC2에서 사용할 예정이니 EC2를 선택합니다. 24 | 25 | ![role2](./images/codedeploy/role2.png) 26 | 27 | 연결한 정책에는 총 4개를 선택합니다. 28 | 29 | ![role3](./images/codedeploy/role3.png) 30 | 31 | * AmazonS3FullAccess 32 | * AWSCodeDeployFullAccess 33 | * AWSCodeDeployRole 34 | * CloudWatchLogsFullAccess 35 | 36 | 마지막 검토에는 다음과 같이 노출되어야 합니다. 37 | 38 | ![role4](./images/codedeploy/role4.png) 39 | 40 | **역할 만들기**로 최종 생성하시면 아래와 같이 조회가 되면 됩니다. 41 | 42 | ![role5](./images/codedeploy/role5.png) 43 | 44 | ## 1-2. EC2 생성 45 | 46 | IAM Role 생성이 끝났으니, EC2를 생성합니다. 47 | 기본적인 과정은 기존에 하시던대로 하시면 됩니다. 48 | 49 | ![ec1](./images/codedeploy/ec1.png) 50 | 51 | ![ec2](./images/codedeploy/ec2.png) 52 | 53 | IAM 역할에선 **1-1에서 생성한 IAM Role을 선택**합니다. 54 | 추가로, CloudWatch 모니터링도 활성화 체크 합니다. 55 | 56 | ![ec3](./images/codedeploy/ec3.png) 57 | 58 | 스토리지의 경우 **30GB까지가 프리티어**이기 때문에 30으로 변경합니다. 59 | 60 | ![ec4](./images/codedeploy/ec4.png) 61 | 62 | 인스턴스 검색을 쉽게 하기 위해 **Name** 태그를 추가합니다. 63 | 64 | ![ec5](./images/codedeploy/ec5.png) 65 | 66 | ![ec6](./images/codedeploy/ec6.png) 67 | 68 | 기존에 사용하시던 키 페어가 있으시면 해당 키 페어를 사용하시고, 없으시면 새로 만듭니다. 69 | 70 | ![ec7](./images/codedeploy/ec7.png) 71 | 72 | 인스턴스 상태가 running으로 변경되면 EC2 생성이 완료 됩니다. 73 | 74 | ![ec8](./images/codedeploy/ec8.png) 75 | 76 | ## 1-3. EC2 설정 77 | 78 | EC2 인스턴스로 ssh 접속 후 다음의 명령어를 실행합니다. 79 | 혹시나 pem키 접속시 아래와 같이 permission 오류가 발생하신다면, 80 | 81 | ![ec2-setting1](./images/codedeploy/ec2-setting1.png) 82 | 83 | 아래 명령어로 개인계정 read 권한만 할당합니다. 84 | 85 | ```bash 86 | chmod 400 pem키 87 | ``` 88 | 89 | ### 1-3-1. Java8 설치 90 | 91 | EC2에 SSH 접속 되셨다면, Java8을 설치합니다. 92 | 93 | ```bash 94 | sudo yum update 95 | sudo yum install -y java-1.8.0-openjdk-devel.x86_64 96 | sudo /usr/sbin/alternatives --config java 97 | sudo yum remove java-1.7.0-openjdk 98 | ``` 99 | 100 | ![ec2-setting2](./images/codedeploy/ec2-setting2.png) 101 | 102 | java 버전을 확인해봅니다. 103 | 104 | ```bash 105 | java -version 106 | ``` 107 | 108 | ![ec2-setting3](./images/codedeploy/ec2-setting3.png) 109 | 110 | 이외에 필요한 것들이 더 있으시면 설치하시면 됩니다. 111 | (스프링부트 프로젝트에는 이외에는 별도로 필요한게 없습니다.) 112 | 113 | ### 1-3-2. Code Deploy Agent용 사용자 추가 114 | 115 | 이제 EC2가 Code Deploy 이벤트를 수신할 수 있도록 Agent를 설치해야하는데요. 116 | 그전에 EC2에서 AWS CLI를 사용할 수 있도록, IAM 사용자를 하나 추가하겠습니다. 117 | IAM 사용자는 보통 IAM 정책이 적용된 그룹 생성 -> 해당 그룹에 사용자 추가로 진행합니다. 118 | 119 | 그래서 그룹부터 먼저 생성하겠습니다. 120 | 121 | ![ec2-setting4](./images/codedeploy/ec2-setting4.png) 122 | 123 | ![ec2-setting5](./images/codedeploy/ec2-setting5.png) 124 | 125 | 정책 선택은 아무것도 하지않고 넘깁니다. 126 | (정책은 이후 **JSON으로 한번에 적용**할 예정입니다.) 127 | 128 | ![ec2-setting6](./images/codedeploy/ec2-setting6.png) 129 | 130 | ![ec2-setting7](./images/codedeploy/ec2-setting7.png) 131 | 132 | 그룹 생성이 완료된 후, 해당 그룹으로 이동해보시면 133 | 134 | ![ec2-setting8](./images/codedeploy/ec2-setting8.png) 135 | 136 | 권한 -> 인라인 정책 탭을 수정합니다. 137 | 138 | ![ec2-setting9](./images/codedeploy/ec2-setting9.png) 139 | 140 | ![ec2-setting10](./images/codedeploy/ec2-setting10.png) 141 | 142 | 정책 문서에 하단의 JSON 코드를 그대로 추가합니다. 143 | 144 | ![ec2-setting11](./images/codedeploy/ec2-setting11.png) 145 | 146 | ```json 147 | { 148 | "Version": "2012-10-17", 149 | "Statement": [ 150 | { 151 | "Effect": "Allow", 152 | "Action": [ 153 | "autoscaling:*", 154 | "codedeploy:*", 155 | "ec2:*", 156 | "lambda:*", 157 | "elasticloadbalancing:*", 158 | "s3:*", 159 | "cloudwatch:*", 160 | "logs:*", 161 | "sns:*" 162 | ], 163 | "Resource": "*" 164 | } 165 | ] 166 | } 167 | ``` 168 | 169 | * Version은 무조건 ```"2012-10-17"``` 만 됩니다. 170 | 171 | 정책이 성공적으로 추가됐습니다. 172 | 173 | ![ec2-setting12](./images/codedeploy/ec2-setting12.png) 174 | 175 | 그룹 생성과 편집이 끝났으니, 적절한 사용자를 추가하겠습니다. 176 | 177 | ![ec2-setting13](./images/codedeploy/ec2-setting13.png) 178 | 179 | ![ec2-setting14](./images/codedeploy/ec2-setting14.png) 180 | 181 | 그룹에 사용자 추가하기 버튼을 클릭하신뒤, 방금 생성한 그룹을 선택합니다. 182 | 183 | ![ec2-setting15](./images/codedeploy/ec2-setting15.png) 184 | 185 | ![ec2-setting16](./images/codedeploy/ec2-setting16.png) 186 | 187 | 최종 사용자 생성이 완료되면, 해당 사용자를 인증할 수 있는 엑세스키가 생성됩니다. 188 | 현재 페이지에서만 받을수 있으니, 얼른 ```.csv```를 다운받습니다. 189 | 190 | ![ec2-setting17](./images/codedeploy/ec2-setting17.png) 191 | 192 | 여기까지 하셨다면 다시 EC2로 돌아가서 Code Deploy Agent를 설치하겠습니다. 193 | 194 | ### 1-3-3. EC2에 Code Deploy Agent 설치 195 | 196 | EC2에 CodeDeploy로 지정한 위치에서 파일을 받아 실행하기 위해서는 Code Deploy Agent가 설치되있어야만 합니다. 197 | 이를 진행하겠습니다. 198 | 199 | EC2에 접속하시고, ```aws-cli```를 먼저 설치합니다. 200 | 201 | ```bash 202 | sudo yum install -y aws-cli 203 | ``` 204 | 205 | 사용자 홈으로 이동하고 aws cli 설정을 시작합니다. 206 | 207 | ```bash 208 | cd /home/ec2-user/ 209 | sudo aws configure 210 | ``` 211 | 212 | ![ec2-setting18](./images/codedeploy/ec2-setting18.png) 213 | 214 | * Access Key 215 | * 좀전에 생성한 사용자의 엑세스키 (.csv파일에 있음)를 등록합니다. 216 | * Secret Access Key 217 | * 좀전에 생성한 사용자의 시크릿키 (.csv파일에 있음)를 등록합니다. 218 | * region name 219 | * ap-northeast-2 220 | * 서울 리전을 얘기합니다. 221 | * output format 222 | * json 223 | 224 | aws 설정이 끝나셨다면, Agent 설치파일을 다운받겠습니다. 225 | 226 | ```bash 227 | wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install 228 | ``` 229 | 230 | 해당 파일에 실행권한을 추가합니다. 231 | 232 | ```bash 233 | chmod +x ./install 234 | ``` 235 | 236 | 실행권한이 추가되셨다면, 설치를 진행합니다. 237 | 238 | ```bash 239 | sudo ./install auto 240 | ``` 241 | 242 | 설치가 완료되셨으면 아래 명령어로 Agent가 실행중인지 확인합니다. 243 | 244 | ```bash 245 | sudo service codedeploy-agent status 246 | ``` 247 | 248 | ![ec2-setting19](./images/codedeploy/ec2-setting19.png) 249 | 250 | 마지막으로 EC2 인스턴스가 부팅되면 자동으로 AWS CodeDeploy Agent가 실행될 수 있도록 /etc/init.d/에 쉘 스크립트 파일을 하나 생성하겠습니다. 251 | 252 | ```bash 253 | sudo vim /etc/init.d/codedeploy-startup.sh 254 | ``` 255 | 256 | 스크립트 내용은 아래와 같습니다. 257 | 258 | ```bash 259 | #!/bin/bash 260 | echo 'Starting codedeploy-agent' 261 | sudo service codedeploy-agent restart 262 | ``` 263 | 264 | 스크립트 파일을 저장한뒤, 실행권한을 추가합니다. 265 | 266 | ```bash 267 | sudo chmod +x /etc/init.d/codedeploy-startup.sh 268 | ``` 269 | 270 | EC2에 CodeDeloy Agent 설치가 완료되었습니다! 271 | 272 | ## 1-4. 프로젝트 생성하기 273 | 274 | Code Deploy로 배포할 간단한 스프링부트 프로젝트를 생성하시고, 이를 Github과 연결합니다. 275 | (제가 만든 프로젝트는 [여기](https://github.com/jojoldu/springboot-deploy)에 있습니다.) 276 | 277 | > 프로젝트 환경은 java8 / SpringBoot / Gradle 입니다. 278 | 279 | 간단한 프로젝트 생성후, 프로젝트 내부에 ```appspec.yml```파일을 생성합니다. 280 | 281 | ![codedeploy1](./images/codedeploy/codedeploy1.png) 282 | 283 | ```yml 284 | version: 0.0 285 | os: linux 286 | files: 287 | - source: / 288 | destination: /home/ec2-user/build/ 289 | ``` 290 | 291 | AWS CodeDeploy는 이 ```appspec.yml```을 통해서 **어떤 파일들을, 어느 위치로 배포하고, 이후 어떤 스크립트를 실행**시킬것인지를 모두 관리합니다. 292 | 위 코드는 Code Build / S3 / Github 등을 통해서 받은 전체 파일들(```source: /```)을 ```/home/ec2-user/build/```로 옮기겠다는 의미입니다. 293 | 294 | 자 그럼 EC2에 ```/home/ec2-user/build/```디렉토리를 생성합니다. 295 | 296 | ```bash 297 | mkdir /home/ec2-user/build/ 298 | ``` 299 | 300 | ![codedeploy2](./images/codedeploy/codedeploy2.png) 301 | 302 | 여기까지 하셨다면, 기본적인 프로젝트 세팅은 끝났습니다. 303 | 304 | ## 1-5. Code Deploy 생성하기 305 | 306 | 본격적으로 Code Deploy를 통해 EC2에 배포를 진행해보겠습니다. 307 | 308 | ### 1-5-1. Code Deploy용 Role 생성 309 | 310 | 1-1.에서 생성한 Role은 EC2를 위한 Role입니다. 311 | 이번엔 **Code Deploy가 EC2에 접근할 수 있도록** Role을 생성하겠습니다. 312 | 313 | ![codedeploy-role1](./images/codedeploy/codedeploy-role1.png) 314 | 315 | 서비스에선 1-1에서 **EC2를 선택한것과 달리, Code Deploy를 선택**합니다. 316 | 317 | ![codedeploy-role2](./images/codedeploy/codedeploy-role2.png) 318 | 319 | ![codedeploy-role3](./images/codedeploy/codedeploy-role3.png) 320 | 321 | ![codedeploy-role4](./images/codedeploy/codedeploy-role4.png) 322 | 323 | 마지막 생성까지 끝나시면, **신뢰할 수 있는 객체로 codedeploy를 가진** 역할이 하나 생성된 것을 확인할 수 있습니다. 324 | 325 | ![codedeploy-role5](./images/codedeploy/codedeploy-role5.png) 326 | 327 | ### 1-5-2. Code Deploy 생성 328 | 329 | AWS 웹 콘솔에 접속하셔서 AWS Code Deploy로 이동합니다. 330 | 331 | ![codedeploy3](./images/codedeploy/codedeploy3.png) 332 | 333 | 334 | ![codedeploy4-1](./images/codedeploy/codedeploy4-1.png) 335 | 336 | 환경 구성은 일단 EC2 인스턴스로 합니다. 337 | (앞으로의 과정에서 오토스케일링 그룹 배포로 전환될 예정입니다.) 338 | 339 | ![codedeploy4-2](./images/codedeploy/codedeploy4-2.png) 340 | 341 | 여기서 서비스 역할을 보시면, IAM Role을 선택해야하는데요. 342 | 1-5-1에서 생성한 **Code Deploy용 Role**을 선택합니다. 343 | (EC2 Role이 아닙니다.) 344 | 345 | ![codedeploy4-3](./images/codedeploy/codedeploy4-3.png) 346 | 347 | 최종 생성이 완료되시면 아래와 같이 해당 그룹이 보입니다. 348 | 349 | ![codedeploy5](./images/codedeploy/codedeploy5.png) 350 | 351 | 자 Code Deploy가 생성되었으니, 한번 실행해보겠습니다. 352 | 353 | ## 1-6. Code Deploy 실행하기 354 | 355 | 1-5에서 생성한 Code Deploy를 통해 실제 EC2에 배포를 진행해보겠습니다. 356 | 배포 그룹을 선택하신뒤, **작업 -> 새 개정 배포**를 클릭합니다. 357 | 358 | ![codedeploy6](./images/codedeploy/codedeploy6.png) 359 | 360 | 여기서 저희는 S3에 올라간 파일을 사용하지 않고, Github에서 바로 받아서 하도록 **Github**을 선택합니다. 361 | 선택하신뒤, 하단을 보시면 Github 계정 연결 창이 나오는데, 본인의 계정을 입력하시고 **Github에 연결** 버튼을 클릭합니다. 362 | 363 | ![codedeploy7](./images/codedeploy/codedeploy7.png) 364 | 365 | OAuth2가 자동으로 진행됩니다. 366 | 367 | ![codedeploy8](./images/codedeploy/codedeploy8.png) 368 | 369 | 계정 연결이 성공하시면, 배포할 프로젝트의 Github의 커밋 히스토리로 갑니다. 370 | 커밋 히스토리를 보시면 본인의 커밋 히스토리가 나오는데요. 371 | 배포할 버전의 커밋 ID를 복사합니다. 372 | 373 | ![codedeploy9](./images/codedeploy/codedeploy9.png) 374 | 375 | 복사한 커밋 ID와 저장소명을 Code Deploy에 등록합니다. 376 | 나머지 옵션은 디폴트로 선택합니다. 377 | 378 | ![codedeploy10](./images/codedeploy/codedeploy10.png) 379 | 380 | 다 끝나셨다면 **배포**를 클릭합니다. 381 | 382 | > Code Deploy는 **CI의 기능이 없습니다**. 383 | 즉, 지정된 위치의 파일을 전송하는 역할만 하기 때문에 CodeDeploy만 가지고는 이렇게 불편하게 하는데요. 384 | 보통은 젠킨스 / Travis CI / AWS Code Build 등을 통해 빌드후, **빌드된 파일을 받도록** 합니다. 385 | 이 과정은 차차 진행할 예정입니다. 386 | TravisCI + Code Deploy를 사용하는 방법이 궁금하시다면, [이전의 포스팅](http://jojoldu.tistory.com/265)을 참고하세요! 387 | 388 | 결과를 기다리시면! 389 | 배포가 성공됐음을 확인할 수 있습니다. 390 | ![codedeploy11](./images/codedeploy/codedeploy11.png) 391 | 392 | 그럼 이제 본인의 EC2로 접속해서 Github에 올라간 프로젝트 파일들이 잘 도착했는지 확인합니다. 393 | 짜잔! 394 | 395 | ![codedeploy12](./images/codedeploy/codedeploy12.png) 396 | 397 | Github에 올라간 파일들이 EC2에 성공적으로 도착했습니다. 398 | 399 | ## 마무리 400 | 401 | Code Deploy를 통해 Github에 올라간 파일들을 EC2에 전달하는 기능을 구현해봤습니다. 402 | 하지만 이게 실제 배포라고 하기엔 무리가 있죠? 403 | 현재 포스팅에선 다음의 과정들이 생략 되었습니다. 404 | 405 | * Gradle을 통해 Build 과정 누락 406 | * 빌드된 Jar파일 생성 과정 필요 407 | * 빌드된 Jar를 통해 스프링부트 자동 실행 408 | * 기존 실행중인 스프링부트가 있다면 종료후, 실행 409 | * 자동으로 Github의 최신 버전을 배포 대상으로 지정 410 | * 현재는 커밋 ID로 배포 버전을 결정 411 | 412 | 자! 다음시간엔 이 문제들을 해결할 수 있도록 **Code Pipeline**을 사용하는 과정을 진행하겠습니다. 413 | 감사합니다^^ 414 | --------------------------------------------------------------------------------