12월 21, 2025
34 분 읽기

고급 클라우드 엔지니어 GCP 면접 질문: 완벽 가이드

interview
career-advice
job-search
고급 클라우드 엔지니어 GCP 면접 질문: 완벽 가이드
MB

Milad Bonakdar

작성자

아키텍처 설계, GKE, Cloud Functions, 비용 최적화, 보안 등 고급 GCP 개념을 다루는 종합적인 면접 질문으로 고급 클라우드 엔지니어 역할을 마스터하세요.


소개

숙련된 GCP 클라우드 엔지니어는 확장 가능한 아키텍처를 설계하고, 고급 서비스를 구현하고, 비용을 최적화하고, 대규모 보안을 보장할 수 있어야 합니다. 이 역할은 GCP 서비스, 아키텍처 모범 사례 및 프로덕션 경험에 대한 깊은 전문 지식을 요구합니다.

이 가이드는 아키텍처, 고급 서비스 및 전략적 솔루션에 중점을 둔 숙련된 GCP 클라우드 엔지니어를 위한 필수 면접 질문을 다룹니다.


아키텍처 및 설계

1. GCP에서 고가용성 애플리케이션을 설계하십시오.

답변: 중복성 및 확장성을 갖춘 프로덕션 환경에 적합한 아키텍처:

Loading diagram...

주요 구성 요소:

# 자동 확장을 사용하는 관리형 인스턴스 그룹 생성
gcloud compute instance-groups managed create my-mig \
  --base-instance-name=my-app \
  --template=my-template \
  --size=3 \
  --zone=us-central1-a

# 자동 확장 구성
gcloud compute instance-groups managed set-autoscaling my-mig \
  --max-num-replicas=10 \
  --min-num-replicas=3 \
  --target-cpu-utilization=0.7 \
  --cool-down-period=90

# 로드 밸런서 생성
gcloud compute backend-services create my-backend \
  --protocol=HTTP \
  --health-checks=my-health-check \
  --global

# 백엔드에 인스턴스 그룹 추가
gcloud compute backend-services add-backend my-backend \
  --instance-group=my-mig \
  --instance-group-zone=us-central1-a \
  --global

설계 원칙:

  • 다중 영역 배포
  • 지표 기반 자동 확장
  • 데이터베이스를 위한 관리형 서비스
  • 정적 콘텐츠를 위한 CDN
  • 상태 점검 및 모니터링

희소성: 매우 일반적 난이도: 어려움


Google Kubernetes Engine (GKE)

2. GKE에서 애플리케이션을 배포하고 관리하는 방법은 무엇입니까?

답변: GKE는 Google의 관리형 Kubernetes 서비스입니다.

배포 프로세스:

# GKE 클러스터 생성
gcloud container clusters create my-cluster \
  --num-nodes=3 \
  --machine-type=e2-medium \
  --zone=us-central1-a \
  --enable-autoscaling \
  --min-nodes=3 \
  --max-nodes=10

# 자격 증명 가져오기
gcloud container clusters get-credentials my-cluster \
  --zone=us-central1-a

# 애플리케이션 배포
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: gcr.io/my-project/myapp:v1
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  type: LoadBalancer
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 8080
EOF

GKE 기능:

  • 자동 업그레이드 및 자동 복구
  • 보안을 위한 워크로드 아이덴티티
  • 바이너리 인증
  • Cloud Monitoring 통합

희소성: 매우 일반적 난이도: 어려움


서버리스 및 고급 서비스

3. Cloud Functions와 Cloud Run은 언제 사용해야 합니까?

답변: 워크로드 특성에 따라 선택하십시오.

Cloud Functions:

  • 이벤트 기반 (Pub/Sub, Storage, HTTP)
  • 짧은 실행 시간 (< 9분)
  • 0으로 자동 확장
  • 호출당 지불

Cloud Run:

  • 컨테이너 기반
  • HTTP 요청 또는 Pub/Sub
  • 더 긴 실행 시간 (최대 60분)
  • 환경에 대한 더 많은 제어
# Cloud Function 예제
def hello_pubsub(event, context):
    """Pub/Sub 메시지에 의해 트리거됨"""
    import base64
    
    if 'data' in event:
        message = base64.b64decode(event['data']).decode('utf-8')
        print(f'Received message: {message}')
        
        # 메시지 처리
        process_data(message)
# Cloud Function 배포
gcloud functions deploy hello_pubsub \
  --runtime=python39 \
  --trigger-topic=my-topic \
  --entry-point=hello_pubsub

# Cloud Run 배포
gcloud run deploy myapp \
  --image=gcr.io/my-project/myapp:v1 \
  --platform=managed \
  --region=us-central1 \
  --allow-unauthenticated

희소성: 일반적 난이도: 중간


고급 네트워킹

4. Shared VPC를 설명하고 언제 사용해야 하는지 설명하십시오.

답변: Shared VPC를 사용하면 여러 프로젝트가 공통 VPC 네트워크를 공유할 수 있습니다.

장점:

  • 중앙 집중식 네트워크 관리
  • 프로젝트 간 리소스 공유
  • 간소화된 청구
  • 일관된 보안 정책

아키텍처:

Loading diagram...
# 호스트 프로젝트에서 Shared VPC 활성화
gcloud compute shared-vpc enable my-host-project

# 서비스 프로젝트 연결
gcloud compute shared-vpc associated-projects add my-service-project \
  --host-project=my-host-project

# 권한 부여
gcloud projects add-iam-policy-binding my-host-project \
  --member=serviceAccount:[email protected] \
  --role=roles/compute.networkUser

사용 사례:

  • 대규모 조직
  • 다중 팀 환경
  • 중앙 집중식 네트워크 관리
  • 규정 준수 요구 사항

희소성: 일반적 난이도: 중간-어려움


비용 최적화

5. GCP 비용을 최적화하는 방법은 무엇입니까?

답변: 비용 최적화 전략:

1. 적정 규모:

# Recommender API 사용
gcloud recommender recommendations list \
  --project=my-project \
  --location=us-central1 \
  --recommender=google.compute.instance.MachineTypeRecommender

2. 약정 사용 할인:

  • 1년 또는 3년 약정
  • 최대 57% 절감
  • 유연한 또는 리소스 기반

3. 선점형 VM:

# 선점형 인스턴스 생성
gcloud compute instances create my-preemptible \
  --preemptible \
  --machine-type=e2-medium

4. 스토리지 수명 주기:

# 수명 주기 정책 설정
gsutil lifecycle set lifecycle.json gs://my-bucket

# lifecycle.json
{
  "lifecycle": {
    "rule": [
      {
        "action": {"type": "SetStorageClass", "storageClass": "NEARLINE"},
        "condition": {"age": 30}
      },
      {
        "action": {"type": "Delete"},
        "condition": {"age": 365}
      }
    ]
  }
}

5. 모니터링:

  • Cloud Billing 보고서
  • 예산 알림
  • 서비스/프로젝트별 비용 분석

희소성: 매우 일반적 난이도: 중간


보안

6. GCP에서 보안 모범 사례를 구현하는 방법은 무엇입니까?

답변: 다계층 보안 접근 방식:

1. IAM 모범 사례:

# 최소 권한으로 서비스 계정 사용
gcloud iam service-accounts create my-app-sa \
  --display-name="My App Service Account"

# 특정 역할 부여
gcloud projects add-iam-policy-binding my-project \
  --member=serviceAccount:[email protected] \
  --role=roles/storage.objectViewer \
  --condition='expression=resource.name.startsWith("projects/_/buckets/my-bucket"),title=bucket-access'

2. VPC 보안:

  • Private Google Access
  • VPC Service Controls
  • DDoS 보호를 위한 Cloud Armor

3. 데이터 암호화:

# 고객 관리 암호화 키
gcloud kms keyrings create my-keyring \
  --location=global

gcloud kms keys create my-key \
  --location=global \
  --keyring=my-keyring \
  --purpose=encryption

# Cloud Storage와 함께 사용
gsutil -o 'GSUtil:encryption_key=...' cp file.txt gs://my-bucket/

4. 모니터링:

  • Cloud Audit Logs
  • Security Command Center
  • Cloud Logging 및 Monitoring

희소성: 매우 일반적 난이도: 어려움


데이터 분석

7. 대규모 분석을 위해 BigQuery를 설계하고 최적화하는 방법은 무엇입니까?

답변: BigQuery는 Google의 서버리스, 고도로 확장 가능한 데이터 웨어하우스입니다.

아키텍처:

  • 컬럼 스토리지
  • 자동 확장
  • SQL 인터페이스
  • 페타바이트 규모
  • 쿼리당 지불 가격

테이블 설계:

-- 파티션된 테이블 생성
CREATE TABLE mydataset.events
(
  event_id STRING,
  user_id STRING,
  event_type STRING,
  event_data JSON,
  event_timestamp TIMESTAMP
)
PARTITION BY DATE(event_timestamp)
CLUSTER BY user_id, event_type
OPTIONS(
  partition_expiration_days=90,
  require_partition_filter=true
);

-- 구체화된 뷰 생성
CREATE MATERIALIZED VIEW mydataset.daily_summary
AS
SELECT
  DATE(event_timestamp) as event_date,
  event_type,
  COUNT(*) as event_count,
  COUNT(DISTINCT user_id) as unique_users
FROM mydataset.events
GROUP BY event_date, event_type;

최적화 전략:

1. 파티셔닝:

-- 시간 기반 파티셔닝
CREATE TABLE mydataset.sales
PARTITION BY DATE(sale_date)
AS SELECT * FROM source_table;

-- 정수 범위 파티셔닝
CREATE TABLE mydataset.user_data
PARTITION BY RANGE_BUCKET(user_id, GENERATE_ARRAY(0, 1000000, 10000))
AS SELECT * FROM source_table;

-- 파티션 필터로 쿼리 (비용 효율적)
SELECT *
FROM mydataset.events
WHERE DATE(event_timestamp) BETWEEN '2024-01-01' AND '2024-01-31'
  AND event_type = 'purchase';

2. 클러스터링:

-- 자주 필터링되는 열을 기준으로 클러스터링
CREATE TABLE mydataset.logs
PARTITION BY DATE(log_timestamp)
CLUSTER BY user_id, region, status
AS SELECT * FROM source_logs;

-- 클러스터링의 이점을 얻는 쿼리
SELECT *
FROM mydataset.logs
WHERE DATE(log_timestamp) = '2024-11-26'
  AND user_id = '12345'
  AND region = 'us-east1';

3. 쿼리 최적화:

-- 나쁨: SELECT * (모든 열 스캔)
SELECT * FROM mydataset.large_table;

-- 좋음: 특정 열 선택
SELECT user_id, event_type, event_timestamp
FROM mydataset.large_table;

-- 대규모 데이터 세트에 대한 대략적인 집계 사용
SELECT APPROX_COUNT_DISTINCT(user_id) as unique_users
FROM mydataset.events;

-- 자체 조인 방지, 윈도우 함수 사용
SELECT
  user_id,
  event_timestamp,
  LAG(event_timestamp) OVER (PARTITION BY user_id ORDER BY event_timestamp) as prev_event
FROM mydataset.events;

4. 비용 관리:

# 최대 바이트 청구 설정
bq query \
  --maximum_bytes_billed=1000000000 \
  --use_legacy_sql=false \
  'SELECT COUNT(*) FROM mydataset.large_table'

# 비용 추정을 위한 드라이 런
bq query \
  --dry_run \
  --use_legacy_sql=false \
  'SELECT * FROM mydataset.large_table'

데이터 로딩:

# Cloud Storage에서 로드
bq load \
  --source_format=NEWLINE_DELIMITED_JSON \
  --autodetect \
  mydataset.mytable \
  gs://mybucket/data/*.json

# 스키마와 함께 로드
bq load \
  --source_format=CSV \
  --skip_leading_rows=1 \
  mydataset.mytable \
  gs://mybucket/data.csv \
  schema.json

# 스트리밍 삽입 (실시간)
from google.cloud import bigquery

client = bigquery.Client()
table_id = "my-project.mydataset.mytable"

rows_to_insert = [
    {"user_id": "123", "event_type": "click", "timestamp": "2024-11-26T10:00:00"},
    {"user_id": "456", "event_type": "purchase", "timestamp": "2024-11-26T10:05:00"},
]

errors = client.insert_rows_json(table_id, rows_to_insert)
if errors:
    print(f"Errors: {errors}")

모범 사례:

  • 항상 파티션 필터 사용
  • 높은 카디널리티 열을 기준으로 클러스터링
  • SELECT * 방지
  • 대규모 데이터 세트에 대한 대략적인 함수 사용
  • 쿼리 비용 모니터링
  • 반복되는 쿼리에 대한 구체화된 뷰 사용
  • 적절한 경우 데이터 비정규화

희소성: 매우 일반적 난이도: 어려움


고급 데이터베이스 서비스

8. Cloud Spanner와 Cloud SQL은 언제 사용해야 합니까?

답변: 규모, 일관성 및 지리적 요구 사항에 따라 선택하십시오.

Cloud Spanner:

  • 전 세계적으로 분산된 관계형 데이터베이스
  • 수평적 확장 (무제한)
  • 지역 간 강력한 일관성
  • 99.999% 가용성 SLA
  • 더 높은 비용

Cloud SQL:

  • 지역적 관리형 데이터베이스 (MySQL, PostgreSQL, SQL Server)
  • 수직적 확장 (제한됨)
  • 단일 지역 (읽기 복제본 포함)
  • 99.95% 가용성 SLA
  • 더 낮은 비용

비교:

기능Cloud SpannerCloud SQL
규모페타바이트테라바이트
일관성전역 강력지역
가용성99.999%99.95%
지연 시간전역적으로 한 자릿수 ms낮음 (지역)
비용높음중간
사용 사례글로벌 앱, 금융 시스템지역 앱, 기존 워크로드

Cloud Spanner 예제:

-- Spanner 인스턴스 생성
gcloud spanner instances create my-instance \
  --config=regional-us-central1 \
  --nodes=3 \
  --description="Production instance"

-- 데이터베이스 생성
gcloud spanner databases create my-database \
  --instance=my-instance \
  --ddl='CREATE TABLE Users (
    UserId INT64 NOT NULL,
    Username STRING(100),
    Email STRING(255),
    CreatedAt TIMESTAMP
  ) PRIMARY KEY (UserId)'

-- 데이터 삽입
gcloud spanner databases execute-sql my-database \
  --instance=my-instance \
  --sql="INSERT INTO Users (UserId, Username, Email, CreatedAt)
        VALUES (1, 'alice', '[email protected]', CURRENT_TIMESTAMP())"

-- 강력한 일관성으로 쿼리
gcloud spanner databases execute-sql my-database \
  --instance=my-instance \
  --sql="SELECT * FROM Users WHERE UserId = 1"

Python 클라이언트:

from google.cloud import spanner

# 클라이언트 생성
spanner_client = spanner.Client()
instance = spanner_client.instance('my-instance')
database = instance.database('my-database')

# 강력한 일관성으로 읽기
def read_user(user_id):
    with database.snapshot() as snapshot:
        results = snapshot.execute_sql(
            "SELECT UserId, Username, Email FROM Users WHERE UserId = @user_id",
            params={"user_id": user_id},
            param_types={"user_id": spanner.param_types.INT64}
        )
        for row in results:
            print(f"User: {row[0]}, {row[1]}, {row[2]}")

# 트랜잭션으로 쓰기
def create_user(user_id, username, email):
    def insert_user(transaction):
        transaction.execute_update(
            "INSERT INTO Users (UserId, Username, Email, CreatedAt) "
            "VALUES (@user_id, @username, @email, CURRENT_TIMESTAMP())",
            params={
                "user_id": user_id,
                "username": username,
                "email": email
            },
            param_types={
                "user_id": spanner.param_types.INT64,
                "username": spanner.param_types.STRING,
                "email": spanner.param_types.STRING
            }
        )
    
    database.run_in_transaction(insert_user)

Cloud SQL 예제:

# Cloud SQL 인스턴스 생성
gcloud sql instances create my-instance \
  --database-version=POSTGRES_14 \
  --tier=db-n1-standard-2 \
  --region=us-central1 \
  --root-password=mypassword

# 데이터베이스 생성
gcloud sql databases create mydatabase \
  --instance=my-instance

# 연결
gcloud sql connect my-instance --user=postgres

# 읽기 복제본 생성
gcloud sql instances create my-replica \
  --master-instance-name=my-instance \
  --tier=db-n1-standard-1 \
  --region=us-east1

언제 사용해야 하는가:

Cloud Spanner를 사용하는 경우:

  • 글로벌 배포가 필요한 경우
  • 지역 간에 강력한 일관성이 필요한 경우
  • 단일 지역을 넘어 확장해야 하는 경우
  • 금융 거래
  • 미션 크리티컬 애플리케이션
  • 더 높은 비용을 감당할 수 있는 경우

Cloud SQL을 사용하는 경우:

  • 지역 애플리케이션
  • MySQL/PostgreSQL에 익숙한 경우
  • 비용에 민감한 경우
  • 중간 규모 (< 10TB)
  • 기존 SQL 워크로드
  • 글로벌 일관성이 필요하지 않은 경우

희소성: 일반적 난이도: 중간-어려움


보안 및 규정 준수

9. VPC Service Controls를 구현하는 방법은 무엇입니까?

답변: VPC Service Controls는 데이터 유출을 방지하기 위해 GCP 리소스 주위에 보안 경계를 만듭니다.

주요 개념:

  • 서비스 경계: 리소스 주변의 경계
  • 액세스 수준: 액세스 조건
  • 수신/송신 규칙: 데이터 흐름 제어

아키텍처:

Loading diagram...

설정:

# 액세스 정책 생성
gcloud access-context-manager policies create \
  --organization=123456789 \
  --title="Production Policy"

# 액세스 수준 생성
gcloud access-context-manager levels create CorpNetwork \
  --policy=accessPolicies/123456789 \
  --title="Corporate Network" \
  --basic-level-spec=access_level.yaml

# access_level.yaml
conditions:
  - ipSubnetworks:
    - 203.0.113.0/24  # 회사 IP 범위
  - members:
    - user:[email protected]

서비스 경계 생성:

# 경계 생성
gcloud access-context-manager perimeters create production_perimeter \
  --policy=accessPolicies/123456789 \
  --title="Production Perimeter" \
  --resources=projects/123456789012 \
  --restricted-services=storage.googleapis.com,bigquery.googleapis.com \
  --access-levels=accessPolicies/123456789/accessLevels/CorpNetwork

# 경계에 프로젝트 추가
gcloud access-context-manager perimeters update production_perimeter \
  --policy=accessPolicies/123456789 \
  --add-resources=projects/987654321098

수신/송신 규칙:

# ingress_rule.yaml
ingressPolicies:
  - ingressFrom:
      sources:
        - accessLevel: accessPolicies/123456789/accessLevels/CorpNetwork
      identities:
        - serviceAccount:[email protected]
    ingressTo:
      resources:
        - '*'
      operations:
        - serviceName: storage.googleapis.com
          methodSelectors:
            - method: '*'

# 수신 규칙 적용
gcloud access-context-manager perimeters update production_perimeter \
  --policy=accessPolicies/123456789 \
  --set-ingress-policies=ingress_rule.yaml

송신 규칙:

# egress_rule.yaml
egressPolicies:
  - egressFrom:
      identities:
        - serviceAccount:[email protected]
    egressTo:
      resources:
        - projects/external-project-id
      operations:
        - serviceName: storage.googleapis.com
          methodSelectors:
            - method: 'google.storage.objects.create'

# 송신 규칙 적용
gcloud access-context-manager perimeters update production_perimeter \
  --policy=accessPolicies/123456789 \
  --set-egress-policies=egress_rule.yaml

지원되는 서비스:

  • Cloud Storage
  • BigQuery
  • Cloud SQL
  • Compute Engine
  • GKE
  • Cloud Functions
  • 그 외 다수

테스트:

# 경계 내에서 액세스 테스트
from google.cloud import storage

def test_access():
    try:
        client = storage.Client()
        bucket = client.bucket('my-protected-bucket')
        blobs = list(bucket.list_blobs())
        print(f"Access granted: {len(blobs)} objects")
    except Exception as e:
        print(f"Access denied: {e}")

# 권한이 있는 네트워크에서 성공
# 권한이 없는 네트워크에서 실패
test_access()

모니터링:

# VPC SC 로그 보기
gcloud logging read \
  'protoPayload.metadata.@type="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"' \
  --limit=50 \
  --format=json

사용 사례:

  • 데이터 유출 방지
  • 규정 준수 요구 사항 (HIPAA, PCI-DSS)
  • 민감한 데이터 보호
  • 프로덕션 환경 격리
  • 다중 테넌트 보안

모범 사례:

  • 드라이 런 모드에서 시작
  • 시행 전에 철저히 테스트
  • 세분화된 제어를 위해 액세스 수준 사용
  • VPC SC 로그 모니터링
  • 경계 문서화
  • 정기적인 액세스 검토

희소성: 드뭄 난이도: 어려움


결론

숙련된 GCP 클라우드 엔지니어 면접은 깊은 기술 지식과 실무 경험을 요구합니다. 다음 사항에 집중하십시오.

  1. 아키텍처: 고가용성, 확장성, 재해 복구
  2. GKE: 컨테이너 오케스트레이션, 배포 전략
  3. 서버리스: Cloud Functions, Cloud Run 사용 사례
  4. 네트워킹: Shared VPC, 하이브리드 연결
  5. 비용 최적화: 적정 규모, 약정 사용, 수명 주기 정책
  6. 보안: IAM, 암호화, VPC 컨트롤

프로덕션 시스템 및 전략적 의사 결정에 대한 실제 경험을 보여주십시오. 행운을 빕니다!

Newsletter subscription

실제로 효과가 있는 주간 커리어 팁

최신 인사이트를 받은 편지함으로 직접 받아보세요

Decorative doodle

다음 면접은 이력서 하나로 결정됩니다

몇 분 만에 전문적이고 최적화된 이력서를 만드세요. 디자인 기술은 필요 없습니다—입증된 결과만 있으면 됩니다.

내 이력서 만들기

이 게시물 공유

6초를 최대한 활용하세요

채용 담당자는 평균적으로 6~7초만 이력서를 훑어봅니다. 우리의 검증된 템플릿은 즉시 주목을 끌고 계속 읽게 하도록 설계되었습니다.