GCP 로그인 후 화면 우측 상단에서 Cloud shell 버튼을 클릭하여 터미널을 연다. (프로젝트도 선택된다)
Welcome to Cloud Shell! Type "help" to get started. Your Cloud Platform project in this session is set to <프로젝트ID>. Use “gcloud config set project [PROJECT_ID]” to change to a different project. idogfootman@cloudshell:~ (프로젝트ID)$
터미널에서 gcloud init 을 했더니... (이미 선택되어있었지만) 다시 어떤 프로젝트 환경설정을 할 것인지 정하라고 하네 현재 프로젝트번호를 입력하면 기본 region/zone을 선택하라고 함.
. 파이프라인 이름 : simple-pipeline-aws (simple-pipeline이라고 project 이름을 지어놔서... 그냥 다르게 이름을 변경 한 것임. ) . 새서비스 역할 파이프 라인 이름이 자동으로 뒤에 붙기 되는데... 편집할까? 역할이름 : AWSCodePipelineServiceRole-ap-northeast-2-simple-pipeline-aws
. 소스 공급자 : AWS CodeCommit . Repository : simple-pipeline-repo . 브랜치 이름 : master (1번에서 repository만 만들고 push된 게 없으므로 추가 필요)
. 빌드 스테이지 : 빌드는 선택사항이고 이번에는 빌드 없이 가는 것이므로 " 빌드 스테이지 건너뛰기" 선택 . 배포 스테이지 : - 배포공급자 : AWS CodeDeploy - 리전 : 아시아 태평양 서울 - 애플리케이션 이름 : simple-pipeline - 배포그룹 : simple-pipeline-deployment-group
. 파이프라인 생성 버큰 클릭.
. 생성되면 한번은 pipeline을 실행시키는데 ... 권한부족으로 에러가 나는 경우가 있다.
해당 Role에 권한이 없다는 얘기인데 이름을 보면 Pipeline생성할 때 역할생성 허용으로 만든 이름이다. 무슨권한이 없다는 것일까? IAM > Role에서 해당권한을 찾아 추가하면 됨.
우선 pipe라인의 어느 단계에서 발생한건지 확인해보니 Source단계다 그래서 codeCommit 권한을 준다. FullAccess로다가 권한 추가 > AWSCodeCommitFullAccess
추가한 다음 CodePipeline으로 와서 "재시도"버튼 클릭 근데 이번에는 다른 오류다
맞다. Repository만 만들고 파일은 하나도 없다 ㅋㅋ
AWS의 도움말에서 제공하는 샘플 프로젝트 파일을 첨부파일로 올려둔다.
파일 구조는
예제에서 MyDemoRepo가 내 repository로 보면 된다. 파일을 하나하나 레파지토리에서 추가해서 넣을 수도 있다.(한번에 1개씩만 된다 ㅡㅡ) git을 이용하여 추가할 수도 있다.
-- 터미널에서 1단계에서 clone한 위치로 간다. cd ~/Documents/cicd cd simple-pipeline-repo # ls 해서 .git파일만 있는것을 확인한다. 위 SampleApp_Linux.zip 압축을 풀어 파일들을 이곳으로 옮긴다.
작업에 앞서 역할(Role)을 만든다. EC2를 위한 Role과 별개로 AWSCodeDeployRole 추가. IAM > 역할 > 역할생성 . 신뢰할 수 있는 엔터티 유형 : AWS서비스 . 사용사례 : 다른 AWS 서비스의 사용 사례 선택 -> CodeDeploy 선택 하면 3가지가 나오는데 CodeDeploy 선택
. 역할세부정보 역할이름 : CodeDeployRole
역할을 미리 생성했으니 사전작업은 끝났다.
CodeDeploy를 하려면 먼저 application을 지정해야 한다. 그래서 순서상 세번째 메뉴에 있으나 "애플리케이션"을 먼저 만든다.
1. 애플리케이션 생성 CodeDeploy > 애플리케이션 > 애플리케이션 생성 (최초인 경우에는 시작하기 > 애필리케이션 생성)
애플리케이션 이름 : simple-pipeline 컴퓨팅 플랫폼 : EC2/온프레미스
2. 배포그룹 생성 해당 애플리케이션에 보면 배포그룹이 없다. "배포 그룹 생성" 버튼 클릭 . 배포그룹 이름 : simple-pipeline-deployment-group . 서비스 역할 : (돋보기를 클릭하여 CodeDeployRole 선택) 자동으로 arn:xxx/ 뒤에 선택한 역할이 들어온다.
. 배포유형 : 현재 위치 (In-Place) . 환경구성 : Amazon EC2 인스턴스 (바로 이전에 배포용 EC2를 만들었으므로) EC2에 TAG를 지정했으므로 KEY : Name, Value : EC2forCodePipeline 선택. * 이 설정은 EC2에 배포할 때는 필수임. . 배포설정 : 배포구성을 CodeDeployDefault.OneAtATime 으로 변경 . 로드밸런서 : 체크를 해제한다.
소스는 아직 안넣었지만. repository설정, deploy설정을 마쳤으므로 이제 pipeline으로 한번에 흐르게 하면 된다.
CodeCommit은 설정을 끝냈고 Deploy를 하는데 서버에 소스 그대로 배포할 것이므로 EC2를 하나 추가한다. 이 때, EC2에 codeDeploy Agent를 설치하도록 Set한다. EC2에서 CodeCommit에 접근해야하므로 관련 역할도 추가한다.
IAM > 역할 > 역할 만들기 . 신뢰할 수 있는 엔터티 유형 : AWS 서비스 선택 . 사용사례 : EC2 선택 하고 다음버튼 클릭 . 권한정책 : AmazonEC2RoleforAWSCodeDeploy 검색하여 check 한 뒤 다음. . 역할이름 : EC2InstanceRole
EC2 > 인스턴스 시작
1. AMI : Amazon Linux 2 AMI 를 선택 2. 인스턴스 유형 : t2.micro 3. 인스턴스 구성 . 퍼블릭 IP 자동할당 : 활성화 . IAM 역할선택 : EC2InstanceRole (위에서 생성한 Role ) . 고급 세부 정보 [Advanced Detail] - 사용자 데이터(User Data) : 텍스트로 선택 - TextArea에 아래내용 복사. agent를 다운받아 설치하는 것이므로 문구 그대로 입력하면 됨.(ubuntu에서도 같은지는 모르겠음)
4. 스토리지 추가 : "다음"클릭 5. 태그 추가 : 인스턴스에 Tag를 지정해야 목록에서 구별이 잘 됨. Key : Name Value : EC2forCodePipeline 6. 보안그룹 구성 . SSH 의 소스 항목을 "내 IP"로 변경 . 규칙추가 하여 유형을 "HTTP"로, 소스를 "내 IP"로 변경
7. 검토 및 시작. . 키페어를 선택할 수도 있으나, 이번에는 "키페어 없이 계속" 선택
CodePipeline으로 소스를 배포하는 예제. 과정이 간단한 것이 아니라 구조가 간단한 것임.
일반적으로는 commit - build - deploy의 구조를 가지는데 build를 빼고 commit - deploy 만 codepipeline으로 묶음.
사용하는 AWS제품은 CodeCommit, CodeDeploy, CodePipeline, S3 bucket, EC2
소스를 push하면 CodeDeploy Agent가 설치된 EC2에 배포한다. build라는 과정이 없기 때문에 간단과정이다.
이번 설명에서 AWS CodePipe라인은 다음 순서로 설정한다 1. CodeCommit 2. CodeDeploy 3. EC2 4. CodePipeline
CodeCommit Repository : simple-pipeline-repo Region : 서울 ap-northeast-2
먼저 CodeCommit에 Repository를 생성한다. . login
. codeCommit > repository > repository 생성 버튼 클릭
. repository 이름 넣고 "생성" 버튼 클릭. (simple-pipeline-repo)
*[참고]루트계정으로 작업하지 않는것을 권장하며 repository를 루트계정으로 생성하면 ssh로 작업을 할 수 없다 아래와 같이 https로만 연결 가능하므로 IAM 유저를 추가한 다음 작업하는 것을 추천.
. Repository가 생성되면 "연결 단계" 설정을 해야한다. HTTPS, SSH, HTTPS(GRC) 세 가지가 있으며 조금 복잡하지만 SSH 방식으로 진행한다. 아래 그림과 같이 연결단계는 MacOS, Windows, Linux 별 설정이 다르니 해당 OS에 맞는 설정을 한다. MacOS 를 클릭하면 설정방법이 나타난다.
. 1단계로 : 사전요구사항인데. 작업할 PC에 git이 깔려있어야 하고 IAM 유저가 CodeCommit를 쓰기위한 권한이 있어야하고 팀원초대하는데. 우선은 혼자 작업할 예정이므로 스킵. . 2단계 : SSH 퍼블릭 키 등록. Repository의 source를 git clone, push를 하기위해 키 등록을 해야한다. 적절한 권한이 없이 그냥 clone 하면 id/pass를 물어보고 권한이 없어서 안된다고 한다.
- 터미널에서 작업 #폴더 이동 cd ~/.ssh #Key 생성 ssh-keygen명령을 실행하고 keypair 파일명 입력 passphrase는 생략가능하므로 그냥 엔터만 쳐도 된다.(엔터 2번) ssh-keygen
Generating public/private rsa key pair. Enter file in which to save the key (/Users/user/.ssh/id_rsa): aws_seoul-codecommit-keypair Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in aws_seoul-codecommit-keypair Your public key has been saved in aws_seoul-codecommit-keypair.pub The key fingerprint is: xxxxx
** 다른 repository에서도 사용가능한지는 확인 안해봤으나 가능할 것으로 보고 이름을 좀 넓은 의미로 지음.
# ls 를 해 보면 1쌍의 key pair파일이 생성되었다. ( xxx.pub, xxx) ls
# xxx.pub파일의 내용 확인 cat ~/.ssh/aws-seoul-codecommit-keypair.pub 그러면 ssh-rsa ~~~ user-name@... 이 내용을 모두 복사한다. ex)
ssh-rsa AAAA - 중 간 생 략 -0K2xI71eoVRMe6fbp13WJl8mrtdYgxglfOCMnV9K+OFyeQj7/cuiw5uK0QadZywSBReMDhN4RkHKMBe6wW7KrLPRCoBOlFqnvXP4kFGOko4 - 중 간 생 략 -D8/6TjIgT2A+MgNuM= noman@MYPC.local
- AWS Console에서 작업 : SSH 퍼블릭 키 업로드 . IAM > 좌측메뉴 사용자 > 사용자 목록에서 사용자 선택 > 보안 자격 증명 Tab
. 아래로 scroll "AWS CodeCommit"에 대한 SSH 키 항목에 "SSH 퍼블릭 키 업로드" 버튼 클릭
. xxx.pub파일에 있는 내용을 붙여 넣는다.
. 생성하면 SSH KEY ID 가 생성된다. 사용하지 않을 때는 "비활성화"를 클릭하면 되고, 필요없을 때는 X 버튼을 누르면 된다.
. 3단계 : ssh 구성 편집 # config라는 파일을 생성하여 방금 생성한 ssh key id와 생성된 파일위치를 지정한다. vi config
Host git-codecommit.*.amazonaws.com User APKAQXV6Fxxxxx IdentityFile ~/.ssh/aws-seoul-codecommit-keypair
# config 파일에 권한 변경 : 작업 디렉토리는 반드시 ~/.ssh 여야한다. chmod 600 config
. 4단계 : Repository 복제 # 로컬로 clone # 작업할 directory로 이동 pwd cd ~/Documents/cicd # 접속Test : ssh key id 와 해당 region정보로 ssh APKAQXV6Fxxxxx@git-codecommit.ap-northeast-2.amazonaws.com 정상인 경우 아래와 같은 메세지가 나온다.
You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit. Interactive shells are not supported.Connection to git-codecommit.ap-northeast-2.amazonaws.com closed by remote host. Connection to git-codecommit.ap-northeast-2.amazonaws.com closed.
# Clone : AWS console에서 해당 repository에 주소가 있으므로 그대로 복사. git clone ssh://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/simple-pipeline-repo
# yes를 입력하면 현재 소스는 없이 repository만 만들었으므로 빈 것 같다는 말이 나옴.
# ls -al 해 보면 simple-pipeline-repo 폴더가 생겼고 .git만 하나 있음. cd simple-pipeline-repo ls -al