1. 개요
이 실습에서는 직원이 Cymbal Eats 앱에서 주문을 보고, 업데이트하고, 삭제할 수 있는 직원 포털을 배포합니다. 가상 사설망 (VPN)을 사용하지 않고 포털 액세스를 보호하기 위해 IAP (Identity-Aware Proxy)를 사용합니다. IAP는 제로 트러스트 액세스 모델 구현을 간소화하며, 앱 액세스를 관리할 수 있는 단일 제어 지점을 제공하므로 온프레미스와 클라우드 환경 모두에서 원격 작업자가 VPN보다 시간이 덜 걸립니다.
IAP(Identity-Aware Proxy)란?
IAP (Identity-Aware Proxy)는 애플리케이션에 전송되는 요청을 가로채고, Google Identity Service를 사용하여 요청하는 사용자를 인증하고, 애플리케이션에 액세스하도록 승인된 사용자로부터 요청이 들어오는 경우에만 허용하는 Google Cloud 서비스입니다. 또한 인증된 사용자에 대한 정보를 포함하도록 요청 headers를 수정할 수 있습니다.
학습할 내용
- 서버리스 네트워크 엔드포인트 그룹 (NEG)을 구성하는 방법
- 부하 분산기를 구성하는 방법
- IAP를 사용 설정하여 액세스를 제한하는 방법
- IAP를 사용하여 액세스를 제한하는 방법
2. 설정 및 요구사항
자습형 환경 설정
- Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.
- 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔이 고유한 문자열을 자동으로 생성합니다. 보통은 그게 뭔지 상관하지 않습니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로
PROJECT_ID
로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 무작위로 다른 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다. - 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
- 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스를 삭제하거나 전체 프로젝트를 삭제하면 됩니다. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.
환경 설정
- 프로젝트 및 리소스 관련 환경 변수 만들기
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export ORDER_SERVICE_URL=order-service
export INVENTORY_SERVICE_URL=inventory-service
export MENU_SERVICE_URL=menu-service
- IAP 및 Cloud Resource Manager 서비스 API 사용 설정
gcloud services enable \
iap.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudidentity.googleapis.com \
compute.googleapis.com
- 샘플 앱 저장소를 클론하고 디렉터리로 이동합니다.
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
- 설정 스크립트를 사용하여 직원 포털을 배포합니다. 스크립트가 완료될 때까지 기다렸다가 다음 단계로 이동하세요.
./setup.sh
출력 예
... Done. Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic. Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
- 서비스 URL 링크를 클릭합니다.
3. 서버리스 네트워크 엔드포인트 그룹 (NEG) 구성
직원 UI Cloud Run 서비스를 위한 서버리스 네트워크 엔드포인트 그룹( 서버리스 NEG)을 만듭니다. 서버리스 NEG를 사용하면 외부 HTTP(S) 부하 분산과 함께 Google Cloud 서버리스 앱을 사용할 수 있습니다.
- 직원 UI 서비스의 네트워크 엔드포인트 그룹을 만듭니다.
gcloud compute network-endpoint-groups create employee-ui-iap-neg \
--project $PROJECT_ID \
--region=$REGION \
--network-endpoint-type=serverless \
--cloud-run-service=employee-ui-service
출력 예시
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/regions/us-east1/networkEndpointGroups/employee-ui-iap-neg]. Created network endpoint group [employee-ui-iap-neg].
백엔드 서비스 만들기 및 서버리스 NEG 추가
백엔드 서비스는 Cloud Load Balancing이 트래픽을 분산하는 방법을 정의합니다. 백엔드 서비스 구성에는 백엔드에 연결하는 데 사용되는 프로토콜, 다양한 배포 및 세션 설정, 상태 확인, 제한 시간 등의 다양한 값 집합이 포함됩니다. 이 설정을 통해 부하 분산기의 동작을 세밀하게 제어할 수 있습니다.
- 백엔드 서비스 만들기
gcloud compute backend-services create employee-ui-iap-backend \
--global
출력 예시
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend]. NAME: employee-ui-iap-backend BACKENDS: PROTOCOL: HTTP
- 서버리스 NEG를 백엔드 서비스에 백엔드로 추가
gcloud compute backend-services add-backend employee-ui-iap-backend \
--global \
--network-endpoint-group=employee-ui-iap-neg \
--network-endpoint-group-region=$REGION
출력 예시
Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
- 수신되는 요청을 백엔드 서비스로 라우팅하는 URL 맵 만들기
gcloud compute url-maps create employee-ui-iap-url-map \
--default-service employee-ui-iap-backend
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/urlMaps/employee-ui-iap-url-map]. NAME: employee-ui-iap-url-map DEFAULT_SERVICE: backendServices/employee-ui-iap-backend
4. 부하 분산기 구성요소 구성
다음 다이어그램은 부하 분산기가 서버리스 NEG 백엔드를 사용하여 서버리스 Cloud Run 서비스로 요청을 전달하는 방법을 보여줍니다.
고정 IP 주소 예약
- 고정 IPv4 주소 예약 및 도메인 저장
gcloud compute addresses create employee-ui-iap-ip \
--network-tier=PREMIUM \
--ip-version=IPV4 \
--global
출력 예시
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/addresses/employee-ui-iap-ip].
- nip.io 도메인 저장
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io
Google 관리 SSL 인증서 리소스 만들기
- Google 관리 SSL 인증서 리소스 만들기
gcloud compute ssl-certificates create employee-ui-iap-cert \
--description=employee-ui-iap-cert \
--domains=$DOMAIN \
--global
출력 예시
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/sslCertificates/employee-ui-iap-cert]. NAME: employee-ui-iap-cert TYPE: MANAGED CREATION_TIMESTAMP: 2022-04-18T06:39:37.474-07:00 EXPIRE_TIME: MANAGED_STATUS: PROVISIONING 34.102.234.98.nip.io: PROVISIONING
대상 HTTPS 프록시 만들기
- 대상 HTTPS 프록시를 만들어 URL 맵에 요청을 라우팅합니다.
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
--ssl-certificates employee-ui-iap-cert \
--url-map employee-ui-iap-url-map
출력 예시
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/targetHttpsProxies/employee-ui-iap-http-proxy]. NAME: employee-ui-iap-http-proxy SSL_CERTIFICATES: employee-ui-iap-cert URL_MAP: employee-ui-iap-url-map CERTIFICATE_MAP:
전달 규칙 구성
- 수신 요청을 프록시로 라우팅하는 전달 규칙 만들기
gcloud compute forwarding-rules create employee-ui-iap-forwarding-rule \
--load-balancing-scheme=EXTERNAL \
--network-tier=PREMIUM \
--address=employee-ui-iap-ip \
--global \
--ports=443 \
--target-https-proxy employee-ui-iap-http-proxy
출력 예
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/forwardingRules/employee-ui-iap-forwarding-rule].
Cloud Run 서비스로 인그레스 제한
HTTP(S) 부하 분산을 통해 들어오는 내부 요청 및 요청만 허용하도록 인그레스 트래픽을 제한합니다.
- HTTP(S) 부하 분산기를 통한 내부 요청 및 요청에서 인그레스 트래픽만 허용하도록 서비스 업데이트
gcloud run services update employee-ui-service \
--ingress internal-and-cloud-load-balancing \
--region $REGION
출력 예
OK Deploying... Done. OK Creating Revision... OK Routing traffic... Done. Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic. Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
- 서비스 URL 링크를 클릭합니다.
이제 Cloud Run 서비스 URL에 대한 액세스가 금지된 것으로 표시됩니다.
5. 부하 분산기에서 Cloud IAP (Identity-Aware Proxy) 사용 설정
IAP를 사용하면 HTTPS로 액세스되는 애플리케이션에 대해 중앙 승인 레이어를 설정할 수 있습니다. 네트워크 수준의 방화벽 대신 애플리케이션 수준의 액세스 제어 모델을 사용할 수 있습니다.
OAuth 동의 화면 구성
브랜드는 사용자를 위한 브랜드 정보가 포함된 OAuth 동의 화면입니다. 브랜드는 내부 또는 공개 사용자로 제한될 수 있습니다. 내부 브랜드를 사용하면 프로젝트와 동일한 Google Workspace 조직의 구성원이 OAuth 흐름에 액세스할 수 있습니다. 공개 브랜드를 사용하면 인터넷에 액세스할 수 있는 모든 사용자가 OAuth 흐름에 액세스할 수 있습니다.
- 브랜드 만들기
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")
gcloud alpha iap oauth-brands create \
--application_title="Cymbal Eats" \
--support_email=$USER_EMAIL
출력 예시
Created [462858740426]. applicationTitle: Cymbal Eats name: projects/462858740426/brands/462858740426 orgInternalOnly: true
IAP OAuth 클라이언트 만들기
- 이전 단계의 브랜드 이름을 사용하여 고객 만들기
gcloud alpha iap oauth-clients create \
projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
--display_name=cymbal-eats-employee-ui
출력 예시
Created [462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com]. displayName: cymbal-eats-employee-ui name: projects/462858740426/brands/462858740426/identityAwareProxyClients/462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com secret: [secret-removed]
- 클라이언트 이름, ID, 보안 비밀 저장
export CLIENT_NAME=$(gcloud alpha iap oauth-clients list \
projects/$PROJECT_NUMBER/brands/$PROJECT_NUMBER --format='value(name)' \
--filter="displayName:cymbal-eats-employee-ui")
export CLIENT_ID=${CLIENT_NAME##*/}
export CLIENT_SECRET=$(gcloud alpha iap oauth-clients describe $CLIENT_NAME --format='value(secret)')
- Cloud 콘솔의 드롭다운 프로젝트 선택 메뉴에서 프로젝트를 선택합니다.
- Cloud 콘솔에서 OAuth 동의 화면으로 이동합니다.
- 사용자 유형에서 '외부로 만들기'를 클릭합니다.
- 게시 상태로 '테스트' 선택
- '확인'을 클릭합니다.
6. IAP로 액세스 제한
IAP를 사용하여 백엔드 서비스에 대한 액세스를 제한한 다음 애플리케이션에 액세스할 수 없는지 확인합니다.
- 백엔드 서비스에서 IAP 사용 설정
gcloud iap web enable --resource-type=backend-services \
--oauth2-client-id=$CLIENT_ID \
--oauth2-client-secret=$CLIENT_SECRET \
--service=employee-ui-iap-backend
IAP 구성 확인
- SSL 인증서가 활성 상태인지 확인
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
- 서비스 URL 가져오기
echo https://$DOMAIN
출력 예
https://34.102.234.98.nip.io
- 서비스 URL을 클릭하여 직원 포털을 엽니다.
- 실습 사용자 인증 정보를 사용해 로그인합니다.
- 브라우저 닫기
직원 포털에 대한 사용자 액세스 권한 부여
- 이전 단계에서 만든 사용자를 위해
'roles/iap.httpsResourceAccessor'
역할에 IAM 정책 바인딩을 추가합니다.
gcloud iap web add-iam-policy-binding \
--resource-type=backend-services \
--service=employee-ui-iap-backend \
--member=user:$USER_EMAIL \
--role='roles/iap.httpsResourceAccessor'
출력 예
Updated IAM policy for backend service [projects/462858740426/iap_web/compute/services/employee-ui-iap-backend].
서비스 액세스 테스트
직원 포털에 대한 액세스 권한이 부여되었는지 확인
- 서비스 URL 가져오기
echo https://$DOMAIN
출력 예
https://34.102.234.98.nip.io
- 서비스 URL을 클릭하여 직원 포털을 엽니다.
이제 직원 포털에 액세스할 수 있습니다.
(선택사항) 모든 종속 항목을 배포합니다. 마이크로서비스를 배포하는 데 최대 20분이 걸릴 수 있습니다.
unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL
cd ~/cymbal-eats
./setup.sh
./get-site-urls.sh
7. 축하합니다.
축하합니다. Codelab을 완료했습니다.
다음 단계:
다른 Cymbal Eats Codelab 살펴보기:
- Eventarc로 Cloud Workflows 트리거
- Cloud Storage에서 이벤트 처리 트리거
- Cloud Run에서 Private CloudSQL에 연결
- Cloud Run에서 완전 관리형 데이터베이스에 연결
- Cloud Scheduler로 Cloud Run 작업 트리거
- Cloud Run에 안전하게 배포
- Cloud Run 인그레스 트래픽 보호
- GKE Autopilot에서 비공개 AlloyDB에 연결
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.