[Google Skills] 서비스 계정과 IAM 역할 설정하기


작업 1. Gemini 사용 설정 및 살펴보기 (선택)

패스

작업 2. gcloud CLI로 서비스 계정 만들기

# 1. gcloud 인증
gcloud auth login --no-launch-browser   # 문서 기본은 --no-browser. 시크릿 창이 아니라 일반 브라우저로 가서 이걸로 함. URL 열고 인증코드 붙여넣기

# 2. lab-vm SSH 접속 후 환경 확인
gcloud compute ssh lab-vm --zone=us-east1-c
gcloud config list   # account는 VM 기본 서비스 계정

# 3. devops 서비스 계정 만들기
gcloud iam service-accounts create devops \
    --display-name="DevOps Service Account" \
    --description="DevOps 작업을 위한 서비스 계정"   # 이메일은 devops@{PROJECT_ID}.iam.gserviceaccount.com

작업 3. gcloud CLI로 서비스 계정에 IAM 권한 부여

# 1. 프로젝트 ID 저장
export PROJECT_ID=$(gcloud config get-value project)

# 2. devops 서비스 계정 이메일 저장
export SA="devops@${PROJECT_ID}.iam.gserviceaccount.com"

# 3. IAM 역할 부여
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:$SA" \
    --role="roles/iam.serviceAccountUser"   # Service Account User. 다른 SA로 actAs

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:$SA" \
    --role="roles/compute.instanceAdmin"   # Compute Instance Admin. VM 생성/수정/삭제

작업 4. 서비스 계정이 연결된 컴퓨팅 인스턴스 만들기

# 1. devops SA를 붙인 vm-2 만들기
# lab-vm SSH에서 $PROJECT_ID, $SA 유지. zone은 us-east1-c
gcloud compute instances create vm-2 \
    --service-account="$SA" \
    --scopes="cloud-platform" \
    --zone=us-east1-c   # cloud-platform = API 접근 범위 전체

# 2. vm-2 SSH 접속
gcloud compute ssh vm-2 --zone=us-east1-c   # 여기부터 devops 자격 증명

# 3. 권한 확인
gcloud compute instances list   # lab-vm, vm-2 보이면 instanceAdmin 조회 권한 OK

작업 5. YAML로 커스텀 역할 만들기

# 1. role-definition.yaml 만들기
export PROJECT_ID=$(gcloud config get-value project)   # 세션에 없으면. lab-vm에서 실행

cat <<EOF > role-definition.yaml
title: "Custom SQL Role"
description: "Allows connecting and getting Cloud SQL instances"
stage: "GA"
includedPermissions:
- cloudsql.instances.connect
- cloudsql.instances.get
EOF   # 역할 ID는 아래 CustomSqlRole

# 2. YAML로 커스텀 역할 만들기
gcloud iam roles create CustomSqlRole \
    --project=$PROJECT_ID \
    --file=role-definition.yaml   # 프로젝트 수준 커스텀 역할 생성

# 3. 채점용으로 홈 디렉터리에 복사
# 채점이 파일 위치/소유권을 봄. student-01-..., sa_... 는 랩마다 다름. ls /home 하고 맞추기
sudo cp ~/role-definition.yaml /home/student-01-98f6829d5332/role-definition.yaml 2>/dev/null || true
sudo cp ~/role-definition.yaml /home/sa_100279010484714384218/role-definition.yaml 2>/dev/null || true
sudo chmod 644 /home/student-01-98f6829d5332/role-definition.yaml 2>/dev/null || true
sudo chmod 644 /home/sa_100279010484714384218/role-definition.yaml 2>/dev/null || true

작업 6. 서비스 계정으로 BigQuery 액세스

# 1. bigquery-qwiklab 서비스 계정 만들고 역할 부여
export PROJECT_ID=$(gcloud config get-value project)
export BQ_SA="bigquery-qwiklab@${PROJECT_ID}.iam.gserviceaccount.com"

gcloud iam service-accounts create bigquery-qwiklab \
    --display-name="BigQuery Qwiklab Service Account"

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:$BQ_SA" \
    --role="roles/bigquery.user"   # BigQuery 사용자

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:$BQ_SA" \
    --role="roles/bigquery.dataViewer"   # BigQuery 데이터 뷰어

# 2. bigquery-instance VM 만들기
gcloud compute instances create bigquery-instance \
    --service-account="$BQ_SA" \
    --scopes="cloud-platform" \
    --zone=us-east1-c   # bigquery-qwiklab SA를 붙인 VM

# 3. SSH 접속 후 패키지 설치
gcloud compute ssh bigquery-instance --zone=us-east1-c   # 키 질문 나오면 Y, 엔터 연타
sudo apt-get update && sudo apt-get install -y python3-pip
pip3 install google-cloud-bigquery pandas db-dtypes --break-system-packages

# 4. query.py 만들고 실행
export PROJECT_ID=$(gcloud config get-value project)
export BQ_SA="bigquery-qwiklab@${PROJECT_ID}.iam.gserviceaccount.com"

echo "
from google.auth import compute_engine
from google.cloud import bigquery
credentials = compute_engine.Credentials(
    service_account_email='${BQ_SA}')
query = '''
SELECT name, SUM(number) as total_people
FROM \`bigquery-public-data.usa_names.usa_1910_2013\`
WHERE state = 'TX'
GROUP BY name, state
ORDER BY total_people DESC
LIMIT 20
'''
client = bigquery.Client(
    project='${PROJECT_ID}',
    credentials=credentials)
print(client.query(query).to_dataframe())
" > query.py   # 테이블명은 echo 깨지지 않게 백틱

python3 query.py

Author: Ruby Kim
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Ruby Kim !
Comments
 Previous
Next 
  TOC