본문 바로가기

퍼블릭 클라우드

[draft] AWS CodeDeploy 사용법

AWS CodeDeploy 사용법

AWS 개발자 도구

코드를 호스팅하고 자동으로 애플리케이션을 AWS로 빌드, 테스트 및 배포합니다.

CodeDeploy

웹 소스 생성

spring boot 프로젝트 생성

 - vscode spring boot 프로젝트 세팅 및 실행 : https://www.sangchul.kr/482

appspec.yml 생성

version: 0.0
os: linux
files:
  - source:  /
    destination: /home/ec2-user/build/

VSCODE

IAM(Identity and Access Management) Role 생성

ec2 인스턴스에서 사용할 iam role 생성

Identity and Access Management(IAM) > 액세스 관리 > 역할 > 역할 만들기

IAM
IAM

정책 이름

  • AmazonS3FullAccess
  • AWSCodeDeployFullAccess
  • AWSCodeDeployRole
  • CloudWatchLogsFullAccess

IAM

역할 이름 : BbEC2RoleforAWSCodeDeploy

설명 : Allows EC2 instances to call AWS services on your behalf.

IAM
IAM
IAM

codedeploy에서 사용할 iam role 생성

Identity and Access Management(IAM) > 액세스 관리 > 역할 > 역할 만들기

IAM

정책 이름

  • AWSCodeDeployRole

IAM

역할 이름 : BbAWSCodeDeployRole

설명 : Allows CodeDeploy to call AWS services such as Auto Scaling on your behalf.

IAM
IAM
IAM

Identity and Access Management(IAM) > 액세스 관리 > 사용자 그룹 > 그룹 생성

- 사용자 그룹 이름 : CodeDeployAgentGroup

권한 > 권한 추가 > 인라인 정책 생성 > JSON

IAM

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "autoscaling:*",
                "codedeploy:*",
                "ec2:*",
                "lambda:*",
                "elasticloadbalancing:*",
                "s3:*",
                "cloudwatch:*",
                "logs:*",
                "sns:*"
            ],
            "Resource": "*"
        }
    ]
}

 

- 이름 : CodeDeployAgentGroupPolicy

IAM

IAM 사용자 생성(배포 계정 생성)

Github Actions에서 S3로 파일 업로드

- 사용자 이름 : githubactionscodedeploy

IAM

권한 설정

  • AWSCodeDeployFullAccess
  • AmazonS3FullAccess

IAM
IAM

ec2 인스턴스 생성(또는 기존 인스턴스 사용)

신규 ec2 인스턴스 생성

AWS EC2
AWS EC2

기존 인스턴스에 iam role 추가하기

AWS EC2
AWS EC2

EC2에 CodeDeploy Agent 설치하기

awscli 설치

curl -SsL "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install
$ /usr/local/bin/aws --version
aws-cli/2.9.6 Python/3.9.11 Linux/5.10.147-133.644.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off

EC2에 CodeDeploy Agent 설치

aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
$ aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
download: s3://aws-codedeploy-ap-northeast-2/latest/install to ./install
chmod +x install
./install auto

오류 : ec2에 루비(ruby)가 설치되어 있지 않아 발생한 오류

$ ./install auto
/usr/bin/env: ruby: No such file or directory
yum install -y ruby
./install auto
$ ./install auto     
I, [2022-12-12T07:18:38.854654 #3520]  INFO -- : Starting Ruby version check.
I, [2022-12-12T07:18:38.854923 #3520]  INFO -- : Starting update check.
...
Installed:
  codedeploy-agent.noarch 0:1.4.1-2244                                                                                              

Complete!
I, [2022-12-12T07:18:41.857044 #3520]  INFO -- : Update check complete.
I, [2022-12-12T07:18:41.857138 #3520]  INFO -- : Stopping updater.
service codedeploy-agent status
$ service codedeploy-agent status
The AWS CodeDeploy agent is running as PID 3604

codedeploy-startup.sh 스크립트 생성

 ec2 인스턴스가 부팅하며 자동으로 aws codedeploy agent가 실행되도록 /etc/init.d/에 쉘 스크립트 파일 생성

vim /etc/init.d/codedeploy-startup.sh
#!/bin/bash

echo 'Starting codedeploy-agent' 

sudo service codedeploy-agent restart
chmod +x /etc/init.d/codedeploy-startup.sh

** 사용자 데이터 추가 시

- codeploy user data(사용자 데이터) : https://www.sangchul.kr/481

#!/bin/bash

yum install -y ruby

yum erase -y codedeploy-agent

### codedeploy agent install
cd /home/ec2-user
curl -O https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
./install auto

systemctl --now enable codedeploy-agent

Amazon S3

s3 버킷 생성

- 버킷 이름 : bb-codedeploydemobucket

웹 소스 압축(zip 압축)

zip aaa.zip demo/*

*** 압축 해제

unzip aaa.zip
unzip aaa.zip -d ./target

s3 버킷으로 웹 소스 업로드

aws s3 cp aaa.zip s3://bb-codedeploydemobucket/

AWS CodeDeploy 생성

애플리케이션 가동 시간을 유지하려면 코드 배포를 자동화합니다.

AWS CodeDeploy > 개발자 도구 > CodeDeploy > 애플리케이션 생성

- 애플리케이션 이름 : bb-springboot-application

- 컴퓨팅 플랫폼 : EC2/온프레미스

AWS CodeDeploy

AWS CodeDeploy > 개발자 도구 > CodeDeploy > 애플리케이션 > bb-springboot-application 애플리케이션 > 배포 그룹 생성

AWS CodeDeploy

배포 그룹 이름 : bb-springboot-application-deployment-group

서비스 역할 : BbAWSCodeDeployRole

AWS CodeDeploy
AWS CodeDeploy

태그 그룹

키 : CodeDeploy

값 : bb-springboot-01

AWS CodeDeploy
AWS CodeDeploy
AWS CodeDeploy

배포 생성(배포 만들기)

AWS CodeDeploy
AWS CodeDeploy

배포 내역

AWS CodeDeploy

ec2 인스턴스

[ec2-user@ip-172-31-95-69 build]$ pwd
/home/ec2-user/build

[ec2-user@ip-172-31-95-69 build]$ ls
HELP.md  appspec.yml  bin  build.gradle  gradle  gradlew  gradlew.bat  settings.gradle  src

 

추가 작업

zbuild.sh 스크립트 생성

vim zbuild.sh
#!/bin/bash

cp appspec.yml build/libs/appspec.yml

./gradlew build

cd build/libs/
zip aaa.zip demo-*-SNAPSHOT.jar appspec.yml

aws s3 cp aaa.zip s3://bb-codedeploydemobucket/aaa.zip

rm -rf aaa.zip

aws deploy create-deployment --application-name bb-springboot-application --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name bb-springboot-application-deployment-group --s3-location bucket=bb-codedeploydemobucket,key=aaa.zip,bundleType=zip
chmod +x zbuild.sh

 

java -jar demo-0.0.1-SNAPSHOT.jar
$ java -jar demo-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.0.0)

2022-12-21T08:49:32.060Z  INFO 4858 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication using Java 19.0.1 with PID 4858 (/home/ec2-user/build/demo-0.0.1-SNAPSHOT.jar started by root in /home/ec2-user/build)
2022-12-21T08:49:32.070Z  INFO 4858 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to 1 default profile: "default"
2022-12-21T08:49:34.869Z  INFO 4858 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2022-12-21T08:49:34.894Z  INFO 4858 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-12-21T08:49:34.895Z  INFO 4858 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.1]
2022-12-21T08:49:35.177Z  INFO 4858 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-12-21T08:49:35.180Z  INFO 4858 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2957 ms
2022-12-21T08:49:36.602Z  INFO 4858 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-12-21T08:49:36.643Z  INFO 4858 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 5.63 seconds (process running for 6.726)

 

참고 URL

- codeploy user data(사용자 데이터) : https://www.sangchul.kr/481

- Amazon Linux 또는 RHEL용 CodeDeploy 에이전트 설치: https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html

- AppSpec 파일 구조 : https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file-structure.html