반응형
열심히 빌드오류를 수정해서 고쳤다. 근데 근데!! 이번에는 Deploy 배포단계에서 오류가 생겼다 당장 해결해보도록 하자
1. 배포 오류 파악하기
1-1 .오류 파악
- 아래와 같이 Deploy에서 빨갛게 실패라고 나왔다...
1-2. 아래의 오류가 발생했다.
Unable to access the artifact with Amazon S3 object key 'recipia-member-git-n/BuildArtif/IejGhqN' located in the Amazon S3 artifact bucket 'codepipeline-ap-northeast-2-555139989952'. The artifact object key is not found.
1-3. 오류 해석
- 이 오류는 AWS CodePipeline의 Deploy 단계에서 발생하며, 특정 Amazon S3 객체 키에 대한 액세스를 실패했음을 나타낸다. AWS CodePipeline은 빌드 결과물을 S3 버킷에 저장하고, 이후 단계에서 이 버킷에서 아티팩트를 검색한다. 그러나 지금 지정된 객체 키('recipia-member-git-n/BuildArtif/IejGhqN')에 해당하는 아티팩트를 찾을 수 없기 때문에 이 오류가 발생했다.
1-4. 해결 방안
- ECS를 사용할 때는 S3 버킷을 거치지 않고도 ECR에서 이미지를 직접 가져와서 실행할 수 있다. 이를 위해, 배포 단계의 설정을 변경하여 CodePipeline이 S3 아티팩트 대신 ECR 리포지토리에서 이미지를 가져오도록 할 수 있다.
- 방법
- 이미지 정의 파일(image-definitions.json)을 생성하여 ECS 서비스의 컨테이너에 대한 이미지 및 태그 정보를 지정한다.
- 이 파일을 GitHub 프로젝트 레포지토리의 루트 디렉토리에 저장하고 변경 사항을 커밋하여 푸시한다.
- AWS CodePipeline의 배포 단계를 수정하여 이미지 정의 파일의 위치를 지정한다.
- 이 설정을 사용하면 CodePipeline이 S3를 거치지 않고 직접 ECR에서 이미지를 가져와 ECS에 배포한다.
- 이 방법으로 중간 단계를 줄이고 배포 프로세스를 단순화할 수 있다.
2. 배포 단계에 “이미지 정의 파일” 추가하기 (오류 해결)
2-1. SpringBoot 프로젝트에 json파일 만들기
- 아래와 같이 root경로에 json파일을 만들어 줬다. 이후 Github repository에 push한다.
- AWS CodePipeline은 자동으로 이 파일을 찾지 않는다. 따라서 이미지 정의 파일의 정확한 위치를 지정해야 한다. 파일을 레포지토리의 루트 디렉토리에 두는 경우, 단순히 파일 이름만 지정할 수 있다 (예: image-definitions.json). 그러나 파일이 레포지토리의 서브 디렉토리에 있는 경우, 파일의 상대 경로를 포함해야 한다 (예: path/to/image-definitions.json).
[
{
"name": "{ECS의 task정의안에 설정한 container의 이름}",
"imageUri": "{나의 ECR repository URI}:latest"
}
]
- 내 기준으로는 "{이미지-정의}.json"을 아래와 같이 작성했다. (name에 들어갈 value값은 하단의 컨테이너 이름 확인하기를 보고적자)
2-2. 컨테이너 이름 확인하기
- container의 이름을 알아보기 위해 ECS의 클러스터 개요로 들어온 다음 하단의 목록에서 “태스크”를 선택한 후 리스트가 나오면 "태스크"를 클릭해서 들어간다. 하단의 "1fa2cd9f5d5e4e..." 이걸 클릭해서 태스크 상세정보로 들어간다.
- 들어와서 맨 하단을 보면 "컨테이너"가 있고 여기에 적혀있는 "컨테이너 이름"을 복사해서 json 파일의 name옆의 value로 적어준다.
2-3. CodePipeline에서 Deploy단계 수정하기
- Pipeline으로 들어온 다음 우측 상단에 있는 “편집” 버튼을 누른다.
- 아래와 같이 "편집" 페이지로 이동할 것이다. 여기서 스크롤을 내려서 Deploy 단계로 간다.
- 편집:Deploy 우측의 "스테이지 편집" 버튼을 누른다.
- 아래와 같이 창이 변할것이다.
- 여기서 하단의 Amazon ECS라고 써있는곳 오른쪽 아래에 있는 종이에 적는것 같이 생긴 버튼을 눌러야 한다. (X버튼 왼쪽에 있는것)
- 버튼을 누르면 아래와 같이 작업 편집창이 나온다. (사진은 미리 내용들을 작성해놓은 상태다.)
- 여기서는 입력 아티팩트를 "SourceArtifact"로 변경하고 클러스터, 서비스를 선택한 다음 제일 중요한 이미지 정의 파일을 적어준다.
- 여기서 이미지 정의 파일은 SpringBoot에 만들어준 파일 이름과 같아야 한다. (github)에 푸시한것과 같아야함
2-4. CodePipeline 실행하기
- 이제 배포단계도 수정을 완료했으니 다시 CodePipeline을 실행했다. 오랜 시간동안 배포를 진행했다.
2-5. 배포 오류 발생
- 계속 진행중이 떠서 답답해서 ECS 클러스터에 들어가서 확인해 봤다. 근데 아래와 같이 배포에서 실패한 작업이 3번이었다.
2-6. 배포 오류 파악을 위해 이벤트 메시지 확인
- 이 오류 메시지는 Amazon ECS가 recipia-member-service 서비스의 요구 사항을 충족하는 컨테이너 인스턴스를 찾지 못했음을 나타낸다. 특히, 가장 근접한 매치인 컨테이너 인스턴스 15ce592c569442ec8c9437a689ed8191는 필요한 메모리가 부족하여 태스크를 배치할 수 없다.
즉, 메모리가 부족하다… 프리티어인 t2.micro를 사용중인데 이것때문인것 같다.
다행히 이번 포스트에서 Deploy에서 만난 S3관련 오류는 해결되었다.
이 오류는 CodeBuild가 배포를 할때 S3에서 이미지를 가져와서 배포를 시도했기 때문이었는데 내가 배포시에 "이미지 정의" 파일을 통해 지정한 ECR에서 이미지를 불러서 배포하도록 수정했다.
덕분에 S3 관련 오류는 해결했지만 이번에는 ECS를 실행하는데 메모리 관련 오류가 나버렸다.
너무 적은 스펙의 EC2를 사용해서 그런걸까?
다음 시간에는 조금 사양을 올려서 진행해보도록 하겠다.
2023.10.30 - [AWS] - AWS CI/CD: CodePipeline 배포 최종 점검 (8편)
2023.10.30 - [AWS] - AWS CI/CD: CodePipeline 세 번째 빌드 오류 해결 (6편)
반응형
'AWS > CodePipeline, CICD' 카테고리의 다른 글
AWS CI/CD: CodePipeline 배포 최종 점검 (8편) (0) | 2023.10.30 |
---|---|
AWS CI/CD: CodePipeline 세 번째 빌드 오류 해결 (6편) (1) | 2023.10.30 |
AWS CI/CD: CodePipeline 두 번째 빌드 오류 해결 (5편) (1) | 2023.10.30 |
AWS CI/CD: CodePipeline 첫 번째 빌드 오류 해결 (4편) (2) | 2023.10.29 |
AWS CI/CD: CodePipeline 배포 및 검토 (3편) (0) | 2023.10.29 |