1. 모니터링

1.1. App Engine Dashboard 활용

App Engine Dashboard에서 기본적으로 제공하는 지표는 다음과 같다. 

  • Summary
  • Requests by Type
  • Latency
  • Loading Latency
  • Error Details
  • Traffic
  • Utilization
  • Instances
  • Memory Usage
  • Memcache Operation
  • Memcache Compute Units
  • Memcache Traffic

1.2. Current Load

호출된 URI에 따라 요청 수, 레이턴시 등을 확인할 수 있다. 

1.3. Operations > Trace

해당 요청에 대한 Trace를 추적할 수 있다. 

1.4. Error Reporting

대시보드에서 발생한 에러 현황을 확인할 수 있다. 

  • Application Errors DB Connection Error등 애플리케이션에서 발생한 에러
  • Server Errors URI 베이스로 발생한 Server 에러 카운트
  • Client Errors URI 베이스로 발생한 Client 에러 카운트

Error Reporting 대시보드에서 최근 발생한 에러를 확인할 수 있으며, Notification Channel을 연동하여 Slack, SMS, 이메일, GCP Application등을 통해 알림을 받을 수 있다. 

1.5. Monitoring 활용

Google Cloud Metric의 appengine 메트릭을 모니터링 할 수 있다. 

https://cloud.google.com/monitoring/api/metrics_gcp


2. 주요 관리 작업

2.1. App Engine Service를 VPC에 연결

  • VPC Connector 생성

VPC에 AppEngine을 연동하기 위해서는 먼저 VPC Connector를 생성해야 한다. VPC Connector를 생성하면 Serverless VPC Access라는 Hidden VPC가 생성되며, 연결하려는 VPC와 peering을 형성한다. 

Console > VPC Network > Serverless VPC Access > Create Connector를 통해 접근 후 Connector를 생성한다. 

*Connector를 생성하면 /28 사이즈의 임의의 VPC가 생성되고 Peering이 생기므로 IP Range를 적절하게 설계 후 생성한다. 

*AppEngine, Cloud Run, Cloud Function과 마찬가지로 VPC Connector 역시 한국 리전을 지원하지 않는다.

  • app.yml 파일에 VPC Connector 옵션 추가

VPC Connector를 생성하면 app.yml에 해당 VPC Connector 정보를 반영한 뒤 gcloud app deploy명령을 통해 애플리케이션을 배포한다.

runtime: python37
service: custom-server-service
entrypoint: uwsgi --http-socket :8080 --wsgi-file main.py --callable app --master --processes 1 --threads 2
vpc_access_connector:
  name: "projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME"
  • IP Range 중복으로 Connector 생성이 불가능한 경우

VPC Network에 속한 IP Range와 중복되지 않았음에도 IP 중복 문제로 커넥터 생성이 불가능한 경우, 

Console > VPC Network > VPC 선택 > Private Service Connection > Allocated IP ranges for services에 할당되어 있는 IP Range와 중복되지 않는지 확인한다. 

2.2. App Engine의 Firewall Rule

AppEngine의 Firewall Rule은 VPC Network > Firewall Rules가 아니라, AppEngine > Firewall Rules에서 별도로 관리된다.

기능적으로 Network Tag 기반의 Rule 설정은 불가능하며, IP Range 기반의 룰 설정만 가능하다. 

2.3. App Engine Service의 Traffic Splitting

여러 버전의 서비스에 대해 트래픽을 분할하려면 gcloud app services를 통해 설정 가능하다. Weight 값을 기반으로 트래픽 분할이 가능하며, IP 또는 쿠키 기반으로 라우팅 된다. AppEngine Egress 트래픽에 대해서 제어가 불가능하며, Ingress 트래픽에 대해서만 제어가 가능하다.  

Console > AppEngine > Version 에서 각 버전의 Traffic Allocation을 확인할 수 있다. 

$ gcloud app services set-traffic [MY_SERVICE] --splits [MY_VERSION1]=[VERSION1_WEIGHT],[MY_VERSION2]=[VERSION2_WEIGHT] --split-by [IP_OR_COOKIE]

# 예시
$ gcloud app services set-traffic custom-server-service --splits v1=.1,v2=.2,v3=.7 --split-by random
Setting the following traffic allocation:
 - polar-standard-/custom-server-service/v1: 0.1
 - polar-standard-/custom-server-service/v2: 0.2
 - polar-standard-/custom-server-service/v3: 0.7
NOTE: Splitting traffic by random.
Any other versions of the specified service will receive zero traffic.
Do you want to continue (Y/n)?  y

Setting traffic split for service [custom-server-service]...done.

동일한 주소로 접근하여 Traffic Split이 된 것을 확인할 수 있다. 

2.4. Internal Endpoint만을 갖는 Private Service Connection 내부 자원(CloudSQL, MemoryStore 등) 통신 불가능

AppEngine은 Cloud Functions과 마찬가지로 VPC 내부의 자원에 액세스 하기 위해 VPC Connector 생성이 필요하다. 

AppEngine은 Serverless VPC Access 라는 Hidden VPC내부에 생성되며, AppEngine를 통해 접근하려는 자원이 속한  VPC(또는 Host Project의 Shared VPC)와 Peering 연결을 생성한다. 이 때 Function이 Peering을 통해 통신 가능하도록 하는 것이 VPC Connector이다. Private Service Connection에 속한 관리형 서비스(CloudSQL, MemoryStore 등) 역시 다른 리소스들이 속한 VPC와 Private Service Connection의 Hidden VPC가 Peering 되어 통신한다.

GCP VPC는 Transitive Peering을 지원하지 않기 때문에, Serverless VPC Access to Private Service Connection은 통신이 불가능하다. 

따라서, AppEngine에서 프라이빗 엔드포인트 만을 갖는 CloudSQL 또는 MemoryStore에 직접 액세스 불가능하다. (CloudSQL Proxy)