반응형

구글 클라우드(GCP)의 Cloud Run은 컨테이너를 빠르게 생성, 배포, 관리할 수 있는 솔루션이다. Cloud Run 데모를 고민하다가, 실제로 업무에 활용할 수 있는 데모를 준비해 봤다. Google Sheets를 액세스하는 부분도 있어, 그것을 활용하여 간단한 구성이나 데이터 저장소로 활용하는데도 도움이 될 수 있다. 최근에는 브라우저 기반의 업무들이 많아지고 있다. 그래서 브라우저 활용을 효율화 하는 것이 업무 효율 향상에도 도움이 많이 된다.

 

URL Shortcut 만들기

브라우저를 통해서 여러 웹 사이트를 브라우징 하다보면, 너무 많은 페이지와 정보에 당황하고 그것들을 관리하기 어려워 하는 경우가 많다. 사실 대부분의 경우 북마크를 활용한다. 북마크의 장점은 마우스 클릭을 통해 빠르게 원하는 페이지를 URL을 기억하지 않고 접근할 수 있다는 장점이 있다. 필자 같은 경우는 아래와 같이 북마크 바를 크롬에 배치하여 잘 사용하고 있다.

 

 

다만, 문제는 북마크의 개수가 많아지면 그것 자체를 브라우징 하는데 시간이 소요되거나 잊어 먹고 중복해서 계속 북마크를 만드는 문제도 있다. 혹시 북마크와 함께 우리가 키보드로 입력하는 URL 주소 창에서 빠르게 원하는 페이지를 찾아가는 방법은 없을까?

 

 

Custom Search Engine 활용하기

크롬브라우저의 설정 ⇒ 검색엔진 ⇒ 검색엔진 관리 메뉴에서 빠른 사이트 액세스를 가능하게 한다. 다음은 네이버맵과 구글맵 검색을 최적화한 예이다. 아래와 같이 설정을 하게 되면

 

 

브라우저 창에서 다음과 같이 빠르게 구글맵이나 네이버맵을 사용할 수 있다. 키워드(예: nmap)를 치고 스페이스를 누르면, 

 

 

다음과 같이 네이버맵 웹사이트에 들어가지 않고도 바로 검색을 할 수 있다.

 

 

키워드를 통해서 웹 사이트 액세스하기

 

Custom Search Engine을 조금 더 확장해서, 특정 키워드를 특정 URL과 맵핑해서 사용할 수는 없을까? 하는 생각에 이르게 되었다. 다음과 같이 활용하는 것이다. 예를 들어 필자 같은 경우는 ‘jl’ 또는 ‘jlink’ 라는 키워드를 prefix로 활용하고 있는데 다음은 그 활용 방법이다.

 

 

스페이스 누르고 사전에 정한 키워드 memo 를 입력하면

 

 

거기에 링크된, Google Docs(또는 특정 웹사이트)가 열린다.

 

즉, 브라우저 기반으로 업무를 수행해서 사용해야 할 컨텐츠에 대한 고유한 링크들이 많다면 예를 들어 아래와 같이 키워드를 등록하면 그것을 빠르게 액세스 할 수 있다.

 

memo - 개인 메모

dev - 개발 관련 페이지

famacc - 개인 회계 페이지

cloudrun - Cloud Run 관련 기술 문서

 

이런 기능을 Cloud Run을 통해서 만들어 보자.

 

Cloud Run 이용한 개발

여기 문서를 통해서 Cloud Run에 대한 이해가 많아진다.

 

프로그램은 다음과 같이 생각해 본다. 브라우저에서 Custom Search Engine 기능을 통해서 Cloud Run을 실행하면, Cloud Run에서는 URL 파라미터를 받아 Google Sheets에 저장된 맵핑 테이블(키워드 - URL)을 조회한다. 그리고 조회된 URL을 Redirect 할 수 있게 응답으로 보낸다.

 

 

먼저 Cloud Run 프로그램은 Python 3 기반으로 다음과 같이 작성하였다.

 

import os
from flask import redirect
from flask import Flask
from flask import request
from apiclient import discovery
from oauth2client import client
import urllib.parse


app = Flask(__name__)

@app.route('/<id>', defaults={'param': None})
@app.route('/<id>/<param>')
def keyword_routing(id, param):

    os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'api-project-249965614499-2749b23186fb.json'

    credentials = client.GoogleCredentials.get_application_default()
    discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?version=v4')
    service = discovery.build('sheets', 'v4', credentials=credentials,
    discoveryServiceUrl=discoveryUrl)

    spreadsheetId = '<Google Sheets 문서 ID>'
    rangeName = 'Sheet1!A3:B200'

    result = service.spreadsheets().values().get(spreadsheetId=spreadsheetId, range=rangeName).execute()
    values = result.get('values', [])

    links = {}
    for entry in values:
        for x in entry[0].split(','):
            links[x.strip()] = entry[1]

    print(links)
   
    if id in links:
        if param is None:
          return redirect(links[id])
        else:
          return redirect(links[id] % (urllib.parse.quote(param)))
    else:
        return redirect(links['list'])

if __name__ == "__main__":
    app.run(debug=True,host='0.0.0.0',port=int(os.environ.get('PORT', 8080)))

 

몇 가지 눈여겨 봐야할 할 부분이 있는데, 먼저 이 프로그램에서는 Google Sheets를 액세스해야 하기 때문에 Service Account를 사용했다. JSON 기반의 Key 파일을 만들어 내려 받아, 프로그램 내에서 다음과 같이 해당 Key를 환경변수로 지정한다.

 

 

    os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'api-project-249965614499-2749b23186fb.json'

 

키워드 맵핑 테이블이 들어갈 문서에는 Google Sheets에 다음과 같이 해당 문서에 대한 액세스 권한을 주어야 한다.

 

 

Service Account를 이용해서 Google Sheets를 이용하려면 아래와 같이 Sheets API를 이용한다.

 

    credentials = client.GoogleCredentials.get_application_default()
    discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?version=v4')
    service = discovery.build('sheets', 'v4', credentials=credentials,
    discoveryServiceUrl=discoveryUrl)

 

Google Sheets에서 데이터를 읽어오려면 아래와 같이 코딩한다. 

 

    spreadsheetId = '<Google Sheets 문서 ID>'
    rangeName = 'Sheet1!A3:B200'

    result = service.spreadsheets().values().get(spreadsheetId=spreadsheetId, range=rangeName).execute()
    values = result.get('values', [])

 

여기서 문서 ID는 문서를 열었을 때 보이는 아래 고유한 Key 부분이다. 슬래쉬 사이의 문자열만 사용하면 된다. 여기서는 쉬트 ‘Sheet1’의 A3 ~ B200 사이의 영역을 읽어온다. 따라서 만약 키워드 맵핑이 많아지면 이 부분을 수정해야 한다.

 

 

이 프로그램에서는 키워드 컬럼에 컴머로 구분해서 두 개 이상의 키워드를 지정할 수 있고, %s 를 이용하여 추가 파라미터를 맵핑하는 기능도 들어 있다.

 

Google Sheets에 키워드 - URL 맵핑은 다음과 같이 한다. 예를 들어 필자 같은 경우 jl list 라고 하면 본 맵핑 테이블 Sheets가 열리게 했고, jl jlink 라고 입력하면 이 코드를 관리하는 문서가 열리게 했다. jl deploy 라고 입력하면 GCP 상에서 이 Cloud Run 프로그램 관리 콘솔이 열리게 했다.

 

 

그리고 다음과 같이 컴머 기반으로 두 개 이상의 키워드를 하나의 URL에 맵핑할 수 있고, 키워드는 한글도 가능하다.

 

 

Cloud Run 빌드/배포 방법

소스는 다음과 같이 src에 넣었다.

[userid@hostname cloudrun]$ ls -lR
.:
total 16
-rwxr-xr-x. 1 userid gke-69fccc16664a9606b68f  75 May  3  2020 01.build.sh
-rwxr-xr-x. 1 userid gke-69fccc16664a9606b68f 375 May  3  2020 02.test_local.sh
-rwxr-xr-x. 1 userid gke-69fccc16664a9606b68f 121 May  3  2020 03.deploy.sh
-rw-rw-r--. 1 userid gke-69fccc16664a9606b68f 386 Oct 18 09:08 README.md
drwxrwxr-x. 2 userid gke-69fccc16664a9606b68f 111 Jan 21 17:52 src

./src:
total 12
-rw-r--r--. 1 userid gke-69fccc16664a9606b68f 2345 May  3  2020 api-project-249965614499-2749b23186fb.json
-rw-rw-r--. 1 userid gke-69fccc16664a9606b68f  607 May  3  2020 Dockerfile
-rw-rw-r--. 1 userid gke-69fccc16664a9606b68f 1406 Jan 21 17:39 hello.py

 

각 빌드, 로컬테스트, 배포 스크립트를 각각 아래와 같이 만들었다. Cloud Build를 통해서 빌드를 하고 결과를 Container Registry로 올리는 스크립트이다.

$ cat 01.build.sh
cd src
gcloud builds submit --tag gcr.io/api-project-249965/cloudrun

 

일본 리전에 cloudrun이라는 이름으로 배포를 했다.

$ cat 03.deploy.sh
gcloud run deploy --image gcr.io/api-project-249965/cloudrun --platform managed --region asia-northeast1 cloudrun

 

배포를 실행하면 아래와 같이 고유한 URL이 만들어진다.

$ ./03.deploy.sh
Deploying container to Cloud Run service [cloudrun] in project [api-project-249965] region [asia-northeast1]
✓ Deploying... Done.
  ✓ Creating Revision...
  ✓ Routing traffic...
Done.
Service [cloudrun] revision [cloudrun-00012-jam] has been deployed and is serving 100 percent of traffic at https://cloudrun-n3tlhzi66a-an.a.run.app

 

Custom Search Engine 설정

예를 들어 mk 라는 단어를 Prefix로 사용하려면 아래와 같이 설정한다. Cloud Run Endpoint에 %s를 붙여서 URL 항목에 입력한다.

 

그러면 브라우저 주소 창에 아래와 같이 입력하면 Google Sheets에 해당 키워드에 맵핑된 URL로 이동이 된다.

 

mk doc1

mk doc2




Posted by Hey Jerry
,