Amazon web service 是個相當有名的雲端服務,
這次試著使用 Python 來存取 Amazon s3 資料。
1. 請先安裝 boto (Python interface to Amazon Web Services)
$ sudo pip install boto
2. 取得 Amazon s3 access key & secrect key
進入 Amazon 帳戶設定,Create New User 後會取得一組 access & secrect key,
但還無法存取,點選 User 內的 Attatch Policy,勾選 AmazonS3FullAccess
3. 至 Amazon s3 建立一個 bucket
4. import s3 connection
from boto.s3.connection import S3Connection
from boto.s3.key import Key
conn = S3Connection(${yourAccessKey}, ${yourSecrectKey})
bucket = conn.get_bucket(${bucketname})
fileKey = Key(bucket)
fileKey.key = ${fileName}
# if you want to get file in folder -> fileKey.key = '${folderName}/${fileName}'
fileKey.set_contents_from_string(${changeString})
fileKey.make_public()
若你有一支程式需要定時跑的話,
Heroku 提供 Schdeuler 簡單地達到你的需求,
Heroku Scheduler | Heroku Dev Center
1. 要求 heroku 在你的帳號啟用 scheduler 服務。
若你的帳號資訊未填寫信用卡資訊,Heroku 會先要求完成信用卡資訊填寫,schedluer 跟 app 服務一樣,一個月有固定的免費配額可使用。
$ heroku addons:create scheduler:standard
2. 進入 app dashboard 會發現多了 Heroku Schdeuler 選項。
3. 隨意將一個 python 程式上傳至 remote master,並測試確認程式正常。
$ heroku run python test.py
4. 在 Heroku Schdeuler 內 add new job。
完成。
Heroku,一個偶然看到的網站,是一套 Paas 的服務,建立在 Amazon EC2 的雲端架構上,
Dynos 是其基本的服務單位,以每小時單位計價,隨著服務規格不同,如記憶體或 CPU 等,提供不同價格的方案,
基本上就是你不需要擔心實際的資源配置以及系統架構,
並提供各式各樣的底層服務來讓你選擇組合,方便快速的整合讓你專心開發應用程式。
前言
會有興趣是因為這些雲端運算或 Amazon 以前只會在書上或考題上看到,
剛好又在練習 python 以及好奇 server API 運作的情況下,
心想不如來實際操作看看寫一支小小的 python 程式放在 heroku 上來處理 GET/POST 連線。
可以按照 Getting Started with Python on Heroku 的步驟來建置,
不過我只是個用 editor 寫小小 python 程式的人,過程中其實遇到一點點的阻礙加上一點點的不知道自己在做什麼,
因此在這邊列出成功的操作步驟加上一點點的說明,來清楚的紀錄整個流程。
< 申請 heroku 帳號 >
< 部署環境 >
1. 安裝 Heroku toolbelt
Heroku toolbelt
基本上因為必須操作 heroku 的指令,你必須先裝上 heroku 的 command line tool。
2. heroku login
當你完成安裝後,便可以使用 heroku 指令來使用剛剛申請的帳號進行登入。
$ heroku login
3. 建立專案根目錄
再來請建立一個資料夾作為你的應用程式的根目錄,並且移動到此根目錄底下。
$ mkdir helloflask
$ cd helloflask
4. 安裝 Virtualenv
Virtualenv 是一個可以創造出 python 虛擬環境的工具,用來為你的專案架設獨立的環境,
在這邊 heroku 認為你已經安裝好 Virtualenv,若沒有裝過的話,要先進行安裝。
$ easy_install virtualenv
5. 建立並啟動 Virtualenv 環境
$ virtualenv venv
$ source venv/bin/activate
6. 安裝 Flask
Flask 是一個以 python 語言為主的 MicroFramework,以此來實作我們的 python 程式。
$ pip install Flask gunicorn
7. 建立一個簡單的 application
在這邊我們先寫一個非常簡單的程式,來測試環境是否架設成功。
import os
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello World!'
if __name__ == '__main__':
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)
8. 建立 Procfile 以及 requirements.txt
在這邊 heroku 會先請你定義使用 web 方式來執行應用程式,並寫入名為 “Procfile" 的檔案以及建立環境設定檔。
$ pip freeze > requirements.txt
$ echo web: python app.py > Procfile
9. 執行 web service
$ foreman start
接下來就可以開啟瀏覽器輸入 https://localhost:5000,就能看到 'Hello World!' 出現了。
10. push 至遠端伺服器
heroku 會為你建立好遠端分支,這時候必須進行一些 git 的操作,push 到遠端分支上來 deploy 程式碼,
成功 push 之後,在 Heroku | Apps 上就能看到你的應用程式,
下一篇:處理連線
將環境建置完成後,再來要試著來處理 GET/POST 連線,
其實沒有真正要做什麼東西,只是想要玩玩看是否真的能成功來 post 資料並且顯示在 web 上,
目標如下:
POST
- 收到 POST 連線後,抓到 post data
- 將 data 內容 output 成一個文字檔
- 回傳收到的 data, time, from ip
GET
- 讀取文字檔內容
- 在 web 上顯示最新的 data 資訊
實作
import flask
import functools
import os
import datetime
import time
app = flask.Flask(__name__)
@app.route('/wtf', methods=['POST', 'GET'])
def wtf():
fileName = 'lastReceive.txt'
if flask.request.method == 'GET':
getFile = open(fileName, 'r')
text = getFile.read()
getFile.close()
spilt = text.split('$')
return '<br>' + 'Last Received POST Data is : "' + spilt[0] + '"' + '<br>' + 'From : ' + spilt[1]+ '<br>' + 'Date : ' + spilt[2]
elif flask.request.method == 'POST':
receivePost = flask.request.stream.read()
ip = flask.request.remote_addr
now = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
write = receivePost + '$' + ip + '$' + now
if not os.path.isfile(fileName):
tempFile = open(fileName, 'a')
else:
tempFile = open(fileName, 'w')
tempFile.write(write)
tempFile.close()
return '<br>' + 'Receive POST Data is : "' + receivePost + '"' + '<br>' + 'From : ' + ip + '<br>' + 'Date : ' + now
def main():
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)
if __name__ == '__main__': main()