티스토리 뷰

728x90
반응형

https://trend21c.tistory.com/2205

 

천리 배포길도 한걸음 codebuild 부터

aws에서는 내가 만든 어플리케이션의 build부터 배포까지 자동화가 가능합니다 (물론 jenkins를 비롯해서 다른 좋은 도구들도 있습니다) 배포할 소스는 s3에 업로드된 zip파일, docker, ecr의 이미지, bitb

trend21c.tistory.com

 

이전 포스팅에서 codebuild 세팅을 마쳤습니다

 

이제 본격적으로 codepipeline을 연결하여 build부터 배포까지 진행해봅시다

 

배포 대상은 docker 플랫폼을 기반으로한 elastic beanstalk 입니다

(아래부터 나오는 예제는 사실상 nodejs 케이스인데 이 경우는 그냥 손쉽게 nodejs 플랫폼의 elastic beanstalk을 선택했다면 굳이 ecr 관련한 설정들을 다 건너뛸수 있을테고, 그게 아니더라도 컨테이너를 1개밖에 띄우지 않는 예제라 dockerfile 기반으로 docker기반의 eb에 배포를 할수 있는데, ecr을 활용하는 방법을 설명하기 위해 굳이 ecs를 통해 배포하는 상황을 만들었습니다)

 

 

파이프라인을 생성하기 전에 일단 우리의 프로젝트 루트 경로에 총 3개의 파일이 필요합니다

 

당연히 첫번째로는 프로젝트 루트경로에 Dockerfile이 있어야 합니다

 

여기에 여러분의 프로젝트가 구성될 도커 구성을 만들어주시면 됩니다

 

 

 

위의 샘플은 nodejs16 기반의 앱을 pm2 프로세스 매니저를 사용해서 실행하는 간단한 Dockerfile입니다

(샘플 nodejs 프로젝트는 직접 만드시면 되고 굳이 pm2 프로세스 매니저를 사용하지 않고 npm start로 실행되는 dockerfile을 만들어도 됩니다)

 

 

 

그리고 이 buildspec.yml 파일은 codebuild가 실행될때 참조되는 파일입니다

pre_build -> build -> post_build 이러한 순서로 각 단계에 어떠한 명령어를 실행하면 되는지 포함되어있습니다



파일의 내용을 설명해드리자면


1. 빌드 전단계(pre_build)에서 aws ecr에 로그인을 합니다(ecr 권한 필요)

2. 빌드 단계(build)에서 Dockerfile을 통해 도커 이미지를 만들고 태깅 합니다

3. 빌드를 완료한 후(post_build)에 만들어진 도커이미지를 ecr에 푸시합니다



그리고 마지막에서 artifacts라는것이 추가로 언급되어있는것이 보이시나요

 

바로 buildspec.yml에서 artifacts로 표시된 파일이 Dockerrun.aws.json 파일입니다

 

이 파일이 빌드 완료후에 어떻게 대상으로 배포를 하는지에 대한 정보가 담겨있는 파일이 됩니다

 

아티팩트는 소스코드 전체의 경로가 될수도 있고 docker-compose 파일이 될수도 있고 Dockerrun.aws.json 파일이 될수도 있습니다

 

여기서는 Dockerrun.aws.json 파일을 지정해보도록 할께요 나머지 방법은 차후에 검색해보셔서 더 알아가기로 해요

 

Dockerrun.aws.json 파일도 안의 내용은 심플합니다

 

배포할 이미지의 이름과 컨테이너의 포트번호 입니다

 

저는 이번 포스팅에서 elastic beanstalk에 배포를 할것인데 바로 얘한테 어떤 이미지를 사용하여 컨테이너화할지를 알려주는것입니다

 

그리고 사용할 컨테이너의 포트도 지정하고 말이죠

 

(Dockerfile을 사용할 경우, 첫 번째 ContainerPort 값은 Dockerfile의 EXPOSE 목록 내 첫 번째 항목과 일치해야 합니다.)

 

 

 

 

자 이제 본격적으로 codepipeline 메뉴를 클릭하여 파이프라인생성을 해봅시다

 

적당한 파이프라인이름을 정해줍시다 자동으로 역할이름이 지정됩니다

 

그리고 "새 서비스 역할"을 선택해주세요

 

그리고 "AWS CodePipeline이 새 파이프라인에 사용할 서비스 역할을 생성하도록 허용"을 체크하여

 

새 서비스 역할이 생성되도록 해주세요(당연히 기존에 만들어준 역할이 있다면 지정해주셔도 됩니다)

 

 

그리고 다음단계에서 소스 공급자를 선택합니다

 

말 그대로 소스코드가 어디서부터 오는지를 지정해주는것 입니다

 

codebuild에서 사용했던 입력 소스를 그대로 연결하면 됩니다

 

github으로 지정하고 레파지토리와 브랜치 명을 지정하고,

 

소스 변경 마다 빌드&배포가 되도록 "소스 코드 변경 시 파이프라인 시작"을 체크해주세요

 

 

 

그리고 빌드 공급자를 선택하게 되는데요

 

우리가 codebuild에서 생성했던 빌드 프로젝트를 선택해주시면 됩니다

 

빌드공급자를 AWS CodeBuild로 선택하면

 

프로젝트 이름에서 자동완성됩니다

 

 

 

그리고 마지막인 배포스테이지를 설정하게 됩니다

 

elastic beanstalk에 배포를 하려고 하니 배포공급자로 선택하고

 

이미 생성한 elastic beanstalk이 있다면

 

어플리케이션 이름과 환경이름이 자동완성됩니다

 

자 이제 모든 설정이 완료되었습니다

 

파이프라인을 생성하게 되면 직후에 바로 파이프라인이 첫번째로 동작하게 됩니다

 

 

 

An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::131654923150:assumed-role/codebuild-eb-docker-sample-service-role/AWSCodeBuild-8ff92925-0e11-4f18-9962-e32364a2118f is not authorized to perform: ecr:GetAuthorizationToken on resource: * because no identity-based policy allows the ecr:GetAuthorizationToken action
Error: Cannot perform an interactive login from a non TTY device

 

어라 뭔가 잘 설정한것 같았는데 이런 에러가 발생합니다

 

당황하지 마세요 에러 메시지를 보니 ecr 로그인에 실패를 했다는건데 ecr에 접근할수 있는 권한이 없어서 그렇습니다

 

buildspec.yml 파일에 pre_build단계에 ecr 명령어가 있는데요 여기서 문제가 발생한것입니다

 

 

이 문제를 해결하기 위해 codebuild에서 만든 프로젝트를 클릭하여 "편집 -> 소스" 메뉴를 클릭합니다

 

바로 여기에 적힌 서비스 역할이 codebuild에서 사용하고 있는 서비스 역할인데요

 

바로 이 역할에 ecr에 접근할수 있는 권한을 추가로 연결해주면 됩니다

 

iam의 역할 메뉴에 들어가서 동일한 이름으로 찾아봅니다

 

 

 

역할 이름을 iam에서 찾아

 

AmazonEC2ContainerRegistryPowerUser

 

정책을 추가로 연결해주시면 됩니다

 

 

그리고 재시도 버튼을 눌러주세요

 

 

빌드성공이 나옵니다

 

 

 

어라 근데 deploy 단계에서 실패하는군요 마찬가지로 권한 문제입니다

 

에러 상세 메시지를 보니 다음과 같습니다

 

The ECR service failed to authenticate your private repository. The deployment failed.

 

ecr권한이 없습니다

 

 

eb에서 사용되는 인스턴스들이 ecr의 이미지를 pull해야 하는데 이 권한이 필요합니다

 

eb의 구성 메뉴에서 보안 항목을 살펴보면 IAM 인스턴스 프로파일이 있습니다

 

여기에 있는 역할이 인스턴스를 담당하는 역할인데요

 

 

이 역할을 iam에서 찾아서 AmazonEC2ContainerRegistryReadOnly 정책을 추가로 연결해주세요

 

 

다시 재시도를 해볼까요

 

 

 

와우 성공했습니다

 

eb 메뉴에서도 정상적으로 실행된 모습이 잘 보여지고 있습니다

 

꽤나 복잡해보였지만 aws의 모든 기능들은 각각 최소한의 권한만을 최초에 세팅하고 있기 때문에

 

aws의 다른 서비스랑 엮기 위해서는 다른 서비스의 리소스에 접근할수 있는 권한이 필요하고,

 

그래서 지정된 역할에 추가적인 정책을 연결하는 과정이 필요한것이었어요

 

 

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함