서론
CI
툴을 이용해서나 빌드를 마친 파일이나 간단하게 테스트 해볼 파일을 S3
와 CodeDeploy
를 이용해 EC2
Instance로 자동배포하기 위한 글이다.
간단히 정리하자면
CodeDeploy
를 통해S3
에 있는 데이터를 배포할 것이다.- 배포할 목적지는
EC2 Instance
CI
는 안되니까 배포하고 싶은 파일을.zip
으로 압축하여S3 Bucket
에 업로드 해야함.
해야하는 작업
크게 해야하는 작업들은 아래와 같다.
IAM Role
생성EC2
Instance가 배포과정에서 사용할 IAM Role이 하나 필요하다. 자세한 내용은 아래서 언급.CodeDeploy
가 배포과정에서 사용할 IAM Role이 하나 필요하다.IAM User
와aws cli
는 필요 없음!- EC2 Instance를 만들고
codedeply-agent
를 설치한다. appspec.yml
을 최상위경로에 두는 프로젝트를.zip
으로 압축한다.이후S3
에 업로드한다.CodeDeploy
앱을 만들고,배포그룹
을 만들고, 아까 업로드한 S3 버킷 내의 file을 이용해 배포를 생성한다.
EC2 Instance를 위한 IAM Role 생성
trusted entity(신뢰할 수 있는 개체)
로 EC2 를 골라주고 Role의 Policy는 AmazonEC2RoleforAWSCodeDeploy 를 선택해준다. Role의 이름은 편한 대로 설정.
나의 삽질 부분
: Github Repository를 이용할 때는 아무 Policy도 설정안했잖아요?
→ 맞다 하지만 이번엔 Github Repo
가 아닌 S3
에서 빌드된(혹은 아무거나 배포하고싶은)파일을 서버에 배포하는 것이기 때문에 S3에 대한 접근이 가능하다는 Policy를 부여해주어야한다.
사진과 같이 Role의 이름은 AWSCodeDeploy
를 위한 EC2
의 Role이라고 하지만, 정작 내용은 S3
에 대한 내용. 따라서 꼭 EC2RoleforAWSCodeDeploy
가 아니라 S3ReadOnly
등의 Policy를 부여해도 CodeDeploy가 잘 작동한다. 하지만 S3 Read에 관한 Role을 부여하지 않는다면 Access Denied!
와 함께 CodeDeploy가 잘 작동하지 못한다.
CodeDeploy를 위한 IAM Role 생성
trusted entity(신뢰할 수 있는 개체)
는 CodeDeploy
로 선택. Use case(사용 사례)
는 EC
2에 배포할 것이므로 CodeDeploy
를 선택해준다. 이후 Role은 어차피 AWSCodeDeployRole
을 선택(어차피 이거밖에 안 뜰 것임).
이 Role의 이름은 deploy-s3-role
이라고 설정했다.
EC2 Instance 생성, 설정
EC2 를 생성하고, codedeploy-agent
를 설치하는 부분까지는 Github Repository
를 이용했을 때와 동일하다(appspec.yml
설정이전 까지는 동일하다는 말).
평소처럼 EC2 Instance(Ubuntu 18.04)
를 생성해주고, 아까 EC2를 위해 생성했던 빈 IAM Role
을 설정해준다. 나중에 Instance의 이름으로 CodeDeploy에서 Instance를 찾아낼 것이므로 Instance의 이름도 설정해주는 것이 좋다.
sudo apt update
sudo apt install ruby
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
를 통해 codedeploy-agent
에 필요한 ruby
와 codedeploy-agent
를 설치해준다.
codedeploy-agent
는 CodeDeploy 앱이 배포 명령을 내리는 것을 수신하고 작업을 수행하는 역할을 하는 프로그램인듯하다. 이 친구가 없으면 CodeDeploy 가 EC2와 작업을 하지 못한다.
sudo service codedeploy-agent start && sudo service codedeploy-agent status
를 통해 codedeploy-agent를 실행시켜주고 Active한 상태인지 확인해본다.
appspec.yml 작성 및 S3에 .zip 업로드
appspec.yml
은 Github Repo를 이용했을 때와 동일하다.
#/appspec.yml
# version은 0.0을 적어준다.
version: 0.0
# 선택한 ec2 가 window server가 아니라면 linux를 적어준다.
os: linux
files:
# source는 프로젝트 기준, destination은 instance 기준으로 입력해주고,
# source가 destination안에 복사됨
- source: /
destination: /home/ubuntu/build
hooks:
# 주의 할 점은 빈칸 yml파일 특성상 빈칸 개수를 중시해야하고 Tab을 쓰면 안된다는점
# AfterInstall앞은 2칸이다.
AfterInstall:
# location은 프로젝트 기준으로 위치를 작성해준다!
- location: /start.sh
# runas를 입력해주지 않으면 간혹 permission error가 날 수도
runas: root
그리고 /start.sh
로 앱이 배포되며 Install 단계를 거친 뒤 수행할 sh 명령을 작성해주자. 배포 관련 사이클은 codedeploy hook
관련해 검색해보면 찾을 수 있다.
pwd>/home/ubuntu/location
←start.sh
는 이렇게 간단하게 한 줄만 적어주자. 파일명은 자기 편할 대로 적어주되 hooks의 location과는 일치해야함.
현재 배포 작업을 수행 중인 위치를 /home/ubuntu/location
이라는 파일에 출력해주는 간단한 shell script이다.
이제 위와 같은 구조로 tutorial.zip
이라는 압축파일을 만들어준다.
그럼 이제 S3 버킷을 만들어보자.
사실 아무 설정할 필요가 없어서 언급을 딱히 안 해도 되지만 웬만하면 S3를 이용할 떄 모든 퍼블릭 액세스 차단을 체크한 채로 사용하는 것이 보안상 좋다.
버킷이 생성되면 아까 만든 .zip
file을 업로드 해주자. 업로드 시에도 권한도 딱히 건드릴 게 없는데, 읽기에만 체크가 되어있으면 된다.
이렇게 난 codedeploy-tutorial-007
이라는 버킷에 tutorial.zip 이라는 zip file을 업로드 했다.
CodeDeploy 설정하고 배포하기
애플리케이션 생성은 그냥 간단히 EC2/온프레
로 설정해주기만 하면 되고
배포 그룹에서의 Role도 아까 CodeDeploy를 위한 Role
에서 생성한 Role을 부여해주면된다. 전체적으로 Github Repo를 이용할 때와 같음. 간단한 테스트를 하므로 로드밸런싱
을 비활성화!
이제 진짜 배포 생성을 해줄 것인데, Github Repo를 이용할 때와 다른 점은 바로 이 곳!
개정 위치 밑에 나온 안내에 따라 s3 속 파일의 위치를 적어준다.
배포가 잘 되었다면 위의 사진들처럼 성공표시가 떠야하고 우리가 배포하려던 파일들이 정상적으로 위치해있어야한다.
그럼 배포 끝!
각종 에러 및 로그 보는 법에 관해
이 부분은 Github Repo를 이용하는 곳에 모두 적어두었으니 CodeDeploy와 Github 이용해 배포하기를 참고하자.
마치며
사실 Github Repo랑 거의 동일한 작업들로 이루어져 금방할 수 있었지만, 대체 왜 S3 관련 Policy를 Role에 부여해도 작동하는지, Github Repo를 이용할 땐 왜 빈 Policy를 부여해도 작동하는지 생각하고 분석해보느라 오래걸렸다. 뇌피셜이긴 하지만 아마 내가 위에서 언급한 대로 EC2RoleforAWSCodeDeploy
라는 Policy의 이름은 전반적으로 CodeDeploy를 이용할 때 필요한 Policy같지만, 사실 S3
를 이용해 배포할 때에만 필요한 것이라는 게 맞는 사실인 것 같다. 대체 왜 Policy 이름을 저렇게 했는지.... Ec2RoleforAWSCodeDeployWithS3
이런식으로 해줘야 맞는 거 아닌가싶다.
CI
과정없이 Deploy
자동화하는 작업이라서 꽤나 불편해보일 수 있는데, 어서 CI작업까지 연결시켜서 정말 간편하게 자동 빌드, 배포 할 수 있기를~~
'AWS' 카테고리의 다른 글
AWS CodePipeLine, CodeBuild, CodeDeploy를 통해 EC2에 배포하기, AWS CI/CD 구축하기 - 2 (0) | 2020.01.21 |
---|---|
AWS CodePipeLine, CodeBuild, CodeDeploy를 통해 EC2에 배포하기, AWS CI/CD 구축하기 - 1 (0) | 2020.01.21 |
AWS CodeDeploy와 Gtithub 이용해 배포하기 (0) | 2020.01.14 |
CloudWatch, Lambda 를 이용한 SlackBot 만들기 (0) | 2019.10.29 |
AWS EC2와 Docker container로 웹서버 구축하기 (0) | 2019.06.03 |