[GCP]Serverless 서비스인 Cloud Run 알아보기 7부 — Cloud Storage FUSE 를 활용하여 여러 서비스간의 데이터 공유

이정운 (Jungwoon Lee)
google-cloud-apac
Published in
12 min readJan 24, 2022

안녕하세요 이정운 입니다.

Google Cloud 에서 제공하는 컨테이너 기반의 Serverless 솔루션인 Cloud Run 에 대해서 살펴보고 실제 테스트해보면서 써볼 수 있는 시간을 가져보는 시리즈를 하단과 같이 진행하고 있습니다.

[GCP]Serverless 서비스인 Cloud Run 알아보기 1부 — Cloud Run 개요
[GCP]Serverless 서비스인 Cloud Run 알아보기 2부 — 로컬에서 개발하기(Cloud Code)
[GCP]Serverless 서비스인 Cloud Run 알아보기 3부 — 업데이트 및 트래픽 조정
[GCP]Serverless 서비스인 Cloud Run 알아보기 4부 — 서버리스 VPC 액세스
[GCP]Serverless 서비스인 Cloud Run 알아보기 5부 — Eventarc 를 통한 이벤트 받기
[GCP]Serverless 서비스인 Cloud Run 알아보기 6부 — Cloud logging 과 Eventarc 를 통한 이벤트 처리

이번 이야기에서 살펴볼 것은 이번에 업데이트된 Cloud Run 의 2세대 실행환경과 이를 통한 네트워크 파일 시스템 마운트해서 사용하는 것을 보려고 합니다. 2세대 실행 환경은 시스템 호출 에뮬레이션이 아닌 전체 Linux 호환성을 제공하므로 더 빠른 CPU, 네트워크 성능뿐만 아니라 전체적으로 높은 Linux 호환성을 제공할 수 있게 되면서 대표적으로 그전에는 지원되지 않았던 네트워크 파일 시스템과 같은 부분을 지원할 수 있게 되었습니다.

실행 환경 정보
https://cloud.google.com/run/docs/about-execution-environments

즉, Cloud Run 은 2세대 실행환경부터 Cloud Filestore 와 Cloud Storage Fuse 를 포함하여 NFS, NDB, 9P, CIFS/Samba, Ceph 와 같은 네트워크 파일 시스템을 지원 가능해져서 서로간의 데이터 공유를 가능하게 할 수 있습니다.

네트워크 파일 시스템 사용
https://cloud.google.com/run/docs/using-network-file-systems

이번 이야기에서는 이러한 부분을 직접 테스트해보고 살펴보기 위해서 Cloud Run 에서 오픈소스인 Cloud Storage FUSE 를 활용하여 여러 서비스간의 데이터 공유하는 간단한 샘플을 돌려보고 테스트해보는 시간을 가져보도록 하겠습니다.

Cloud Run에 Cloud Storage FUSE 사용 튜토리얼
https://cloud.google.com/run/docs/tutorials/network-filesystems-fuse

참고로 Cloud Storage FUSE 는 Google Cloud Storage(GCS) 버킷을 Linux 또는 macOS 시스템에 파일 시스템으로 마운트할 수 있는 오픈소스 FUSE 어댑터입니다. 또한 애플리케이션에서 표준 파일 시스템 시맨틱스를 사용하여 Cloud Storage 객체를 업로드 및 다운로드하는 수단을 제공 할 수 있습니다.

GoogleCloudPlatform/gcsfuse
https://github.com/GoogleCloudPlatform/gcsfuse

Cloud Storage FUSE는 I/O 코드를 다시 쓸 필요 없이 파일 기반 애플리케이션이 Cloud Storage를 사용할 수 있게 하므로, 이를 통해 Cloud Storage를 보다 효과적으로 빠르게 사용할 수 있습니다. 이 도구는 Cloud Storage가 애플리케이션에 적합한 성능과 확장성 특성을 갖고 있지만 파일 시스템 시맨틱스가 없는 경우에만 이상적이기 때문에 본인 환경에서 적합한 솔루션인지 결정할 때는 로컬 파일 시스템과 비교해 몇 가지 추가적인 차이점을 고려해야 합니다.

POSIX 파일 시스템과의 주요 차이점
https://cloud.google.com/storage/docs/gcs-fuse#notes

그럼 이번에도 역시 설명보다는 기 언급한 것처럼 실제 테스트를 직접 해보면서 Cloud Storage FUSE 를 활용하여 여러 서비스간의 데이터 공유에 대한 부분을 살펴볼 수 있는 시간을 가져보도록 하겠습니다.

#1) Cloud Run에 Cloud Storage FUSE 사용 설정

Cloud Run에 Cloud Storage FUSE 사용 튜토리얼
https://cloud.google.com/run/docs/tutorials/network-filesystems-fuse

Cloud Run에 Cloud Storage FUSE 사용 설정을 테스트해보기 위해서 튜토리얼에 있는 내용들을 따라서 해보도록 하겠습니다. 먼저, Cloud Run 에서 Cloud Storage Fuse 를 통해서 생성될 파일이 보관될 GCS 버킷을 하나 생성합니다.

다음으로 Cloud Run 에서 지금 생성한 GCS 버킷에 파일을 생성하기 위한 권한 제공을 위해서 service account 를 하나 생성합니다.

gcloud iam service-accounts create fs-identity

생성된 Service account 에 GCS 버킷에 파일 생성을 위한 storage.objectAdmin 권한을 부여합니다.

gcloud projects add-iam-policy-binding jwlee-myproject-01 \
--member "serviceAccount:fs-identity@jwlee-myproject-01.iam.gserviceaccount.com" \
--role "roles/storage.objectAdmin"

테스트를 위한 기본 설정 준비는 다 되었으므로 실제 테스트를 위해서 튜토리얼에 있는데로 python 샘플 코드를 github 에서 다운로드 받습니다.

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
cd python-docs-samples/run/filesystem/

그리고, Dockerfile 을 하단과 같이 준비합니다.

rm Dockerfile
cp gcsfuse.Dockerfile Dockerfile

Dockerfile 을 보시면 아시겠지만 Cloud Storage FUSE 설치 및 설정후에 gcsfuse_run.sh 라는 간단한 스타트업 스크립트를 수행하는 형태입니다. 해당 스크립트는 Cloud Storage FUSE 를 실제로 마운트하고 Python 용 WSGI(Web Server Gateway Interface) HTTP Server 인 gunicon 을 구동하는 역할을 수행합니다.

이제 소스가 준비되었으니 소스에서 바로 Cloud Run 으로 배포해보도록 하겠습니다.

Deploying from source code
https://cloud.google.com/run/docs/deploying-source-code

하단과 같이 gcloud 명령을 활용하면 소스에서 Dockerfile 기반으로 image 를 바로 빌드하고 cloud-run-source-deploy 라는 Artifact Registry 에 자동으로 push 한 후에 해당 image 로 Cloud Run 을 수행할 수 있습니다. 특히, 이야기 초반에 언급했지만 Cloud Storage Fuse 를 사용하기 위해서 실행환경은 gen2 로 설정해야 합니다.

gcloud beta run deploy filesystem-app --source . \
--execution-environment gen2 \
--allow-unauthenticated \
--service-account fs-identity \
--update-env-vars BUCKET=cloudrungcs001

정상적으로 Cloud Run 이 배포되었다면 GCP 관리콘솔 > Cloud Run 메뉴에서 하단과 같이 정상적으로 배포된 filesystem-app 을 확인할 수 있습니다.

당연히 해당 이름을 클릭하여 서비스를 위한 URL 이나 좀 더 세부적인 정보들도 확인 가능합니다.

그럼 Cloud Run 배포후에 자동생성된 서비스 URL 을 통해서 요청을 날려봅니다. 그러면, 하단과 같이 파일이 하나 생성된 후에 Cloud Storage FUSE 를 통해서 GCS 버킷에 저장된 것을 확인할 수 있습니다.

시간이 지난후에 다시 Cloud Run 을 호출해보면 기존 생성된 파일을 확인 할 수 있을 뿐만 아니라 새롭게 최신시간 기준으로 파일이 하나 더 생성된 것을 확인할 수 있습니다. 간단한 데모이기 때문에 GCS 버킷의 파일 이름만 출력했지만 새로운 Cloud Run 컨테이너 인스턴스라고 해도 공통적으로 GCS 버킷의 파일을 참조하여 데이터를 저장하거나 공유하는 것이 가능하다라는 의미입니다.

추신 #1) Cloud Run 컨테이너 인스턴스의 최대 메모리 할당량이 16GiB 까지 증가되었습니다.

Configuring Memory Limits
https://cloud.google.com/run/docs/configuring/memory-limits

추신 #2) 기본적으로 Cloud Run 컨테이너 인스턴스에는 요청 처리 및 컨테이너 시작 중에만 CPU가 할당되었습니다. 여기에 더해 CPU 계속 할당 옵션이 추가되었고 필요하다면 들어오는 요청이 없는 경우에도 CPU가 항상 할당되고 사용 가능하도록 이 동작을 변경할 수 있습니다. CPU를 항상 할당되도록 설정하면 백그라운드 작업 및 기타 비동기 처리 작업을 실행할 때 유용할 수 있습니다.

CPU allocation
https://cloud.google.com/run/docs/configuring/cpu-allocation

추신 #3) 이제 Cloud Run 에서 Secret Manager 의 Secret 참조를 지원 시작합니다. 이를 통해 Cloud Run 서비스에 API 키, 암호, 기타 민감한 정보가 필요한 종속 항목을 포함해야 할때 Secret Manager 에서 생성된 Secret 에 이런 유형의 민감한 정보를 저장할 수 있게 되었습니다.

Using secrets
https://cloud.google.com/run/docs/configuring/secrets

지금까지 Cloud Run 의 2세대 실행환경을 통해서 Cloud Storage FUSE 를 연동하고 이를 통해서 서비스간의 데이터 공유가 가능한 방식을 살펴보는 시간을 가졌습니다. 기 언급한 것처럼 간단한 데모를 통해서 해당 부분을 살펴보았고 해당 데모에서는 Cloud Storage FUSE 를 연동하였지만 Cloud Run 의 2세대 실행환경부터 Cloud Storage Fuse 를 포함하여 Cloud Filestore, NFS, NDB, 9P, CIFS/Samba, Ceph 와 같은 네트워크 파일 시스템을 지원 가능해져서 보다 다양한 시나리오에서 Cloud Run 을 활용할 수 있는 길이 열렸습니다. 그럼 이번 포스팅은 여기서 마무리하고 다음에 다른 포스팅으로 다시 돌아오겠습니다.

Disclaimer: 본 글의 작성자는 Google 직원이지만 Google cloud 를 공부하는 한 개인으로서 작성된 글입니다. 본 글의 내용, 입장은 Google 을 대변하지 않으며 Google 이 해당 콘텐츠를 보장하지 않습니다.

참고 자료 #1

실행 환경 정보
https://cloud.google.com/run/docs/about-execution-environments

네트워크 파일 시스템 사용
https://cloud.google.com/run/docs/using-network-file-systems

Cloud Run에 Cloud Storage FUSE 사용 튜토리얼
https://cloud.google.com/run/docs/tutorials/network-filesystems-fuse

GoogleCloudPlatform/gcsfuse
https://github.com/GoogleCloudPlatform/gcsfuse

POSIX 파일 시스템과의 주요 차이점
https://cloud.google.com/storage/docs/gcs-fuse#notes

Deploying from source code
https://cloud.google.com/run/docs/deploying-source-code

--

--

이정운 (Jungwoon Lee)
google-cloud-apac

Technical engineer who dreams better future. (These thoughts are my own personal opinions, and do not reflect or represent Google’s opinions or plans.)