📚 열심히 공부하고 기록해서 남주자!

Cloud/GCP(Google Cloud Platform)

[GCP] Cloud Build - invalid argument에러 & 에러코드 status:125

jinsang-2 2025. 9. 1. 18:55

문제1 : 빌드 즉시 실패 (invalid argument 에러)

발생 현상

  • Cloud Build 트리거가 실행되었으나, 빌드 로그가 생성되기도 전에 즉시 실패
  • invalid argument 에러가 표시

 

발생 원인

가설

Cloud Build는 기본적으로 빌드 로그를 Cloud Storage 버킷에 저장한다. 이 버킷이 없거나, Cloud Build 서비스 계정이 해당 버킷에 로그를 쓸 권한이 없어 빌드가 실패하는 것이다.

시도한 해결책

cloudbuild.yaml 파일에 options을 추가하여 Cloud Build의 기본 동작을 변경함

# cloudbuild.yaml 아래 내용 추가
...
options:
  logging: CLOUD_LOGGING_ONLY

“이 설정을 통해 Cloud Storage 버킷에 로그를 저장하는 동작을 비활성화하고, 실시간 스트리밍 로그 서비스인 Cloud Logging에만 기록하도록 지시”

근본적으로 해결하기 위해서는 Cloud Storage 버킷을 유/무 확인 및 권한 확인 및 설정이 필요하다.


문제 2 : 배포 단계에서의 실패 (status: 125)

발생 현상

빌드의 마지막 배포 단계(gcloud compute ssh 실행)에서 step exited with non-zero status: 125 에러가 발생하며 실패

발생 원인

원인 분석

  • 에러 코드 분석 : status : 125 는 일반적으로 Docker 명령어 실행 실패를 의미한다.
  • 에러 로그 분석 : artifact registry에서 다운로드하는데 인증 권한이 없다!
  • denied: Unauthenticated request. Unauthenticated requests do not have permission "artifactregistry.repositories.downloadArtifacts"

발생원인 코드 (cloudbuild.yaml)

# 3. 대상 VM에 접속하여 배포
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: 'gcloud'
...
			docker pull [YOUR_ARTIFACT_REGISTRY_URL]/$PROJECT_ID/[YOUR_REPO_NAME]/[YOUR_IMAGE_NAME]:$COMMIT_SHA &&
          		docker stop [YOUR_CONTAINER_NAME] || true &&
...

 

가설 1 : VM의 서비스 계정에 Artifact Registry에서 이미지를 다운로드할 수 있는 IAM 역할(Artifact Registry Reader)이 없다.

  • 시도 : VM의 서비스 계정에 Artifact Registry Reader 역할을 부여함.
  • 결과 : 실패. 동일 에러 발생.

가설 2: VM의 액세스 범위(Access Scopes)가 제한되어 있어 IAM 역할이 있어도 API 호출이 차단된다.

  • 시도 : VM의 액세스 범위를 "모든 Cloud API에 대한 전체 액세스 허용"으로 변경함.
  • 결과 : 실패. 동일 에러 발생.

최종 가설 : IAM 역할과 엑세스 범위는 모두 정상이지만, VM 내부의 Docker 프로그램이 GCP 인증 시스템(서비스 계정)을 사용하도록 구성되지 않았다.

Docker는 독립적인 프로그램이므로, GCP 환경이라고 해서 당연히 자동으로 서비스 계정의 인증 정보를 사용할 수가 없다. Docker가 인증 정보 없이 익명으로 Artifact Registry에 접속을 시도해 "Unauthenticated" (미인증) 에러가 발생하는 것이다.

  1. VM에서 docker pull us-central1-docker.pkg.dev/... 실행함
  2. Docker → config.json 확인 → "여기 인증 정보가 없네?"
  3. Docker → 아무것도 없이 Artifact Registry에 요청 보냄 (익명 사용자)
  4. Artifact Registry → "인증 안 됐어" → 에러 발생

해결책

VM 내부에서 Docker가 GCP 인증을 사용하도록 강제하는 명령어를 SSH 실행 스크립트 가장 앞에 추가한다.

  • gcloud auth configure-docker asia-northeast3-docker.pkg.dev && 추가
# 3. 대상 VM에 접속하여 배포
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: 'gcloud'
    args:
      - 'compute'
      - 'ssh'
...
          gcloud auth configure-docker [YOUR_ARTIFACT_REGISTRY_URL] &&
          docker pull [YOUR_ARTIFACT_REGISTRY_URL]/$PROJECT_ID/[YOUR_REPO_NAME]/[YOUR_IMAGE_NAME]:$COMMIT_SHA &&
          docker stop [YOUR_CONTAINER_NAME] || true &&
          docker rm [YOUR_CONTAINER_NAME] || true &&
          docker run -d -p 80:8000 --name [YOUR_CONTAINER_NAME] [YOUR_ARTIFACT_REGISTRY_URL]/$PROJECT_ID/[YOUR_REPO_NAME]/[YOUR_IMAGE_NAME]:$COMMIT_SHA

gcloud auth configure-docker 명령어는 Docker의 설정 파일(config.json)을 수정하여, 특정 레지스트리 주소(us-central1-docker.pkg.dev)에 접근할 때 gcloud를 인증 도우미(credential helper)로 사용하도록 등록한다.

  • gcloud auth configure-docker asia-northeast3-docker.pkg.dev && 실행시 config.json의 내용은 아래와 같다.
{
  "credHelpers": {
    "us-central1-docker.pkg.dev": "gcloud"
  }
}

이러면 gcloud 토큰 정보를 통해 docker 명령어에 성공하게 된다.

'Cloud > GCP(Google Cloud Platform)' 카테고리의 다른 글

[GCP] Cloud Build - CI/CD  (0) 2025.09.01