포스트

Infra end-to-end 배우기 4) 프로젝트 생성 및 기본 설정

GCP 기반 인프라 세팅 (1)

Infra end-to-end 배우기 4) 프로젝트 생성 및 기본 설정

지난번 정리했던 체크리스트를 바탕으로 실제 작성했던 스크립트를 공유하고자 한다.
프로젝트 생성부터 IAM 바인딩 까지 사전 설정해야하는 부분을 중심으로 작성했다.

0) 프로젝트 생성 및 기본 설정

프로젝트 생성 및 기본 설정을 위해 준비해야 할 구체적인 항목은 다음과 같다.

  • Host / Service 프로젝트 생성
  • IAM 및 보안 초기화
  • gcloud config profile 세팅
  • 기본 VPC 삭제 (보안 목적)

실행 환경이 윈도우 로컬 PC여서 이에 알맞게 CMD 에서 사용 가능한 문법으로 구성되어 있다.
사전 변수 ACCUNT_MAIL, HOST_PROJECT, SVC_PROJECT, REGION, ZONE을 할당했다.

REM --- gcloud 구성 생성 (재실행 안전: || true) ---
gcloud config configurations create mjahn-host    || true
gcloud config configurations create mjahn-service || true

REM --- Host 프로젝트 Config 값 세팅 ---
gcloud config set --configuration=mjahn-host core/account   %ACCUNT_MAIL%
gcloud config set --configuration=mjahn-host core/project   %HOST_PROJECT%
gcloud config set --configuration=mjahn-host compute/region %REGION%
gcloud config set --configuration=mjahn-host compute/zone   %ZONE%

REM --- Service 프로젝트 Config 값 세팅 ---
gcloud config set --configuration=mjahn-service core/account   %ACCUNT_MAIL%
gcloud config set --configuration=mjahn-service core/project   %SVC_PROJECT%
gcloud config set --configuration=mjahn-service compute/region %REGION%
gcloud config set --configuration=mjahn-service compute/zone   %ZONE%

REM --- 구성 목록 확인 ---
gcloud config configurations list

REM --- 구성 전환 시 ---
REM gcloud config configurations activate mjahn-host
REM gcloud config configurations activate mjahn-service

REM --- 보안: 기본 방화벽 규칙 및 기본 VPC 삭제 ---
gcloud compute firewall-rules delete default-allow-icmp default-allow-internal default-allow-ssh default-allow-rdp --project=%HOST_PROJECT% --quiet || true
gcloud compute firewall-rules delete default-allow-icmp default-allow-internal default-allow-ssh default-allow-rdp --project=%SVC_PROJECT% --quiet || true

gcloud compute networks delete default --project=%HOST_PROJECT% --quiet || true
gcloud compute networks delete default --project=%SVC_PROJECT% --quiet || true

REM --- 검증 ---
gcloud projects describe %HOST_PROJECT%
gcloud projects describe %SVC_PROJECT%

1) IAM 역할 설정 및 그룹 초대

여기서는 사람 그룹(Google Groups)에 프로젝트 레벨 IAM 역할을 부여한다.
그룹은 여러 사람을 묶어 한 번에 권한을 관리할 수 있게 해주는 개념이다. 두 가지 그룹으로 나누어 권한을 설정한다.

  • kickoff-infra-admin 그룹
    • Host 프로젝트
      • roles/compute.networkAdmin : 네트워크 전체 관리
      • roles/compute.xpnAdmin : 공유 VPC(XPC) 관리
    • Service 프로젝트
      • roles/project.iamAdmin : IAM 정책 관리
      • roles/compute.admin : 컴퓨팅 리소스 관리
  • kickoff-service-dev 그룹
    • Service 프로젝트
      • roles/compute.instanceAdmin.v1 : 인스턴스 관리
      • roles/container.developer : GKE 클러스터 접근
      • roles/storage.admin : 스토리지 리소스 관리
    • Host 프로젝트
      • roles/compute.networkUser : Shared VPC 사용 권한

해당 그룹 초대 및 권한 바인딩은 gcp 콘솔에서 작업하였다.
설정 후 다음과 같은 코드로 검증할 수 있다. (출력되면 해당 그룹 잘 적용되었는지 확인 가능)

1
2
3
REM --- 검증 ---
gcloud projects get-iam-policy %HOST_PROJECT%
gcloud projects get-iam-policy %SVC_PROJECT%

2) Host 네트워크 (mjahn-host) & Service 연결 (mjahn-service)

앞선 그룹 초대가 끝나야 다음과 같은 작업이 가능하므로 순차적으로 진행해야한다!
이어서는 실제 리소스 생성 부분이다.

2-1) vpc 생성 및 서브넷 정의

먼저 가상 프라이빗 클라우드 VPC를 생성하고 할당할 서브넷을 미리 생성한다.
사전에 그려둔 아키텍처에 맞춰 IP 범위를 설정해두었다.

REM --- VPC 생성 ---
gcloud compute networks create %NETWORK% ^
  --subnet-mode=custom ^
  --project=%HOST_PROJECT%

REM --- Subnet + Secondary Range 생성 ---
gcloud compute networks subnets create %SUBNET% ^
  --project=%HOST_PROJECT% ^
  --region=%REGION% ^
  --network=%NETWORK% ^
  --range=10.10.0.0/24 ^
  --secondary-range=%PODS_RANGE_NAME%=10.20.0.0/16,%SVCS_RANGE_NAME%=10.30.0.0/20

2-2) Private Google Access 활성화

프라이빗 내부에서 구글 API를 사용하기 위해서는 Private Google Access를 활성화 해야한다. 관련 링크

REM --- Private Google Access 활성화 ---
gcloud compute networks subnets update %SUBNET% ^
  --project=%HOST_PROJECT% ^
  --region=%REGION% ^
  --enable-private-ip-google-access

2-3) Cloud Router & NAT 설정

퍼블릭 네트워크 접속(패키지 다운로드나 구글 API 접속…)을 위해서는 라우터/주소변환(NAT)이 필요하다.

REM --- Cloud Router / NAT ---
gcloud compute routers create cr-seoul ^
  --project=%HOST_PROJECT% ^
  --region=%REGION% ^
  --network=%NETWORK%

gcloud compute routers nats create nat-seoul ^
  --project=%HOST_PROJECT% ^
  --region=%REGION% ^
  --router=cr-seoul ^
  --nat-all-subnet-ip-ranges ^
  --auto-allocate-nat-external-ips ^
  --enable-logging

2-4) Firewall Rules 작성

이에 맞춰 방화벽 규칙도 작성한다.
우선 ssh 허용 규칙과 외부로 나가는 규칙은 전체 허용했다. (사실 그럼 안됨.. 외부 허용 못하게 보안 설정 해둬야 했는데 첫 세팅 때는 이렇게 했다.)

REM --- FW: IAP SSH 허용 ---
gcloud compute firewall-rules create fw-allow-iap-ssh-dev ^
  --project=%HOST_PROJECT% ^
  --network=%NETWORK% ^
  --direction=INGRESS ^
  --priority=1000 ^
  --action=ALLOW ^
  --rules=tcp:22 ^
  --source-ranges=35.235.240.0/20 ^
  --target-tags=allow-iap-ssh

REM --- FW: 초기 Egress 허용 (임시) ---
gcloud compute firewall-rules create fw-egress-any-dev ^
  --project=%HOST_PROJECT% ^
  --network=%NETWORK% ^
  --direction=EGRESS ^
  --priority=65534 ^
  --action=ALLOW ^
  --rules=tcp,udp,icmp ^
  --destination-ranges=0.0.0.0/0 ^
  --enable-logging

2-5) Shared VPC 연결

마지막으로 Shared VPC를 연결하고 네트워크 설정이 되었는지 확인한다.

REM --- Shared VPC 연결 ---
gcloud compute shared-vpc enable %HOST_PROJECT%
gcloud compute shared-vpc associated-projects add %SVC_PROJECT% --host-project=%HOST_PROJECT%

REM --- 검증 ---
gcloud compute networks describe %NETWORK% --project=%HOST_PROJECT%
gcloud compute networks subnets describe %SUBNET% --region=%REGION% --project=%HOST_PROJECT%
gcloud compute routers describe cr-seoul --region=%REGION% --project=%HOST_PROJECT%
gcloud compute firewall-rules list --project=%HOST_PROJECT%

3) IAM 바인딩

이 섹션에서는 서비스 어카운트(Service Account)를 생성하고 권한을 부여한다.
서비스 어카운트는 사람이 아닌 애플리케이션이나 코드가 GCP 리소스에 접근할 때 사용하는 비인간 계정이다.

3-1) 사전 설정된 그룹 권한 요약

섹션 1에서 이미 설정한 사람 그룹(Google Groups) 권한은 다음과 같다:

  • kickoff-infra-admin 그룹: Host 프로젝트에 compute.networkAdmin (네트워크 관리자)
  • kickoff-service-dev 그룹: Service 프로젝트에 compute.instanceAdmin.v1, Host/Subnet에 compute.networkUser (개발자)

3-2) 서비스 프로젝트 번호 조회

서비스 어카운트 생성에 필요한 프로젝트 번호를 조회한다.

REM --- 서비스 프로젝트 번호 조회 (SVC_PROJECT_NUMBER 할당) ---
for /f "tokens=*" %%i in ('gcloud projects describe %SVC_PROJECT% --format^="value(projectNumber)"') do set SVC_PROJECT_NUMBER=%%i

3-3) 배포용 서비스 어카운트 생성

애플리케이션 배포 시 사용할 서비스 어카운트를 생성한다.
서비스 어카운트는 애플리케이션이 GCP 리소스에 접근할 때 사용하는 계정이다.

REM --- 배포용 서비스 어카운트 생성 (재실행 안전: || true) ---
set SA_DEPLOY=sa-deploy-dev

gcloud iam service-accounts create %SA_DEPLOY% ^
  --project=%SVC_PROJECT% ^
  --display-name="Deploy SA" || true

3-4) 배포용 SA에 Host VPC 사용 권한 부여

Shared VPC(Host 프로젝트)를 사용하려면 이 권한이 필요하다.

REM --- 배포용 SA에 Host VPC 사용 권한 부여 ---
gcloud projects add-iam-policy-binding %HOST_PROJECT% ^
  --member=serviceAccount:%SA_DEPLOY%@%SVC_PROJECT%.iam.gserviceaccount.com ^
  --role=roles/compute.networkUser

3-5) 배포용 SA에 Service 프로젝트 최소 권한 부여

로깅, 모니터링, Artifact Registry 읽기 등 애플리케이션 실행에 필요한 최소 권한을 부여한다.

REM --- 배포용 SA에 Service 프로젝트 최소 권한 부여 ---
for %%R in (
  roles/logging.logWriter
  roles/monitoring.metricWriter
  roles/artifactregistry.reader
) do (
  gcloud projects add-iam-policy-binding %SVC_PROJECT% ^
    --member=serviceAccount:%SA_DEPLOY%@%SVC_PROJECT%.iam.gserviceaccount.com ^
    --role=%%R
)

3-6) (선택) GKE SA에 Host VPC 사용 권한 부여

GKE 클러스터가 Shared VPC를 사용하려면 자동 생성된 서비스 어카운트에도 권한이 필요하다.
주의: GKE 생성 후 SA를 확인한 다음 실행해야 한다.

REM --- GKE SA에 Host VPC 사용 권한 부여 ---
REM ※ GKE 생성 후 robot SA 확인 필요
REM gcloud projects add-iam-policy-binding %HOST_PROJECT% ^
REM   --member=serviceAccount:%GKE_ROBOT_SA%@%HOST_PROJECT%.iam.gserviceaccount.com ^
REM   --role=roles/compute.networkUser

3-7) kickoff-service-dev 그룹이 배포용 SA 사용 권한 부여

그룹이 서비스 어카운트를 사용할 수 있도록 권한을 부여한다.
개발자가 배포 작업 시 이 서비스 어카운트의 권한을 빌려서 사용할 수 있게 된다.

REM --- kickoff-service-dev 그룹이 배포용 SA를 사용할 수 있도록 권한 부여 ---
gcloud iam service-accounts add-iam-policy-binding %SA_DEPLOY%@%SVC_PROJECT%.iam.gserviceaccount.com ^
  --member=group:kickoff-service-dev@%DOMAIN% ^
  --role=roles/iam.serviceAccountUser ^
  --project=%SVC_PROJECT%

3-8) IAP SSH 접속 권한 추가

Identity-Aware Proxy를 통한 SSH 접속을 위해 사람 그룹에 권한을 부여한다.
이는 서비스 어카운트가 아닌 그룹에 대한 프로젝트 레벨 권한 설정이다.

REM --- SVC_PROJECT 권한 추가 (IAP SSH 접속 허용) ---
gcloud projects add-iam-policy-binding %SVC_PROJECT% ^
  --member=group:kickoff-service-dev@%DOMAIN% ^
  --role=roles/iap.tunnelResourceAccessor

3-9) 검증

설정이 올바르게 적용되었는지 확인한다.

REM --- 검증 ---
gcloud iam service-accounts list --project=%SVC_PROJECT%
gcloud projects get-iam-policy %HOST_PROJECT%
gcloud projects get-iam-policy %SVC_PROJECT%

이번 글에서는 앞서 정리했던 체크리스트 중 0) 프로젝트 생성 및 기본 설정부터 3) IAM 바인딩까지의 실습을 실제로 진행한 결과와, 진행하며 사용했던 주요 스크립트, 체크포인트를 중심으로 공유했다.

해당 과정을 따라가며 Host/Service 프로젝트 분리, 기본 VPC/방화벽 삭제, 그룹 단위 IAM 역할 부여, 그리고 핵심 리소스 연결을 단계적으로 구축할 수 있었다. 실제 엔터프라이즈 환경에서 요구되는 보안 및 거버넌스 요구사항을 반영하는 데에도 초점을 두었다.

이후 리소스 생성에 대한 부분으로 이어서 자세하게 정리할 예정이다. 끝!

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.