雲端服務 Google Cloud Platform (2)

基本介紹

教學目標

學會透過 Google App Engine 以 Python 的 Flask 框架實作存取 Google BigQuery 資料集的 API。

前置作業

  1. 準備 Mac OS X 電腦,完成 Python 2.7.6 開發環境的安裝。
  2. 啟用 Google BigQuery 專案,並且至少新增一個資料集 (DataSet) 。

使用教學

初始專案

首先透過「立即試用 Google App Engine」網站新增第一項專案。
使用字母、數字、引號、連字號、空格或驚嘆號替專案進行命名。
選擇 Python 語言做為主要開發的程式語言。
選擇 Flask 框架為主要開發的程式框架,並且下載打包後的程式碼。
安裝 GOOGLE CLOUD SDK ,在終端機輸入以下指令,按照指示步驟下載與安裝相關套件。

1
$ curl https://sdk.cloud.google.com/ | bash

重新啟動終端機,透過以下指令登入 Google Cloud Platform。

1
$ gcloud auth login

在本機上執行應用程式,解壓縮打包後的程式碼,透過以下指令啟動本機伺服器。

1
$ dev_appserver.py appengine-try-python-flask

透過瀏覽器造訪本機上執行的應用程式: http://localhost:8080

建立專案並進行部署,按下「建立專案」鈕,透過以下指令部署本機伺服器至雲端專案。

1
$ appcfg.py -A root-logic-765 update appengine-try-python-flask/

(註: 過程中若發現帳號無法正常登入,請啟用安全性較低的應用程式存取權限。 )

產生憑證

在 Google Developers Console 選擇「API 和憑證」->「憑證」,按下「建立新的用戶端 ID」。
接著按下「產生新的 P12 金鑰」產生公開金鑰指紋,並且命名為 key.p12,再執行以下指令產生 Python 可解析的金鑰。

1
2
$ openssl pkcs12 -nocerts -nodes -in key.p12 -passin pass:notasecret -out cert.pem
$ openssl pkcs8 -nocrypt -in key.pem -passin pass:notasecret -topk8 -out privatekey.pem

記下 OAuth 2.0 服務帳戶的電子郵件地址 (必要資訊)。
(ex: 976676768798-6i019efttupu7qv335omr9hc32d76kct@developer.gserviceaccount.com)

修改程式

先將 privatekey.pem 金鑰移至 appengine-try-python-flask 資料夾中,下載函式庫 解壓縮至該專案的 lib 資料夾。

開啟 main.py 修改程式碼,並且輸入正確的專案 ID 和服務帳戶的電子郵件地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from flask import Flask, jsonify

import httplib2

from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials

app = Flask(__name__)
app.config['DEBUG'] = True

project_id = '專案 ID'
service_account_email = '服務帳戶的電子郵件地址'

key_file = file('key.pem', 'rb')
key = key_file.read()
key_file.close()

credentials = SignedJwtAssertionCredentials(
service_account_email,
project_id,
scope='https://www.googleapis.com/auth/bigquery')

http = httplib2.Http()
http = credentials.authorize(http)

@app.route('/api/v1/bigquery_dataset')
def bigquery_dataset():
service = build('bigquery', 'v2')
datasets = service.datasets()
response = datasets.list(projectId=PROJECT_NUMBER).execute(http)
result = []
for dataset in response['datasets']:
result.append(dataset['id']);
return jsonify({"datasets":result})


@app.errorhandler(404)
def page_not_found(e):
return 'Sorry, nothing at this URL.', 404

透過以下指令啟動本機伺服器。

1
$ dev_appserver.py appengine-try-python-flask

透過瀏覽器造訪本機上執行的應用程式: http://localhost:8080/api/v1/bigquery_dataset

透過以下指令部署本機伺服器至雲端專案。

1
$ appcfg.py -A root-logic-765 update appengine-try-python-flask/

執行結果 (參考):

1
2
3
4
5
6
{
"datasets": [
"root-logic-765:log",
"root-logic-765:user"
]
}

(網址: http://root-logic-765.appspot.com/api/v1/bigquery_dataset)

相關資源