CodePipeline 빌드 오류 해결 (S3 접근 권한)
지난번 포스팅에서 CodePipeline 파이프라인을 생성하고 동작시켰는데 계속 빌드 단계에서 오류가 났다. 해당 오류들을 하나하나씩 해결해 가는 과정을 작성해 보도록 하겠다.
1. CodePipeline 빌드 오류 발생
1-1. 빌드에서 오류가 발생해서 확인하기 위해 "CodeBuild에서 보기" 링크를 클릭한다.
1-2. 빌드 상태의 하단에 “단계 세부 정보” 목록을 클릭해서 확인했다.
1-3. DOWNLOAD_SOURCE단계에서 아래와 같은 오류가 발생했다.
CLIENT_ERROR: RequestError: send request failed caused by: Get "<https://codepipeline-ap-northeast-2-@#@#@#.s3.ap-northeast-2.amazonaws.com/Recipia-member-git/SourceArti/87tmyth>": dial tcp #@$@#$:443: i/o timeout for primary source and source version arn:aws:s3:::codepipeline-ap-northeast-2-@#$/Recipia-member-git/SourceArti/87tmyth
- i/o timeout와 같은 에러는 일반적으로 네트워크 문제를 나타낸다.
- 일단 S3 접근: dial tcp 3.5.143.181:443: i/o timeout 이 부분을 보면 S3에 연결할 수 없음을 나타내므로, S3 버킷에 접근할 수 있는지도 확인해 봤다.
※ 여기서 혹시 S3 접근이 아니라 AWS가 Git에 접속하지 못해서 생기는 타임아웃인가 검색해 봤다.
> ChatGPT 응답
에러 메시지에 따르면 문제는 S3 버킷에 접근하는 단계에서 발생한 것으로 보입니다. Git 저장소에 접근하는 문제가 아니라, 이미 Git 저장소에서 소스코드를 가져와 S3에 저장하는 부분까지는 성공한 후, 이 S3 버킷에서 소스코드를 다운로드할 때 문제가 발생한 것으로 해석됩니다. 일반적으로 CodePipeline에서 DOWNLOAD_SOURCE 단계는 저장소에서 코드를 가져와 S3에 임시로 저장한 뒤, 이후 단계에서 이를 사용하기 때문에, Git 저장소 접근에 문제가 있다면 그 이전 단계에서 이미 에러가 발생했을 것입니다. 따라서 이 문제는 AWS S3와의 통신 문제로 보이며, Git 저장소와는 관련이 없어 보입니다.
라는 답변을 들었다.
2. 빌드 오류 해결 - (S3 접근 허용하기)
2-1. S3 접근 권한이 있는지 체크하기
- AWS S3 서비스 메뉴에 접속해서 내가 생성한 pipeline에서 사용하는 버킷(codepipeline-ap-northeast-2-####)의 액세스가 '버킷 및 객체가 퍼블릭이 아님'이라고 나와있다.
- 일단 퍼블릭으로 접속이 안되기 때문에 S3 권한문제인 것 같다는 생각이 든다.
2-2. S3 버킷에서 파일의 접근 권한을 확인하는 방법
- S3 서비스로 가서 해당 버킷에 파일을 업로드하거나 다운로드해 보면 된다.
- 이렇게 하면 버킷에 대한 기본적인 접근 가능성을 확인할 수 있다.
2-2-1. S3 버킷에 들어가서 업로드 버튼을 클릭해 보자.
2-2-2. 업로드 화면은 아래와 같다.
- 여기서 [파일 추가]를 클릭해서 파일을 추가한다.
2-2-3. [파일 추가]를 클릭하고 파일을 선택하면 아래와 같이 화면이 바뀐다.
- 여기서 하단의 [업로드] 버튼을 누르면 아래처럼 업로드에 실패한다.
2-2-4. 하단의 “파일 및 폴더” 리스트에 있는 오류사항을 보면 “오류 : 액세스가 거부됨”이라고 나와있다.
- S3 버킷에 파일 업로드가 안 되는 경우, 주로 IAM (Identity and Access Management) 정책 또는 S3 버킷 정책, 또는 둘 다에 문제가 있을 가능성이 높다고 한다.
2-1. 버킷을 퍼블릭으로 열어주는 작업을 실시한다.
- 사실 버킷 자체를 퍼블릭으로 열어주는 작업은 권장하지 않는다.
- 버킷을 퍼블릭으로 설정하면, 인터넷상의 모든 사용자가 그 버킷에 접근할 수 있게 되므로, 데이터 유출 위험이 있다.
- 그러나 일단 스터디 개념으로 버킷을 퍼블릭으로 열어줘 보겠다.
1. 상단 메뉴에서 권한 탭을 클릭한다.
- 하단을 보면 "퍼블릭 액세스 차단(버킷 설정)" 메뉴가 존재한다. 여기서 [편집]을 클릭한다.
2-5. 아래의 화면으로 이동이 되는데 여기서 액세스 차단 설정을 할 수가 있다.
2. 모든 체크박스를 해제하고 [변경 사항 저장]을 누른다.
3. 아래와 같이 편집이 완료되었다고 나온다.
2-2. 사실 버킷을 퍼블릭으로 열어줬다면 ACL까지 활성화하지 않아도 된다. 하지만 ACL도 활성화를 해보자.
- 버킷에서 권한으로 들어간다.
- 그럼 하단에 아래와 같이 객체 소유권이 있을 것이다.
1. 객체 소유권에서 처음에는 ACL 비활성화가 되어있는데 ACL활성화를 해주자.
- "ACL 활성화됨"을 클릭하고 두 번째 경고창에서 'ACL이 복원된다는 것을 확인합니다.' 항목을 체크한다.
- 그리고 [변경 사항 저장]을 클릭한다.
2-3. 다음으로 버킷 정책을 설정한다. (json으로 S3에 대한 IAM 정책을 추가하는 내용이다.)
- (이 방법 말고도 IAM 정책에서 GUI 환경에서 선택할 수도 있다.)
1. 우측의 [정책 생성기]를 클릭한다.
1-1. 정책을 생성해 보자
- Select Type of Policy는 S3 Bucket Policy를 선택한다.
- Principal에는 *를 적어준다.
- Actions에는 GetObject, PutObject 총 두개를 선택해 준다.
- ARN에는 이전 버킷 정책에 있던 ARN을 복사해서 넣는다.
1-2. [Add Statement] 버튼을 누르면 아래와 같이 생성이 완료된다. 여기서 “Generate Policy”를 클릭한다.
1-3. 아래와 같은 JSON값을 보여주는 팝업창이 나온다.
- 이 모든 JSON 값을 복사한다.
{
"Id": "Policy1698488259951",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1698488157332",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::codepipeline-ap-northeast-2-555139989952",
"Principal": "*"
}
]
}
2. 정책에 기존에 있던 것을 삭제하고 붙여 넣기를 한다. 그리고 [변경 사항 저장]을 클릭한다.
3. “변경 사항 저장”을 눌렀는데 아래와 같은 오류가 발생했다.
4. Resource 부분 뒤에 "/*" 부분을 추가해 줘야 접근이 가능했다.
5. 다시 시도하니 아래와 같이 나왔다.
6. 이제 페이지를 새로고침 하면 아래와 같이 나온다.
- 액세스가 퍼블릭으로 전환되었다.
- 버킷 목록에 가도 다음과 같이 나온다.
7. ACL 목록에서 [편집]을 클릭한다.
- 모든 권한을 체크하고 [변경 사항 저장]을 클릭한다.
3. 오류 수정 후 빌드 - Pipeline 실행하기 (S3 해결완료 - DOWNLOAD_SOURCE 에러 해결 완료, PRE_BUILD에러 발생)
1. 다시 CodePipeline으로 돌아와서 우측 상단의 “변경 사항 릴리스” 버튼을 클릭한다.
2. 빌드하는 곳으로 이동해서 하단의 "세부 정보"를 클릭한다.
3. 빌드의 “세부 정보”를 확인했더니 이번에는 기존에 발생했던 DOWNLOAD_SOURCE관련 에러는 사라졌다.
4. 대신 PRE_BUILD 단계에서 새로운 에러가 발생했다.
COMMAND_EXECUTION_ERROR: Error while executing command: aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin @#$.ap-northeast-2.amazonaws.com/recipia-repository. Reason: exit status 1
5. 조금 더 정확히 보기 위해 빌드 로그를 확인했더니 아래와 같았다. 이건 IAM 문제인 것 같다.
[Container] 2023/10/28 11:15:48.610669 Running command echo Logging in to Amazon ECR...
Logging in to Amazon ECR...
[Container] 2023/10/28 11:15:48.615475 Running command aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin @#$@#$.ap-northeast-2.amazonaws.com/recipia-repository
An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::@#$@#$:assumed-role/codebuild-recipia-member-build-nvpc-service-role/AWSCodeBuild-a96f8b53-10e3-4bdb-a7f9-109378a51781 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
[Container] 2023/10/28 11:16:03.103564 Command did not exit successfully aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin #$%#$%.ap-northeast-2.amazonaws.com/recipia-repository exit status 1
[Container] 2023/10/28 11:16:03.107195 Phase complete: PRE_BUILD State: FAILED
[Container] 2023/10/28 11:16:03.107211 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin #$%#$%.ap-northeast-2.amazonaws.com/recipia-repository. Reason: exit status 1
6. CodeBuild에 연결된 정책이 뭔지 확인했다.
- codebuild-recipia-member-build-nvpc-service-role 이거였다.
4. 마무리
이제 PRE_BUILD에서 생긴 에러는 다음 포스팅에서 해결하겠다.
DOWNLOAD_SOURCE에서 발생한 에러를 고치면서 또 다른 에러들이 너무 많이 발생했다.
그리고 여러 가지 방법으로 해결하다 보니 정확히 어떤 걸 고쳤을 때 해결된 건지 약간 애매한 부분도 있었다.
이제 와서 다시 생각해 보면 S3 버킷을 퍼블릭으로 열어주거나, ACL을 활성화한 것보다 마지막에 버킷 정책을 바꿔줌으로써 해결이 된 것 같다.
애당초에 S3를 퍼블릭으로 열어줘도 ACL을 활성화했으면 ACL에 우선순위가 더 높아서 굳이 퍼블릭으로 열어주지 않아도 되고 그냥 ACL만 활성화해도 됐던 부분이 이제야 보였다. 나중에 다시 프라이빗으로 수정해 줘야겠다. 그리고 ACL도 비활성화해 줘야겠다,,,
[AWS] CodePipeline을 이용한 CI/CD (1) - 파이프 라인 생성
'AWS' 카테고리의 다른 글
[AWS] CodePipeline을 이용한 CI/CD (4) - 배포 오류 해결 (S3 거치지 않고 ECR에서 이미지 가져오기) (2) | 2023.11.01 |
---|---|
[AWS] CodePipeline을 이용한 CI/CD (3) - 빌드 오류 해결 (IAM 역할에 권한 정책 연결) (0) | 2023.11.01 |
[AWS] CodePipeline을 이용한 CI/CD (1) - 파이프 라인 생성 (0) | 2023.10.31 |
[AWS] ECS 생성5 - ECS 생성 및 설정 (w ALB) (0) | 2023.10.31 |
[AWS] ECS 생성4 - ECS 생성 및 설정 (w/o ALB) (0) | 2023.10.30 |