掐指一算,自己第一次使用 AWS 已經是兩年前的事情了,這也是雲計算和大數據等技術迅猛發展的兩年。這期間,大抵間間斷斷地使用着,FreeTier Instance 也運行快一年了,馬上進入收費周期。雖然中間用過一段 Aliyun 的產品(被坑了不少錢),同時現在每月給DigitalOcean 貢獻 $5,但是只有AWS的培訓有參加過,幾個活也是用AWS完成的,算是了解得比較深入。這里且記錄一下使用經驗,算是總結,也是一種知識梳理。
由於比較常用計算密集型的任務,選擇EC2 Spot Instances + SQS + S3的組合較為符合需求。在不需要Auto Scaling的情況下,主要的思路如下:
- Sending EC2 Spot Instances Requests
- Sending Messages into SQS
- Start python scripts on EC2 instances
- Upload python scripts to S3 and download it on EC2 instances
- Get Messages from SQS and saving results to S3
SQS 是一個消息隊列系統,以服務的方式提供后,對於整個架構中各模塊的解耦是非常有用的。S3用於存儲初始數據和處理結果,以及啟動腳本。EC2 就是處理數據的節點。
1. S3
s3 = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) bucket = s3.get_bucket(DATA_BUCKET) key = bucket.new_key(KEY_BOOT) #key.set_contents_from_string(startup) key.set_contents_from_filename(SCRIPT_BOOT)
2. SQS
def send_message_sqs(q, id):
message = q.new_message(body=simplejson.dumps({"key":id}))
print q.write(message)
sqs = boto.connect_sqs(KEY, SECRET)
q = sqs.create_queue(REQUEST_QUEUE)
for id in ids:
send_message_sqs(q, str(id))
3. EC2 Spot Instances
request = conn.request_spot_instances(price=AWS_MAX_PRICE,
image_id=AWS_IMAGE_ID,
count=AWS_INSTANCE_COUNT,
type=AWS_REQUEST_TYPE,
key_name=AWS_KEY_NAME,
security_groups=AWS_SECURITY_GROUPS,
instance_type=AWS_INSTANCE_TYPE,
placement=AWS_PLACEMENT,
user_data=BOOTSCRIPT % {
'KEY' : AWS_ACCESS_KEY_ID,
"SECRET" : AWS_SECRET_ACCESS_KEY,
"DATA_BUCKET" : DATA_BUCKET,
"KEY_BOOT" : KEY_BOOT,
'BOOT_SCRIPT_PATH': SCRIPT_BOOT_PATH_SPOT
})
http://aws.amazon.com/ec2/purchasing-options/spot-instances/spot-and-science/
