이 튜토리얼에서는 그래프 설명 입력 매개변수를 PNG
이미지 형식의 다이어그램으로 변환하는 커스텀 Cloud Run for Anthos 서비스를 빌드하는 방법을 보여줍니다. 이 튜토리얼은 Graphviz를 사용하며 서비스의 컨테이너 환경에 시스템 패키지로 설치됩니다.
Graphviz는 명령줄 유틸리티를 통해 요청을 처리하는 데 사용됩니다.
목표
- Dockerfile로 커스텀 컨테이너를 작성하고 빌드합니다.
- Cloud Run for Anthos 서비스 작성, 빌드, 배포
- Graphviz DOT 유틸리티를 사용하여 다이어그램을 생성합니다.
- 컬렉션을 사용하거나 직접 만든 DOT 구문 다이어그램을 게시하여 서비스를 테스트합니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Cloud Run for Anthos API 사용 설정
- gcloud CLI를 설치하고 초기화합니다.
kubectl
구성요소를 설치합니다.gcloud components install kubectl
- 구성요소를 업데이트합니다.
gcloud components update
- curl을 설치하여 서비스를 사용해 봅니다.
- Cloud Run for Anthos 설정의 안내에 따라 새 클러스터를 만듭니다.
gcloud 기본값 설정
Cloud Run for Anthos 서비스의 기본값으로 gcloud를 구성하려면 다음 안내를 따르세요.
기본 프로젝트를 설정합니다.
gcloud config set project PROJECT_ID
PROJECT_ID를 이 튜토리얼에서 사용하는 프로젝트의 이름으로 바꿉니다.
클러스터에 gcloud를 구성합니다.
gcloud config set run/platform gke gcloud config set run/cluster CLUSTER-NAME gcloud config set run/cluster_location REGION
다음과 같이 바꿉니다.
- CLUSTER-NAME을 클러스터에 사용한 이름으로 바꿉니다.
- REGION을 지원되는 클러스터 위치 중 원하는 위치로 바꿉니다.
코드 샘플 검색
사용할 코드 샘플을 검색하려면 다음 안내를 따르세요.
샘플 앱 저장소를 로컬 머신에 클론합니다.
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
또는 zip 파일로 샘플을 다운로드하고 압축을 풀 수 있습니다.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
또는 zip 파일로 샘플을 다운로드하고 압축을 풀 수 있습니다.
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
또는 zip 파일로 샘플을 다운로드하고 압축을 풀 수 있습니다.
자바
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
또는 zip 파일로 샘플을 다운로드하고 압축을 풀 수 있습니다.
Cloud Run for Anthos 샘플 코드가 있는 디렉터리로 변경합니다.
Node.js
cd nodejs-docs-samples/run/system-package/
Python
cd python-docs-samples/run/system-package/
Go
cd golang-samples/run/system_package/
자바
cd java-docs-samples/run/system-package/
아키텍처 시각화
기본 아키텍처는 다음과 같습니다.
사용자가 Graphviz 유틸리티를 실행하는 Cloud Run for Anthos 서비스에 대해 HTTP 요청을 수행하여 요청을 이미지로 변환합니다. 이 이미지는 사용자에게 HTTP 응답으로 전송됩니다.
코드 이해하기
Dockerfile
로 환경 구성 정의
Dockerfile
은 서비스에서 사용할 언어 및 기본 운영 환경(예: Ubuntu)에 따라 다릅니다.
이 서비스를 사용하려면 기본적으로 하나 이상의 추가 시스템 패키지가 필요합니다.
편집기에서
Dockerfile
을 엽니다.Dockerfile
RUN
문을 찾습니다. 이 문을 사용하면 임의의 셸 명령어를 실행하여 환경을 수정할 수 있습니다.Dockerfile
이 여러FROM
문을 찾아 식별할 수 있는 여러 단계로 이루어져 있는 경우 Dockerfile은 마지막 단계에 있습니다.특정한 필수 패키지와 패키지를 설치하는 메커니즘은 컨테이너 내부에 선언된 운영체제에 따라 다릅니다.
운영체제 또는 기본 이미지에 대한 안내를 확인하려면 해당 탭을 클릭합니다.
Debian/Ubuntu Alpine Alpine을 사용하려면 글꼴 지원을 위한 또 다른 패키지가 필요합니다.컨테이너 이미지의 운영체제를 확인하려면
FROM
문 또는 기본 이미지와 연결된 README의 이름을 확인하세요. 예를 들어node
를 확장하는 경우에는 Docker Hub에서 문서와 상위Dockerfile
을 찾을 수 있습니다.docker build
를 로컬에서 또는 Cloud Build를 사용해 이미지를 빌드하여 맞춤설정을 테스트합니다.
수신 요청 처리
샘플 서비스는 수신 HTTP 요청의 매개변수를 사용하여 적절한 dot
유틸리티 명령어를 실행하는 시스템 호출을 호출합니다.
아래의 HTTP 핸들러에서 그래프 설명 입력 매개변수는 dot
querystring 변수입니다.
그래프 설명에는 querystring에 사용할 URL 인코딩 문자가 포함될 수 있습니다.
Node.js
Python
Go
자바
내부 서버 오류와 잘못된 사용자 입력을 구분해야 합니다. 오류 메시지에 사용자 입력 문제를 나타내는 문자열 syntax
가 포함된 경우를 제외하고 이 샘플 서비스는 모든 dot 명령줄 오류에 대해 내부 서버 오류를 반환합니다.
다이어그램 생성
다이어그램 생성의 핵심 로직은 dot 명령줄 도구를 사용하여 그래프 설명 입력 매개변수를 PNG 이미지 형식의 다이어그램으로 처리합니다.
Node.js
Python
Go
자바
보안 서비스 설계
dot
도구의 모든 취약점은 웹 서비스의 잠재적 취약점입니다. 이를 완화하려면 정기적으로 컨테이너 이미지를 다시 빌드하여 graphviz
패키지의 최신 버전을 사용하면 됩니다.
현재 샘플을 확장하여 사용자 입력을 명령줄 매개변수로 허용하는 경우 명령어 삽입 공격으로부터 보호해야 합니다. 다음은 삽입 공격을 방지하는 몇 가지 방법입니다.
- 지원되는 매개변수 사전에 입력 매핑
- 입력이 알려진 안전한 값의 범위(예: 정규식 사용)와 일치하는지 여부 검사
- 셸 구문이 평가되지 않도록 입력 이스케이프 처리
코드 제공
코드를 제공하려면 Cloud Build로 빌드하고 Container Registry에 업로드한 후 Cloud Run for Anthos에 배포합니다.
다음 명령어를 실행하여 컨테이너를 빌드하고 Container Registry에 게시합니다.
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
여기서 PROJECT_ID는 GCP 프로젝트 ID이고
graphviz
는 서비스에 지정할 이름입니다.성공하면 ID, 생성 시간, 이미지 이름이 포함된 성공 메시지가 표시됩니다. 이미지는 Container Registry에 저장되며 원하는 경우 다시 사용할 수 있습니다.
Python
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
여기서 PROJECT_ID는 GCP 프로젝트 ID이고
graphviz
는 서비스에 지정할 이름입니다.성공하면 ID, 생성 시간, 이미지 이름이 포함된 성공 메시지가 표시됩니다. 이미지는 Container Registry에 저장되며 원하는 경우 다시 사용할 수 있습니다.
Go
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
여기서 PROJECT_ID는 GCP 프로젝트 ID이고
graphviz
는 서비스에 지정할 이름입니다.성공하면 ID, 생성 시간, 이미지 이름이 포함된 성공 메시지가 표시됩니다. 이미지는 Container Registry에 저장되며 원하는 경우 다시 사용할 수 있습니다.
자바
이 샘플은 Jib를 사용해서 일반적인 자바 도구로 Docker 이미지를 빌드합니다. Jib는 Dockerfile을 사용하거나 Docker를 설치할 필요 없이 컨테이너 빌드를 최적화합니다. Jib로 자바 컨테이너 빌드에 대해 자세히 알아보세요.Dockerfile을 사용하여 시스템 패키지가 설치된 기본 이미지를 구성하고 빌드하여 Jib의 기본 이미지를 재정의합니다.
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz-base
여기서 PROJECT_ID는 GCP 프로젝트 ID입니다.
Jib로 최종 컨테이너를 빌드하고 Container Registry에 게시합니다.
mvn compile jib:build \ -Dimage=gcr.io/PROJECT_ID/graphviz \ -Djib.from.image=gcr.io/PROJECT_ID/graphviz-base
여기서 PROJECT_ID는 GCP 프로젝트 ID입니다.
다음 명령어를 사용하여 배포합니다.
gcloud run deploy graphviz-web --create-if-missing --image gcr.io/PROJECT_ID/graphviz
여기서 PROJECT_ID는 GCP 프로젝트 ID이고,
graphviz
는 위의 컨테이너 이름이고,graphviz-web
은 서비스 이름입니다.배포가 완료될 때까지 기다립니다. 이 작업은 30초 정도 걸릴 수 있습니다.
서비스에 코드 업데이트를 배포하려면 이전 단계를 반복합니다. 서비스에 배포할 때마다 새 버전이 생성되고 준비가 되면 자동으로 트래픽 제공이 시작됩니다.
사용해 보기
요청 페이로드에 DOT 구문 설명과 함께 HTTP POST
요청을 보내 서비스를 사용해 보세요.
서비스에 HTTP 요청을 보냅니다.
웹페이지에 다이어그램을 삽입할 수 있습니다.
- Istio 인그레스 게이트웨이의 외부 IP를 가져오려면 다음 안내를 따르세요.
여기서 결과 출력은 다음과 같이 표시됩니다.kubectl get svc istio-ingress -n gke-system
부하 분산기의 EXTERNAL-IP는 반드시 사용해야 하는 IP 주소입니다.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) istio-ingress LoadBalancer XX.XX.XXX.XX pending 80:32380/TCP,443:32390/TCP,32400:32400/TCP
URL에서 이
EXTERNAL-IP
주소를 사용하여 curl 명령어를 실행합니다. 프로토콜(예:http://
)은SERVICE_DOMAIN
에 포함하지 않습니다.curl -G -H "Host: SERVICE_DOMAIN" http://EXTERNAL-IP/diagram.png \ --data-urlencode "dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" \ > diagram.png
- Istio 인그레스 게이트웨이의 외부 IP를 가져오려면 다음 안내를 따르세요.
PNG
파일을 지원하는 모든 애플리케이션(예: Chrome)에서 결과diagram.png
파일을 엽니다.예를 들면 다음과 같습니다.
바로 활용할 수 있는 다이어그램 설명의 몇 가지 모음을 살펴볼 수 있습니다.
- 선택한
.dot
파일의 콘텐츠를 복사합니다. curl
명령어에 붙여넣습니다.curl -G -H "Host: SERVICE_DOMAIN" http://EXTERNAL-IP/diagram.png \ --data-urlencode "dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" \ > diagram.png
삭제
이 튜토리얼용으로 새 프로젝트를 만든 경우 이 프로젝트를 삭제합니다. 기존 프로젝트를 사용한 경우 이 튜토리얼에 추가된 변경사항은 제외하고 보존하려면 튜토리얼용으로 만든 리소스를 삭제합니다.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하려면 다음 안내를 따르세요.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
튜토리얼 리소스 삭제
이 튜토리얼에서 배포한 Cloud Run for Anthos 서비스를 삭제합니다.
gcloud run services delete SERVICE-NAME
여기서 SERVICE-NAME은 선택한 서비스 이름입니다.
Google Cloud 콘솔에서 Cloud Run for Anthos 서비스를 삭제할 수도 있습니다.
튜토리얼 설정 중에 추가한 gcloud 기본 구성을 삭제합니다.
gcloud config unset run/platform gcloud config unset run/cluster gcloud config unset run/cluster_location
프로젝트 구성을 삭제합니다.
gcloud config unset project
이 튜토리얼에서 만든 다른 Google Cloud 리소스를 삭제합니다.
- Container Registry에서 가져온
gcr.io/<var>PROJECT_ID</var>/graphviz
라는 컨테이너 이미지를 삭제합니다. - 이 튜토리얼용 클러스터를 만든 경우 클러스터를 삭제합니다.
- Container Registry에서 가져온
다음 단계
- graphviz 앱에서 다음을 실험해보세요.
- 다이어그램 생성에 다양한 알고리즘을 적용하는 다른 graphviz 유틸리티에 대한 지원을 추가합니다.
- Cloud Storage에 다이어그램을 저장합니다. 이미지 또는 DOT 구문을 저장하시겠어요?
- Cloud Natural Language API로 콘텐츠 악용을 방지합니다.
- 이미지 처리에서 시스템 패키지의 다른 예시를 참조하세요.
- Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항 살펴보기 Cloud 아키텍처 센터 살펴보기