12월 21, 2025
34 분 읽기

시니어 GCP 클라우드 엔지니어 면접 질문과 답변

interview
career-advice
job-search
시니어 GCP 클라우드 엔지니어 면접 질문과 답변
Milad Bonakdar

Milad Bonakdar

작성자

아키텍처, GKE, Cloud Run, IAM, 비용, BigQuery, 안정성 트레이드오프를 중심으로 시니어 GCP 면접을 준비하세요.


소개

시니어 GCP 클라우드 엔지니어 면접은 Google Cloud 서비스 이름을 아는지보다 프로덕션 의사결정을 설명할 수 있는지를 봅니다. 특정 워크로드에 대해 GKE, Cloud Run, Cloud SQL, Spanner, Shared VPC, IAM 제어, 비용 가드레일을 왜 선택하는지 말할 수 있어야 합니다.

각 질문은 시니어답게 답하는 연습에 사용하세요. 요구사항을 먼저 정리하고, 선택을 설명하고, 위험을 짚고, 프로덕션에서 어떻게 운영할지까지 말하는 방식이 좋습니다.


아키텍처 및 설계

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 기능:

  • 컨트롤 플레인과 노드 가용성을 위한 리전 클러스터
  • Cluster autoscaling과 Horizontal Pod Autoscaling
  • 장기 서비스 계정 키 대신 Workload Identity Federation for GKE 사용
  • 공급망 관리를 위한 Binary Authorization과 이미지 스캔
  • Cloud Logging, Cloud Monitoring, SLO, 알림

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


서버리스 및 고급 서비스

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

답변: 어떤 운영 책임을 가져야 하는지에 따라 선택합니다. 좋은 답변은 트리거, 패키징, 런타임 제어, 확장 방식, 운영 복잡도를 비교합니다.

Cloud Functions:

  • Pub/Sub, Cloud Storage, Eventarc, 단순 HTTP용 작은 이벤트 핸들러에 적합
  • 인프라 표면적이 작음
  • 사용자 지정 컨테이너가 필요 없고 함수 단위 배포를 원할 때 적합
  • 컨테이너 서비스보다 런타임 형태에 대한 제어는 적음

Cloud Run:

  • 컨테이너화된 HTTP 서비스, API, 워커, 이벤트 기반 서비스에 적합
  • 의존성, 동시성, CPU 할당, 시작 동작, 트래픽 분할을 더 많이 제어
  • 0으로 확장 가능하며 지연 시간에 민감한 경로에는 최소 인스턴스를 사용할 수 있음
  • 이식성, 사용자 지정 런타임, 서비스 단위 책임이 필요할 때 대체로 더 나은 기본 선택
# 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=python312 \
  --trigger-topic=my-topic \
  --entry-point=hello_pubsub

# Cloud Run 배포
gcloud run deploy myapp \
  --image=gcr.io/my-project/myapp:v1 \
  --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년 약정 사용
  • 지출 패턴에는 유연한 약정, 특정 컴퓨팅 사용에는 리소스 기반 약정 고려
  • 낭비를 고정하지 않도록 적정 규모 조정과 함께 사용

3. Spot VM:

# 중단 가능한 작업용 Spot VM 생성
gcloud compute instances create my-spot-vm \
  --provisioning-model=SPOT \
  --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에서 보안 모범 사례를 구현하는 방법은 무엇입니까?

답변: 계층형 모델을 사용합니다. 먼저 ID를 설계하고, 노출을 줄이는 private networking, 민감 데이터 암호화, 로그와 Security Command Center 기반 지속 탐지를 결합합니다.

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'

면접에서는 프로덕션에서 기본 역할을 피하고, 사람 ID와 워크로드 ID를 분리하며, 단기 자격 증명과 Workload Identity Federation을 선호하고, IAM 바인딩을 정기적으로 검토한다고 말하세요.

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

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

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

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

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

내 이력서 만들기

이 게시물 공유

6초를 최대한 활용하세요

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