CodeBuild + ECR 생성
- 아키텍처 개요 (링크)
- CodeBuild + ECR 생성 (현재 글)
- VPC + 서브넷 생성 (링크)
- 인터넷 게이트웨이 + NAT 게이트웨이 생성 및 라우트 테이블 설정 (링크)
- 로드밸런서(ALB) + 보안 그룹(Security Group) + 대상 그룹(Target Group) 생성 (링크)
- ECS 클러스터 생성 + 태스크 정의 + 서비스 생성 (링크)
- S3 버킷 생성 + CodePipeline 설정 및 최종 배포 (링크)
ECR 생성
ECR은 위와 같이 이름만 이름만 지정해주고 생성하였다.
생성 후에는 해당 리포지토리를 선택하고 푸시 명령 보기를 통해 CodeBuild에서 사용할 명령어들을 아래와 같이 확인할 수 있다.
CodeBuild 생성
프로젝트 이름은 juice-shop-build로 작성하고 추가 구성은 빌드 배지만 활성화 해주었다. 빌드 배지 활성화를 하면 실시간으로 빌드 상태를 확인할 수 있기 때문에 활성화 하였다.
소스는 GitHub와 OAuth 인증을 통해 연결하였고, juice-shop 코드가 올라간 리포지토리를 선택해주었다.
juice-shop는 OAWSP에서 제공하는 웹 애플리케이션 보안 실습 환경이다. 추후 보안 피처까지 생각하고 있었기에 해당 오픈소스를 선택하였다.
이는 GitHub에 코드가 push 될 때마다 빌드가 진행되는 설정인데, 추후 CodePipeline에서 설정하면 중복되는 설정이 되기때문에 CodeBuild에서는 선택하지 않았다.
환경의 경우 관리형 이미지를 선택하고 운영체제는 Ubuntu, 런타임은 Standard, 이미지는 aws/codebuild/standard:5.0으로 설정해 주었다. 이미지 버전은 항상 최신 이미지를 사용하게 해주었으며 이 부분의 설정은 어떤 소스를 빌드하는지에 따라서 변동되는 것이기에 각자 맞는 설정을 하면 될 것이다.
Buildspec이라는 부분이 있는데, 이 부분이 CodeBuild의 핵심 내용이라고 생각한다. 코드를 불러와 빌드를 시작하면 해당 파일에 작성된 내용대로 빌드가 진행된다. 이는 직접 빌드 명령을 삽입할 수도 있고, buildspec.yml 이라는 파일명으로 프로젝트 코드의 루트 디렉토리에 배치해두면 알아서 해당 파일을 찾아 빌드를 진행할 수도 있다. 우리는 후자의 방법을 선택해주었다.
이 외의 설정은 모두 기본 설정을 해주었으며, 서비스 역할 권한은 CodeBuild 프로젝트를 생성하면 기본적으로 codebuild-(CodeBuild name)-service-role 과 같은 형식의 서비스 역할이 자동 생성되는데, 이를 사용해주었다.
buildspec 파일 작성 (ECR에 docker 이미지 저장 및 S3 Build Artifact 파일 저장)
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <YOUR_ECR_URL>
- echo Successfully logged in to Amazon ECR.
build:
commands:
- echo Building the Docker image...
- docker build --no-cache -t juice-shop-scp .
- echo Docker image built successfully.
- echo Tagging the Docker image...
- docker tag juice-shop-scp:latest <YOUR_ECR_URL>/juice-shop-scp:latest
- echo Docker image tagged successfully.
post_build:
commands:
- echo Pushing the Docker image to Amazon ECR...
- docker push <YOUR_ECR_URL>/juice-shop-scp:latest
- echo Docker image pushed successfully.
- echo Creating imagedefinitions.json file for ECS deployment...
- echo '[{"name":"juice-shop-scp","imageUri":"<YOUR_ECR_URL>/juice-shop-scp:latest"}]' > imagedefinitions.json
- echo imagedefinitions.json created successfully.
artifacts:
files:
- imagedefinitions.json
buildspec 파일에는 다음과 같은 내용이 포함되어 있다.
- version: 0.2
- 필수 매핑인 buildspec 버전을 나타내는 version을 권장되는 0.2로 설정해줌
- phases:
- 필수 시퀀스로 빌드의 각 단계 동안 CodeBuild가 실행하는 명령을 작성함 (pre_build, build, post_build)
- pre_build:
- 선택적 시퀀스로 빌드 전에 CodeBuild가 실행하는 명령을 나타냄(있는 경우)
- build:
- 선택적 시퀀스로 빌드 중에 CodeBuild가 실행하는 명령을 나타냅니다(있는 경우)
- post_build:
- 선택적 시퀀스로 빌드 후에 CodeBuild가 실행하는 명령을 나타냅니다(있는 경우)
- artifacts:
- 선택적 시퀀스로 CodeBuild가 빌드 출력을 찾을 수 있는 위치 및 CodeBuild가 S3 출력 버킷에 업로드하기 위해 빌드 출력을 준비하는 방식에 대한 정보를 나타냄
- files:
- 필수 시퀀스로 빌드 환경의 빌드 출력 결과물을 포함하는 위치를 나타냄. 스칼라 시퀀스를 포함하며, 각 스칼라는 CodeBuild가 빌드 출력 결과물을 찾을 수 있는 개별 위치를 원래 빌드 위치 또는 기본 디렉터리(설정한 경우)를 기준으로 나타냄
위와 같은 내용으로 각각의 명령어는 푸시 명령 보기에서 확인한 내용과 CodePipeline으로 자동화하였을 때 ECS에서 참조할 imagedefinitions.json 파일에 포함될 내용이다. (위의 작성된 yml 파일은 노출되면 안되는 부분은 대체어로 대체된 yml 파일 예시이다.)
'Project > Cloud' 카테고리의 다른 글
파이프라인 Security에 집중한 DevOps 구현 - 인터넷 게이트웨이 + NAT 게이트웨이 생성 및 라우트 테이블 설정 (4) (0) | 2025.01.27 |
---|---|
파이프라인 Security에 집중한 DevOps 구현 - VPC + 서브넷 생성 (3) (1) | 2025.01.27 |
파이프라인 Security에 집중한 DevOps 구현 - 아키텍처 개요 (1) (1) | 2025.01.26 |
무중단 배포란? (0) | 2025.01.12 |
DevOps란? (0) | 2024.12.20 |