App Engine의 웹 서비스 구조화

리전 ID

REGION_ID는 앱을 만들 때 선택한 리전을 기준으로 Google에서 할당하는 축약된 코드입니다. 일부 리전 ID는 일반적으로 사용되는 국가 및 주/도 코드와 비슷하게 표시될 수 있지만 코드는 국가 또는 주/도와 일치하지 않습니다. 2020년 2월 이후에 생성된 앱의 경우 REGION_ID.r이 App Engine URL에 포함됩니다. 이 날짜 이전에 만든 기존 앱의 경우 URL에서 리전 ID는 선택사항입니다.

리전 ID에 대해 자세히 알아보세요.

다음 문서는 App Engine 앱의 서비스와 관련 리소스를 구조화하는 방법을 설명합니다.

디렉터리 구조

App Engine 서비스의 각 버전은 app.yaml 구성 파일에서 정의됩니다. 간단한 앱의 경우 app.yaml 파일만 정의하면 배포될 수 있습니다. app.yaml 파일은 배포 설명자 역할을 하며 서비스의 특정 버전에 대한 확장 유형과 런타임, 핸들러, 기타 리소스 설정을 정의합니다. 서비스의 여러 버전을 배포하려면 같은 디렉터리에 각 버전의 구성을 나타내는 YAML 파일을 여러 개 만들면 됩니다.

로컬에서 개발하는 경우 앱의 루트에 서비스별 디렉터리를 별도로 만들 수 있습니다. 앱을 GitHub와 같은 버전 제어 시스템(VCS)에 호스팅하는 경우에는 앱에 서비스마다 저장소의 별도 디렉터리를 사용하거나 별도 저장소를 사용하도록 구조화할 수도 있습니다. 각 디렉터리나 저장소는 단일 서비스를 나타내야 하며 서비스의 app.yaml 파일과 함께 관련 소스 코드를 포함해야 합니다.

각 서비스의 app.yaml 파일에 고유한 이름을 지정할 수도 있습니다. 예를 들어 service1.yaml 또는 app.standard.yaml과 같이 구성 파일 이름에 서비스 이름을 붙이거나 서비스의 각 버전을 나타내는 고유한 이름을 사용할 수 있습니다.

그 외 선택적 구성 파일은 앱의 default 서비스 루트 디렉터리 또는 저장소에 있어야 합니다. 이러한 선택적 구성 파일에는 dispatch.yaml, index.yaml, cron.yaml 파일 등이 있으며 특정 서비스에 국한되지 않는 앱 전체 설정을 적용합니다.

예시

다음 예시에서는 3가지 서비스가 포함된 앱을 로컬에서 개발하는 경우의 앱 구조를 보여줍니다. 선택적인 dispatch.yaml이 앱의 루트 디렉터리에 추가되었습니다. 또한 루트에는 앱의 각 서비스에 대한 디렉터리가 3개 있습니다. service1 하위 디렉터리에는 서비스의 소스와 구성 파일이 포함되어 있습니다. service3에는 2가지 버전의 YAML 구성 파일이 포함되어 있지만 service2service3 역시 각 서비스의 파일이 포함된 별도의 디렉터리에 있습니다.

YAML 서비스의 계층구조 그래프

단일 서비스 앱의 경우 default 서비스만 포함되며 모든 파일이 동일한 디렉터리(앱의 루트)에 위치할 수 있습니다. 다음 예시에서는 선택적 dispatch.yaml 구성 파일과 서비스의 서로 다른 버전을 나타내는 구성 파일 두 개(service1.yamlservice2.yaml)가 포함된 단일 서비스 앱에서 가능한 구조를 보여줍니다.

작은 YAML 서비스의 계층구조 그래프

인스턴스 업타임 설계 고려사항

조기 종료나 빈번한 인스턴스 다시 시작을 초래하는 하드웨어 또는 소프트웨어 오류는 예고 없이 발생할 수 있으며 해결하는 데 상당한 시간이 걸릴 수 있습니다. 애플리케이션은 이러한 오류에 대처할 수 있어야 합니다.

인스턴스 재시작으로 인한 다운타임 방지에 효과적인 전략은 다음과 같습니다.

  • 인스턴스 재시작 또는 새 인스턴스 시작에 걸리는 시간을 줄입니다.
  • 계산이 장기간 실행되는 경우 해당 상태부터 다시 시작할 수 있도록 정기적으로 체크포인트를 만듭니다.
  • 인스턴스에 아무것도 저장되지 않도록 앱이 '스테이트리스(Stateless)'이어야 합니다.
  • 큐를 사용하여 태스크를 비동기적으로 실행합니다.
  • 인스턴스를 수동으로 확장하도록 구성한 경우에는 다음을 수행합니다.
    • 여러 인스턴스에서 부하 분산을 사용합니다.
    • 일반적인 트래픽을 처리하는 데 필요한 수보다 많은 인스턴스를 구성합니다.
    • 수동 확장 인스턴스를 사용할 수 없는 경우에는 캐시된 결과를 사용하는 대체 로직을 작성합니다.

인스턴스에 대한 자세한 내용은 인스턴스 관리 방법을 참조하세요.

default 서비스

모든 App Engine 애플리케이션에는 default 서비스가 포함되어 있습니다. 서비스를 추가로 만들고 앱에 배포하려면 먼저 앱의 최초 버전을 default 서비스에 배포해야 합니다.

app.yaml에서 service: default 설정을 사용하여 기본 서비스를 선택적으로 지정할 수도 있습니다.

Cloud 프로젝트를 사용하여 앱에 보낸 요청은 default 서비스(예: https://PROJECT_ID.REGION_ID.r.appspot.com)로 전송됩니다. 다른 서비스 타겟팅에 대한 자세한 내용은 서비스 간 통신을 참조하세요.

선택적 구성 파일

다음 구성 파일은 개별 앱의 모든 서비스에 적용되는 선택적 기능을 제어합니다. 각 선택적 기능에 대한 자세한 내용은 다음 주제를 참조하세요.

  • dispatch.yaml는 URL의 경로 또는 호스트 이름에 따라 수신 요청을 특정 서비스로 보내어 기본 규칙을 라우팅합니다.
  • index.yaml는 Datastore 쿼리를 사용할 경우 앱에 필요한 색인을 지정합니다.
  • cron.yaml는 정의된 시간 또는 일정한 간격으로 작동하는 정기 예약 태스크를 구성합니다.

데이터 및 파일 스토리지 고려사항

App Engine에서 Datastore, Cloud SQL, Cloud Storage와 같은 다른 Google Cloud 서비스에 간편하게 액세스할 수 있습니다.

외부 또는 타사 데이터베이스가 사용자 언어로 지원되고 App Engine 인스턴스에서 액세스할 수 있으면 해당 데이터베이스를 사용할 수 있습니다.

파일을 Google Cloud 또는 외부에 저장하는 방법에 대한 자세한 내용은 데이터 및 파일 스토리지 이해를 참조하세요.

또한 정적 콘텐츠를 제공할 방법을 선택할 수 있습니다. 정적 콘텐츠를 App Engine에서 애플리케이션으로 직접 제공하거나, Cloud Storage와 같은 Google Cloud 옵션으로 호스팅하거나, 타사 콘텐츠 전송 네트워크(CDN)를 사용하는 방법 중 선택할 수 있습니다. 정적 콘텐츠 제공에 대한 자세한 내용은 정적 파일 제공을 참조하세요.

다음 단계

여러 서비스로 작업하는 경우, 이를 함께 배포하려면 여러 서비스 배포 단계를 참조하세요.