1. 소개
이 문서에서는 AgentSpace에 액세스하도록 맞춤 도메인을 구성하기 위한 참조 아키텍처를 제공합니다. 사용자는 Agentspace 앱 생성 중에 할당된 Google 관리 URL 대신 맞춤 도메인을 활용할 수 있습니다. 이 Codelab에서는 nip.io 도메인을 사용하여 Agentspace 캘린더 및 Drive 애플리케이션에 액세스하는 방법을 보여줍니다. nip.io는 모든 IP 주소에 와일드 카드 DNS를 제공하는 무료 오픈소스 서비스입니다. 기본적으로 자체 DNS 서버를 설정하거나 /etc/hosts 파일을 수정하지 않고도 특정 IP 주소로 확인되는 호스트 이름을 만들 수 있습니다.
자체 도메인을 사용하는 것이 좋지만, 이 튜토리얼에서는 데모 목적으로 nip.io를 사용합니다.
아래에 묘사된 배포 시나리오 (그림 1)에서 AgentSpace는 공개 Google 관리 URL을 통해 액세스되는 Calendar 애플리케이션이 포함된 데이터 스토어를 게시했습니다.
그림 1
데이터 스토어와 후속 애플리케이션이 계속 증가하면 아래의 배포 시나리오(그림 2)에 표시된 대로 Google에서 관리하는 공개 URL을 추가로 관리하게 되며, 그 결과 Agentspace 애플리케이션과 URL이 1:1로 매핑됩니다.
그림 2.
커스텀 도메인을 사용하면 다양한 AgentSpace 애플리케이션을 사용자가 지정한 단일 고객 도메인에 매핑할 수 있습니다. 이 기능을 사용하면 특정 URL 경로를 각 Agentspace 애플리케이션과 연결할 수 있으므로 아래 배포 시나리오(그림 3)에 표시된 대로 더 큰 유연성을 제공할 수 있습니다. 예를 들어 고객이 관리하는 도메인 agentspace.cosmopup.com은 경로 규칙으로 분할되며, 각 경로 규칙은 특정 Agentspace 애플리케이션에 매핑됩니다. 예를 들면 다음과 같습니다.
- Workspace Drive의 Agentspace 애플리케이션에 매핑되는 agentspace.cosmopup.com/drive-app
- Workspace Calendar의 Agentspace 애플리케이션에 매핑되는 agentspace.cosmopup.com/calendar-app
URL 맵을 통해 구성된 외부 애플리케이션 부하 분산기의 호스트 및 경로 규칙은 커스텀 도메인을 Google 관리 URL에 매핑하는 로직을 제어합니다. agentspace.cosmopup.com/drive-app 예시를 사용하여 다음 함수를 실행합니다.
- 커스텀 도메인 호스트 경로 agentspace.cosmopup.com/drive-app이 부하 분산기에서 수신됨
- URL 맵이 고급 호스트 및 경로 규칙 일치에 맞게 구성됨
- 호스트 agentspace.cosmopup.com은 경로 일치 및 재작성을 사용할 수 있습니다.
- 커스텀 도메인 호스트 경로 agentspace.cosmopup.com/drive-app에 UrlRewrite가 적용됨
- PathPrefixRewrite는 Agentspace 경로(/us/home/cid/5970a1b4-080a-4b44-8acd-fa89460cf0cd)입니다.
- hostRewrite는 Agentspace 호스트(vertexaisearch.cloud.google.com)입니다.
- 백엔드 서비스로 라우팅하기 전에 재작성 작업이 실행됨
- 백엔드 서비스가 Agentspace URL을 기반으로 트래픽을 Drive 앱 애플리케이션으로 라우팅합니다.
그림 3
학습할 내용
- 전역 외부 애플리케이션 부하 분산기 만들기
- 커스텀 도메인을 활용하는 백엔드 서비스 재작성 만들기 및 Agentspace 애플리케이션에 대한 재작성 작업
- nip.io와 Cloud DNS를 통합하여 커스텀 도메인을 만드는 방법
- Agentspace 맞춤 도메인에 대한 액세스 권한을 확인하는 방법
필요한 항목
- 소유자 권한이 있는 Google Cloud 프로젝트
- 기존 Agentspace 애플리케이션 URL
- 자체 소유자 맞춤 도메인 (선택사항)
- 인증서 - 자체 서명 또는 Google 관리
2. 빌드할 항목
고급 트래픽 관리 기능이 있는 전역 외부 애플리케이션 부하 분산기를 설정하여 호스트 및 경로 재작성을 사용하는 Agentspace 애플리케이션의 맞춤 도메인 경로 일치를 사용 설정합니다. 배포가 완료되면 다음 작업을 실행하여 Agentspace 애플리케이션에 대한 액세스 권한을 확인합니다.
- 웹브라우저를 열고 맞춤 도메인 및 지정된 경로로 이동하여 Agentspace 애플리케이션에 액세스합니다.
3. 네트워크 요구사항
다음은 네트워크 요구사항의 세부정보입니다.
구성요소 | 설명 |
VPC (agentspace-vpc) | 커스텀 모드 VPC |
인터넷 NEG | Agentspace Google 관리 FQDN (vertexaisearch.cloud.google.com)을 나타내는 FQDN으로 구성된 부하 분산기의 외부 백엔드를 정의하는 데 사용되는 리소스입니다. 인터넷 FQDN은 VPC 내에서 DNS 조회를 실행하여 확인합니다. |
백엔드 서비스 | 백엔드 서비스는 부하 분산기와 백엔드 리소스 간의 다리 역할을 합니다. 이 튜토리얼에서는 백엔드 서비스가 인터넷 NEG와 연결됩니다. |
인증서 | Google Cloud에서 애플리케이션 부하 분산기의 인증서를 구성하려면 인증서 관리자 서비스와 Google 관리형 또는 자체 관리형 SSL 인증서를 사용합니다. |
Cloud DNS | Cloud DNS 공개 영역은 외부 애플리케이션 부하 분산기 외부 IP를 nip.io (agentspace.externalip.nip.io)로 확인하는 데 사용됩니다. 또는 맞춤 도메인과 부하 분산기의 IP 주소로 구성된 A 레코드를 사용합니다. |
4. Codelab 토폴로지
5. 설정 및 요구사항
자습형 환경 설정
- 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달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.
Cloud Shell 시작
Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.
Google Cloud Console의 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.
환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.
가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab의 모든 작업은 브라우저 내에서 수행할 수 있습니다. 아무것도 설치할 필요가 없습니다.
6. 시작하기 전에
API 사용 설정
Cloud Shell 내에서 프로젝트 ID가 설정되어 있는지 확인합니다.
gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
project=[YOUR-PROJECT-ID]
region=[YOUR-REGION]
echo $project
echo $region
필요한 모든 서비스를 사용 설정합니다.
gcloud services enable compute.googleapis.com
gcloud services enable dns.googleapis.com
7. VPC 네트워크 만들기
VPC 네트워크
Cloud Shell에서 다음을 실행합니다.
gcloud compute networks create agentspace-vpc --subnet-mode custom
8. 부하 분산기 구성요소 설정
부하 분산기의 외부 IP 주소 예약
Cloud Shell에서 부하 분산기의 외부 IP 주소를 예약합니다.
gcloud compute addresses create external-ip \
--network-tier=PREMIUM \
--ip-version=IPV4 \
--global
Cloud Shell에서 예약된 IP 주소를 확인합니다.
gcloud compute addresses describe external-ip \
--global | grep -i address:
출력 예시:
user@cloudshell$ gcloud compute addresses describe external-ip \
--global | grep -i address:
address: 34.54.158.206
인터넷 NEG 설정
인터넷 NEG를 만들고 –network-endpoint-type을 internet-fqdn-port (외부 백엔드에 연결할 수 있는 호스트 이름 및 포트)로 설정합니다. Agentspace를 확인하기 위해 FQDN vertexaisearch.cloud.google.com 및 포트 443이 사용됩니다.
gcloud compute network-endpoint-groups create agentspace-ineg \
--network-endpoint-type="internet-fqdn-port" \
--global
gcloud compute network-endpoint-groups update agentspace-ineg \
--add-endpoint="fqdn=vertexaisearch.cloud.google.com,port=443" \
--global
부하 분산기 만들기
Cloud Shell에서 다음을 실행합니다.
gcloud compute backend-services create agentspace-ineg-bes \
--load-balancing-scheme=EXTERNAL_MANAGED \
--protocol=HTTPS \
--global
gcloud compute backend-services add-backend agentspace-ineg-bes \
--network-endpoint-group=agentspace-ineg \
--global-network-endpoint-group \
--global
인증서 만들기
이제 인터넷 NEG와 백엔드 서비스를 만들었습니다. 다음 섹션에서는 HTTPs 대상 프록시에서 사용할 인증서 리소스를 만들어야 합니다. Google 관리형 SSL 인증서 또는 자체 관리형 SSL 인증서를 사용하여 SSL 인증서 리소스를 만들 수 있습니다. Google Cloud는 이러한 인증서를 자동으로 가져오고 관리 및 갱신하므로 Google 관리형 인증서를 사용하는 것이 좋습니다.
이 튜토리얼에서 사용되는 전역 외부 애플리케이션 부하 분산기에서 지원되는 인증서에 대한 자세한 내용은 다음을 참고하세요.
SSL 인증서 개요 | 부하 분산 | Google Cloud
다음 섹션에서는 일반 이름을 정규화된 도메인 이름(agentspace.YOUR-EXTERNAL-IP.nip.io)에 매핑해야 하는 자체 서명된 인증서를 만듭니다(Google 관리 인증서를 대신 사용할 수 있음). 이 인증서는 이전에 생성된 부하 분산기의 외부 IP 주소에 해당합니다(아래 예 참고).
일반 이름: agentspace.34.54.158.206.nip.io
Cloud Shell에서 비공개 키 만들기
openssl genrsa -out private-key-file.pem 2048
Cloud Shell 내에서 pem 파일을 생성하는 데 사용되는 config.txt 파일을 만듭니다. 아래 구성에서 DNS 1 항목 agentspace.YOUR-EXTERNAL-IP.nip.io(예: agentspace.34.54.158.206.nip.io)에 정규화된 도메인 이름을 지정합니다.
cat <<'EOF' >config.txt
[req]
default_bits = 2048
req_extensions = extension_requirements
distinguished_name = dn_requirements
[extension_requirements]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @sans_list
[dn_requirements]
countryName = Country Name (2 letter code)
stateOrProvinceName = State or Province Name (full name)
localityName = Locality Name (eg, city)
organizationName = Organization Name (eg, company)
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (e.g. server FQDN or YOUR name)
emailAddress = Email Address
[sans_list]
DNS.1 = agentspace.YOUR-EXTERNAL-IP.nip.io
EOF
Cloud Shell 내에서 config.txt 및 private-key-file.pem이 생성되었는지 확인합니다.
user@cloudshell:$ ls
config.txt private-key-file.pem
Cloud Shell에서 다음을 실행합니다.
sudo openssl req -new -key private-key-file.pem \
-out csr.pem \
-config config.txt
예:
user@cloudshell:$ sudo openssl req -new -key private-key-file.pem \
-out csr.pem \
-config config.txt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name)[]:agentspace.34.54.158.206.nip.io
Email Address []:
Cloud Shell 내에서 필요한 인증서 서명 pem 생성을 확인합니다.
user@cloudshell:$ ls
config.txt csr.pem private-key-file.pem
Cloud Shell에서 인증서를 생성합니다.
sudo openssl x509 -req \
-signkey private-key-file.pem \
-in csr.pem \
-out cert.cert \
-extfile config.txt \
-extensions extension_requirements \
-days 365
명령어 결과
user@cloudshell:$ sudo openssl x509 -req \
-signkey private-key-file.pem \
-in csr.pem \
-out cert.cert \
-extfile config.txt \
-extensions extension_requirements \
-days 365
Certificate request self-signature ok
subject=CN = agentspace.34.54.158.206.nip.io
Cloud Shell에서 cert.cert 파일 생성을 확인합니다.
user@cloudshell:$ ls
cert.cert config.txt csr.pem private-key-file.pem
외부 부하 분산기와 연결할 인증서 리소스를 만듭니다. certificate 및 private-key 매개변수를 특정 파일 이름으로 바꿉니다.
Cloud Shell에서 다음을 실행합니다.
gcloud compute ssl-certificates create agentspace-self-signed-cert \
--certificate=cert.cert \
--private-key=private-key-file.pem \
--global
Cloud Shell에서 다음을 실행합니다.
gcloud compute url-maps create agentspace-lb \
--default-service=agentspace-ineg-bes \
--global
Cloud Shell에서 다음을 실행합니다.
gcloud compute target-https-proxies create https-proxy \
--ssl-certificates=agentspace-self-signed-cert \
--url-map=agentspace-lb \
--global
Cloud Shell에서 다음을 실행합니다.
gcloud compute forwarding-rules create agentspace-fr \
--load-balancing-scheme=EXTERNAL_MANAGED \
--network-tier=PREMIUM \
--address=external-ip \
--target-https-proxy=https-proxy \
--global \
--ports=443
9. 공개 DNS 영역 만들기
다음 섹션에서는 nip.io에서 외부 부하 분산기 IP 주소를 확인하는 데 사용하는 공개 DNS 영역을 만듭니다.
Cloud Shell에서 다음을 실행하여 외부 부하 분산기 IP 주소의 변수를 만듭니다.
externalip=<YOUR-EXTERNAL-IP>
echo $externalip
Cloud Shell에서 다음을 실행합니다.
gcloud dns --project=$project managed-zones create agentspace-dns --description="Agentspace public dns" --dns-name="$externalip.nip.io." --visibility="public"
Cloud Shell에서 다음을 실행합니다.
gcloud dns --project=$project record-sets create agentspace.$externalip.nip.io. --zone="agentspace-dns" --type="A" --ttl="300" --rrdatas="$externalip"
10. OAuth 사용자 인증 정보
다음 섹션에서는 인증을 위해 Google 관리 URL을 oauth-redirect로 리디렉션하는 웹 애플리케이션의 OAuth 사용자 인증 정보를 만듭니다. 생성된 사용자 인증 정보는 튜토리얼에 필요하지 않습니다.
Oauth에 대해 자세히 알아보려면 다음을 참고하세요.
Google Calendar 및 Gmail 작업 추가하기 | Google Agentspace
OAuth 앱 만들기 및 범위 추가
- API 및 서비스 > OAuth 동의 화면으로 이동합니다. OAuth 동의 화면으로 이동
- '내부'를 선택한 다음 '만들기'를 클릭합니다.
- OAuth 앱의 이름을 입력합니다.
- 사용자 지원 이메일을 입력합니다.
- 개발자 연락처 정보를 입력합니다.
- '저장하고 계속하기'를 클릭합니다.
OAuth 클라이언트 ID 만들기
이 절에서는 Google Cloud 작업에 사용할 새 OAuth 클라이언트 ID를 만드는 방법을 설명합니다. 이 OAuth 클라이언트 ID 및 보안 비밀번호는 다른 Google Cloud 작업에도 사용할 수 있습니다. Google Cloud 작업에 기존 Google Cloud OAuth 클라이언트 ID가 있는 경우 새 클라이언트 ID를 만드는 대신 Google Calendar 작업에 해당 클라이언트 ID와 비밀번호를 사용할 수 있습니다.
- 사용자 인증 정보 페이지로 이동하여 사용자 인증 정보 만들기 > OAuth 클라이언트 ID를 클릭합니다.
- 웹 애플리케이션을 선택합니다.
- 클라이언트 ID의 이름을 입력합니다.
- 'URI 추가'를 클릭하고 다음 URI를 입력합니다. https://vertexaisearch.cloud.google.com/oauth-redirect
- '만들기'를 클릭하고 다음 정보를 복사합니다.
- 클라이언트 ID
- 클라이언트 보안 비밀번호
11. Agentspace 애플리케이션 URL 식별
다음 절차에서는 Google에서 생성하여 각 Agentspace 애플리케이션에 매핑된 Google 관리 Agentspace 공개 URL을 식별합니다. URL의 출력은 참조 아키텍처를 기반으로 한 예이므로 URL이 정확해야 합니다.
애플리케이션별로 웹 앱 링크를 저장해야 합니다.
Calendar 애플리케이션
Agentspace 웹 URL: https://vertexaisearch.cloud.google.com/us/home/cid/bb6b8b27-939b-494d-9227-45903bb8afcf
Drive 애플리케이션
Agentspace 웹 URL:
https://vertexaisearch.cloud.google.com/us/home/cid/5970a1b4-080a-4b44-8acd-fa89460cf0cd
12. 고급 호스트 및 경로 규칙 만들기
다음 섹션에서는 Cloud 콘솔을 사용하여 호스트 및 경로 규칙을 정의하는 옵션을 사용 설정하도록 부하 분산기 라우팅 규칙을 업데이트합니다. 아래 표에는 환경에 따라 업데이트되는 맞춤 값 (위에서 아래로 순서)이 요약되어 있습니다.
커스텀 값 | 튜토리얼에 기반한 예시 | |
호스트 | agentspace.YOUR-EXTERNAL-IP.nip.io | agentspace.34.54.158.206.nip.io |
defaultService | projects/<projectid>/global/backendServices/agentspace-ineg-bes | 스크린샷 보기 |
prefixMatch | /<Agentspace 앱 1의 이름> | /drive-app |
backendService | projects/<projectid>/global/backendServices/agentspace-ineg-bes | 스크린샷 보기 |
pathPrefixRewrite | /<앱 1의 Agentspace URL 경로> | /us/home/cid/5970a1b4-080a-4b44-8acd-fa89460cf0cd |
hostRewrite | vertexaisearch.cloud.google.com | vertexaisearch.cloud.google.com |
prefixMatch | /<Agentspace 앱 2의 이름> | /calendar-app |
backendService | projects/<projectid>/global/backendServices/agentspace-ineg-bes | 스크린샷 보기 |
pathPrefixRewrite | /<앱 2의 Agentspace URL 경로> | /us/home/cid/bb6b8b27-939b-494d-9227-45903bb8afcf |
hostRewrite | vertexaisearch.cloud.google.com | vertexaisearch.cloud.google.com |
다음으로 이동하여 호스트 및 경로 규칙에 액세스합니다.
부하 분산 → agentspace-lb → 수정 선택
라우팅 규칙 → 고급 호스트 및 경로 규칙을 선택합니다.
호스트 및 경로 규칙 추가를 선택합니다.
이제 새 호스트 및 경로 규칙을 만들라는 메시지가 표시됩니다. 호스트 섹션에 agentspace.YOUR-EXTERNAL-IP.nip.io 또는 맞춤 도메인을 삽입합니다.
경로 일치자 필드 (일치, 작업, 서비스)에서 환경 구성으로 아래 콘텐츠를 업데이트한 다음 업데이트를 선택합니다.
defaultService: projects/<projectid>/global/backendServices/agentspace-ineg-bes
name: matcher1
routeRules:
- matchRules:
- prefixMatch: /<name of Agentspace app#1>
priority: 1
routeAction:
weightedBackendServices:
- backendService: projects/<projectid>/global/backendServices/agentspace-ineg-bes
weight: 100
urlRewrite:
pathPrefixRewrite: /<Agentspace URL path of app#1>
hostRewrite: vertexaisearch.cloud.google.com
- matchRules:
- prefixMatch: /<name of Agentspace app#2>
priority: 2
routeAction:
weightedBackendServices:
- backendService: projects/<projectid>/global/backendServices/agentspace-ineg-bes
weight: 101
urlRewrite:
pathPrefixRewrite: /<Agentspace URL path of app#2>
hostRewrite: vertexaisearch.cloud.google.com
스크린샷 예:
13. 유효성 검사
배포가 완료되었습니다. 웹브라우저 또는 터미널을 통해 커스텀 도메인(예: agentspace.YOUR-EXTERNAL-IP.nip.io/path)을 지정하여 Agentspace 애플리케이션에 액세스할 수 있습니다(예: agentspace.34.54.158.206.nip.io). 아래 예를 참고하세요.
Agentspace 애플리케이션: drive-app
경로: agentspace.34.54.158.206.nip.io/drive-app
Agentspace 애플리케이션: drive-app
경로: agentspace.34.54.158.206.nip.io/calendar-app
14. 삭제
OAuth 사용자 인증 정보를 삭제하려면 다음을 실행합니다.
API 및 서비스 → 사용자 인증 정보로 이동합니다.
OAuth 2.0 클라이언트 ID에서 사용자 인증 정보를 선택한 다음 삭제합니다.
단일 Cloud Shell 터미널에서 실험실 구성요소를 삭제합니다.
gcloud compute forwarding-rules delete agentspace-fr --global -q
gcloud compute target-https-proxies delete https-proxy --global -q
gcloud compute url-maps delete agentspace-lb --global -q
cloud compute ssl-certificates delete agentspace-self-signed-cert --global -q
gcloud compute backend-services delete agentspace-ineg-bes --global -q
gcloud compute network-endpoint-groups delete agentspace-ineg --global -q
gcloud dns --project=$projectid record-sets delete agentspace.$externalip.nip.io --zone="agentspace-dns" --type="A"
gcloud dns --project=$projectid managed-zones delete agentspace-dns
gcloud compute addresses delete external-ip --global -q
gcloud compute networks delete agentspace-vpc -q
15. 축하합니다
축하합니다. 고급 트래픽 관리 기능이 있는 외부 애플리케이션 부하 분산기를 사용하여 커스텀 도메인을 통해 Agentspace에 대한 연결을 구성하고 유효성을 검사했습니다.
부하 분산기 인프라를 만들고 인터넷 NEG, Cloud DNS, 고급 트래픽 관리를 만드는 방법을 알아봤습니다. 이 고급 트래픽 관리를 사용하면 맞춤 도메인을 사용하여 Agentspace에 연결할 수 있도록 호스트 및 경로 재작성을 사용 설정할 수 있습니다.
코스모퍼프는 Codelab이 멋지다고 생각합니다.