이 페이지에서는 App Engine의 일반적인 앱 초기화 및 서빙 오류와 이를 해결하는 방법을 설명합니다.
기본 서비스 계정으로 앱을 만들 때의 권한 오류
App Engine API를 처음 사용 설정한 후 앱을 만들면 다음과 같은 오류가 표시되면서 실패할 수 있습니다.
gcloud CLI
An internal error occurred while calling service consumer manager for service account.
Creating App Engine application in projectPROJECT and REGION....failed. DEBUG: (gcloud.app.create) Error Response: [13] an internal error has occurred
로그 요청
Service account creation is not allowed on this project.
콘솔
Error while initialising App Engine.
이 오류는 앱을 만들 때 조직 정책 제약조건 constraints/iam.disableServiceAccountCreation
적용으로 인해 발생할 수 있습니다. 이 정책은 App Engine 기본 서비스 계정 PROJECT_ID@appspot.gserviceaccount.com
프로비저닝을 방지합니다.
이 문제를 해결하려면 App Engine 기본 서비스 계정을 만들고 배포할 수 있도록 조직 정책 제약조건 constraints/iam.disableServiceAccountCreation
을 일시적으로 삭제해야 합니다. 기본 서비스 계정은 앱을 만들 때 필요하며 건너뛸 수 없습니다. 버전별 서비스 계정을 사용할 때도 마찬가지입니다.
App Engine 기본 서비스 계정을 삭제하거나 배포가 성공한 후에 만든 서비스 계정으로 바꿀 수 있습니다.
만든 서비스 계정을 사용하는 경우 역할 권장사항 개요를 검토하여 서비스 에이전트에 만드는 서비스 계정에 대한 토큰 생성자 역할 제공과 같이 권한을 제한하는 방법을 알아봅니다.
애플리케이션에서 최신 코드 변경사항을 제공하지 않음
배포 후에 애플리케이션에서 최신 코드 변경사항을 제공하지 않는 경우에는 컨테이너의 루트 파일 시스템을 사용하여 콘텐츠를 확인하면 됩니다. 다음 문제 해결 단계에서는 컨테이너 이미지를 가져오고 추가 분석을 위해 루트 파일 시스템을 내보내는 방법을 보여줍니다.
Cloud Logging을 사용하여
GAE_FULL_APP_CONTAINER
필터와 함께 컨테이너 이미지 URL을 가져옵니다. 필터를 적용하면 Cloud Logging에 정규화된 도메인 이름(FQDN)과 함께 컨테이너 이미지 URL이 표시됩니다. 예를 들면GAE_FULL_APP_CONTAINER: FQDN/PROJECT_ID/appengine/SERVICE_NAME.VERSION_ID@sha256:SHA256_DIGEST
입니다.다음 명령어를 실행하여 컨테이너 이미지 URL을 내보냅니다.
export IMAGE_URL='FQDN/PROJECT_ID/appengine/SERVICE_NAME.VERSION_ID@sha256:SHA256_DIGEST'
다음과 같이 바꿉니다.
- FQDN: 컨테이너 이미지 URL의 정규화된 도메인 이름으로 바꿉니다.
- PROJECT_ID: Google Cloud 프로젝트의 프로젝트 ID로 바꿉니다.
- SERVICE_NAME: 서비스 이름
- VERSION_ID: 서비스의 버전 ID로 바꿉니다.
- SHA256_DIGEST: SHA256 값으로 바꿉니다.
컨테이너 이미지 URL로 새 컨테이너를 만듭니다.
docker pull ${IMAGE_URL} export CONTAINER_ID=$(docker create ${IMAGE_URL}) docker ps -a # the list should contain the newly created container with status `Created`
컨테이너 이미지의 루트 파일 시스템(
rootfs
)을 내보냅니다.docker export ${CONTAINER_ID} -o gae_app.tar mkdir gae_app mv -v gae_app.tar gae_app/ cd gae_app/ tar -xf gae_app.tar ls -la # inspect the container FS
또는
TAR
파일이 필요하지 않으면 다음 명령어를 실행합니다.mkdir gae_app cd gae_app/ docker export ${CONTAINER_ID} | tar -xC <dest> ls -la # inspect the container FS
루트 파일 시스템 콘텐츠를 분석하여 최신 코드 변경사항이 있는지 확인합니다.
다음 명령어를 실행하여 이미지를 정리합니다.
docker container rm ${CONTAINER_ID} docker image rm ${IMAGE_URL} unset IMAGE_URL CONTAINER_ID
Nginx가 앱 컨테이너에 연결하지 못함
다음 오류는 App Engine 가변형 환경에서만 발생하며 일반적으로 오류 발생 직후 502 오류와 함께 반환됩니다.
recv() failed (104: Connection reset by peer) while reading response header from upstream
이 오류는 nginx 리버스 프록시(nginx 사이드카)가 앱 컨테이너에 연결할 수 없음을 나타냅니다. 로그에서 nginx 로그에 있는 502 오류의 종료 시간을 nginx.error 로그의 시간과 비교할 수 있습니다. nginx.error 다음에 즉시 502 nginx 오류가 발생한 경우 nginx 502 오류의 원인일 수 있습니다.
이 오류는 애플리케이션의 연결 유지 제한 시간이 nginx의 연결 유지 제한 시간보다 작을 때 자주 발생합니다. App Engine 가변형 환경의 nginx는 keepalive_timeout
이 650초이므로 애플리케이션이 최소한 이 시간 동안 연결을 유지해야 합니다. 기본적으로 Node.js 애플리케이션의 keepAliveTimeout
은 5,000밀리초입니다. 이 경우 server.keepAliveTimeout
을 700,000밀리초로 설정할 수 있습니다.
문제를 해결하려면 VM 인스턴스에 연결하여 앱 컨테이너에서 실행 중인 코드에서 작성한 로그를 확인하고 필요한 경우 로깅을 추가하여 근본 원인을 찾습니다.
메모리 부족
다음 메모리 부족 오류는 App Engine 가변형 환경에서 발생하며 일반적으로 502 오류와 함께 반환됩니다.
kernel: [ 133.706951] Out of memory: Kill process 4490 (java) score 878 or sacrifice child
kernel: [ 133.714468] Killed process 4306 (java) total-vm:5332376kB, anon-rss:2712108kB, file-rss:0kB
이 오류는 App Engine이 애플리케이션을 종료했음을 나타냅니다.
이 오류는 인스턴스의 메모리가 부족할 때 발생합니다. 기본적으로 App Engine 가변형 환경의 메모리는 1GB이며 애플리케이션 컨테이너에 600MB만 사용할 수 있습니다.
문제를 해결하려면 로그에서 메모리 부족 항목을 확인하고 app.yaml
파일에서 memory_gb
구성을 업데이트한 후 다시 배포합니다.
수신 요청을 처리할 수 있는 개방형 연결 부족
최대 대기 연결 수가 활성 연결 수의 75% 이상이면 앱에 502 오류가 발생할 수 있습니다.
문제를 해결하려면 Cloud Monitoring 측정항목에서 최대 활성 연결 수와 대기 연결 수를 확인하여 최대 대기 연결 수가 활성 연결 수의 75% 이하가 되도록 대기 연결 수를 줄입니다.