2013年12月8日 星期日

MiTAC - Google Cloud Platform Starter Request

由MiTAC GCP Support Team製作,提供給產品需要使用到GCP服務的開發者申請試用Quota,請協助詳細填寫

Google Cloud Platform的申請書

我們將儘快與您聯繫,在此感謝您對Google產品的支持,也希望可以持續提供給您更優質的服務。
關於GCP的相關介紹,可以參考:
  1. Google Cloud Platform網站:http://cloud.google.com
  2. Google Cloud Platform簡介(由MiTAC製作):http://www.slideshare.net/peihsinsu/google-cloud-platform-1
  3. 歡迎加入MiTAC-GCP Group: https://groups.google.com/forum/#!forum/micloud-google-cloud-platform-group

2013年11月21日 星期四

Google Cloud Platform Workshop - 20131120

Workshop名稱:Google Cloud Platform Workshop
主辦單位:Hadoop.TW
協辦單位:Google, MiTAC
日期:2013/11/20 PM 7:00-9:30
開場:Jazz, Jesse
演講:
  • Bee Loon Tan: Introduction to Google Cloud Platform
  • Karthik Rajasekharan: MapReduce on Google Cloud Platform
  • Karthik Rajasekharan: BigQuery on Google Cloud Platform

Workshop的由來
Hadoop.TW是台灣地區著名的技術社群之一,由國網中心Jazz所創辦,群集對Hadoop這門技術有興趣的各方好手,彼此討論與交換Hadoop相關的技術資訊。本次有幸與Google Cloud Platform APAC區代表Bee相遇,並且邀請Google團隊來分享在大量資料上的Google Solution,而Workshop的場地與後續的活動規劃則由台灣區Google Cloud Platform代理商MiTAC提供。


Introduction to Google Cloud Platform (Bee)


Bee是APAC地區Google Cloud Platform負責人,帶領著Karthik服務APAC區雲端服務曲球之用戶。很高興這次能夠邀請到Bee負責Introduction to Google Cloud Platform這個Session。在Bee的演講當中,主要帶出Google在雲端服務的演進歷程,Google以搜尋起家,不斷致力於提供更完善的雲端服務,更將基礎建設都建置於安全認證與綠能認證的機房當中,今年度,Google開啟Cloud Platform計畫,要將Google等級的速度、安全、穩定、服務營運帶給大眾,深入Google Cloud Platform包含了以提供運算能力為主的:App Engine, Compute Engine,以提供儲存能力的Datastore,CloudSQL,Cloud Storage,以及提供應用程式服務的BIGQuery… 眾多的雲端服務,目的是要帶給使用者完整的解決方案!




Karthik是Google的APAC區技術負責人,具有豐富的學歷與經歷,更是位資料領域的專家,與Bee及神通搭配,服務台灣地區Google Cloud Platform需求用戶,本次Workshop由Karthik主講MapReduce on Google Cloud Platform與BigQuery on Google Cloud Platform兩主題。


MapReduce on Google Cloud Platform (Karthik)



Karthik在與現場的技術人員互動中,首先帶入了Google在大量資料運算演進中的貢獻,從GFS、MapReduce、Big Table、Dremel到Spanner、Colossus等的概念的釋出,Google在雲端的領域在在都掀起IT界的風潮。GFS帶出了Hadoop的HDFS概念,並透過MapReduce的理論設計出現在的Hadoop運作原理,讓處理巨量資料成為可能。2008年的Dremel技術文章一出,更讓Apache採用此概念實作了Drill,讓即時的資料分析概念漸漸成形。現在,Google更將這些服務精進,以BigQuery的方式提供給全世界的使用者能夠直接使用該服務,一次解決資料儲存與分析的問題,更可以與其他的Google服務結合,達到更多樣的應用。
Google Cloud Platform服務大量資料的整體架構中,Hadoop服務亦佔有一席重要之地,Compute Engine的開放,讓Hadoop的架構可以透過簡單的程式撰寫來動態建置一個巨大的Hadoop Cluster,初步分析得到有價值的資料,進而搭配BigQuery得到更據價值之資料。
演講中,Karthik介紹Hadoop在GCP上的應用,連續展示幾個殺手級的應用。首先是一次開立100台主機的動作,100台主機在一分多鐘完全開立完成並可服務,透過與Google Cloud API的搭配,使用者可以完全不用擔心主機數量問題。在與Hadoop搭配的應用上,Karthik展示透過Google Compute Engine主機開立後自動部屬Haddop Cluster,並可以自動部屬範例程式至Hadoop Cluster進行運算動作,這些展示,都可以搭配Google CloudStorage來達到更快速且便利。最後Karthik展示Hive與Pig等高階Hadoop工具的自動部屬,讓您可以隨時擁有互動性的Hadoop介面,讓資料的萃取更加方便。


BigQuery on Google Cloud Platform (Karthik)




接下來是從Hadoop在Google Cloud Platform上的應用情境進入BigQuery的主題,此時探討的是更加便利的巨量資料處理情境,BigQuery以Google Search的概念(類似Hadoop的架構),結合Google大量的運算資源與穩定且快速的網路頻寬,針對使用者儲存的大量資料,可進行SQL like語法的查詢動作。數以億計的資料筆數、數TB的資料大小,都可以在數十秒到數秒之間回應,使用者不用再去建置大型資料庫、資料倉儲、OLAP分析工具等來分析資料,也不用等待數小時的時間才能得到回應... 情境的展示部分,Karthik透過簡單的Wikipedia資料集,該資料集有313億筆資料,35GB的資料大小,簡單的count(*)在2.2秒得到回應,再深入的查詢包含hadoop關鍵字的標題,也輕易的在5秒左右查詢出結果... 簡單的展示,讓現場的技術人員深知未來是資料分析的世界,如何在資料海中找出有用的資料,速度將會是決勝的關鍵。


總結



非常感謝Google團隊與Hadoop社群舉辦本次的Workshop活動,在本次的Workshop當中,Google團隊以深入淺出的方式帶領現場的與會人員能夠通盤了解巨量資料的演進與Google針對巨量資料分析的工具與方法,讓Google團隊的經驗與技術能夠傳承給台灣地區的頂尖技術人員們,在場人員一致感謝Google團隊在資訊領域的貢獻,也誠真的希望Google團隊將來能夠持續分享給我們最新的雲端資訊。

2013年11月14日 星期四

Google Cloud Platform Workshop - MiTAC


很榮幸邀請到來自新加坡的 Google Cloud Platfotm 講者
來跟大家分享 Google Cloud Platform 的簡介,如何在上面跑 MapReduce
甚至直接使用 BigQuery 進行大量資料的查詢

活動大致分為三個部份,
- Introduction to Google Cloud Platform
- MapReduce on Google Cloud Platform
- BigQuery on Google Cloud Platform

本次活動由Hadoop TW社群主辦
時間為 11/20 晚上7點到9點半


歡迎有興趣的社群同好,共襄盛舉。
報名網址!

2013年9月25日 星期三

Ejs page scope直接使用session物件的方式

在操作ExpressJS的Ejs View Engine時候
發現針對頁面上的操作並不是那麼的順心
舉個例子:
app.js中做一個route希望能夠將值往前端(.ejs)帶,但是前端implement了express-partials的模組,希望把頁面用template的方式組織起來,並且在template page中會用到一部分的參數... 假設有時個route用到這個template,則每個route都必須把參數設定進去,否則後端會接收到"not defined"的錯誤訊息...

上面例子的片段程式碼如下:

[app.js]
app.get('/', function(req, res){
  res.render('index', { title: 'my express page' });
});

[index.ejs]
<% if(user) { %>
<%= user %>
<% } %>

執行時候會有Exception:
...(skip)
user is not defined
...(skip)

這部份的錯誤應該是Ejs在render page時候造成的,它直接throw Exception而會造成page終止render,在遍尋不著比較好的方法時,從某篇文章找到一些蛛絲馬跡...

原來Ejs使用"locals"這個物件來包裝頁面上會用到的所有參數,而經過ejs的scriptlet tag包裝起來的部分,可以直接使用locals裡面的參數,也就是說上面的app.js做page render時候:

res.render('index', { title: 'my express page' })

相當於把title這個參數與ejs頁面的locals變數做整合
亦即ejs頁面操作:

<%=title%>


<%=locals.title%>

是相等的,但是直接操作title屬性時候,會被ejs compile成runtime exception,這導致如果在ejs中執行下面判斷會出錯;

<% if(user) { .... %>

因為實際上locals.user不存在,且ejs compiler會將不存在的狀況throw exception...

解決方式,直接使用locals來判斷裡面是否有user這個變數...,因此改寫上面的判斷後:

<% if(locales['user']) { .... %>

應該就可以正常運作...


2013年9月23日 星期一

尋找Google的創新: Google Cloud Platform - CloudSQL使用過程記錄

尋找Google的創新: Google Cloud Platform - CloudSQL使用過程記錄: 今天介紹GCP(Google Cloud Platform)之下的DB生力軍:CloudSQL 透過新版本的Cloud Console( https://cloud.google.com/console) 來建立一個Cloud MySQL instance並不難,原則上是填妥資料...

2013年9月17日 星期二

關於ewant育網

MiCloud與育網

育網(ewant)是最近Host在MiCloud上的MOOCs服務,透過交大熱心的教授與同學發起,經過介紹到MiCloud上建置服務,經過與MiCloud幾番討論後,平台已經於9/18上線,歡迎大家現在就加入育網(註冊),一起體驗育網評台!

關於ewant育網 (http://www.ewant.org) 

ewant育網平台是由兩岸五校交通大學 (包括上海交通大學、西安交通大學、西南交通大學、北京交通大學及國立交通大學) 共同合作發起、以全球華人為主要服務對象的開放教育平台,為所有想要學習的華人提供免費的課程及學習資源。本平台以社會企業的精神經營及推動,獲得的所有盈餘將全部再投入育網平台及開放教育的推動。

課程、微學程及認證機制 

ewant育網平台會持續號召大陸、台灣、港澳與歐美的重點大學及頂尖教師提供優質的免費課程,課程內容包含課程大綱、教學影片、講義、作業測驗及補充教材等。除此之外,平台也提供師生彼此之間多樣的互動交流機制,並在網路上形成學習社群,儘量讓學習者在線上學習的環境中產生如同身處傳統教室的臨場感。學習者更可以依照自己的興趣及時間彈性調配選修課程,突破時間與空間的限制,方便的隨時、隨地、隨興取得學習資源。
此外,我們率先在開放教育平台上推廣「微學程」的概念。所謂微學程就是一組經過精心設計、有系統關係的課程。每一個微學程包含三門以上課程,課程彼此間有明確的連貫性及深入淺出的安排,每一個微學程的課程將在1-2年間陸續開出,讓學習者可以依循這些規畫,進行有系統及有計畫的學習。學完這一組經過設計的課程後,學習者將更能完整的了解及應用一門學問。
育網平台提供完整的在線教育模式,經過教學互動及學習評量等運作機制,最終可以提供課程修課通過證明。我們也將與企業界合作,透過育網平台協助企業進行教育訓練及徵選所需人才。

我們的願景 

華人地區擁有全世界最多的高等教育人口及網路使用人口,在全球化的開放教育潮流中,華人應該居於不可忽視、甚至領導的地位。我們期許 ewant 育網能起示範作用,突破大學的藩籬,讓所有華人都能無償享受到高品質的教育資源及免費的終身教育,真正達到至聖先師孔子千年以前所說「有教無類」的期望。

2013年8月21日 星期三

從新版本CloudAPI看SDC 7...

不算最新消息,關注smartdc套件的朋友應該早有觀察到,有不少重大改變唷...給大家參考 :D


下面資訊,引用自官方:

Appendix E: SDC 7 Changelog
Cloud API and SmartDC CLI have been completely rewritten for SDC 7.0. Notably, required version of Node.js to run the CLI is now greater or equal than 0.8.14.
Most of the commands remain the same, taking exactly the same options and returning exactly the same JSON information in an attempt to preserve backwards compatibility between 6.5 and 7.0 API clients, and software built for 6.5.
There are, anyway, some important differences between SDC 7.0 and the previous version, where the main one is:
  • The request version of SDC 7.0 CLI is, obviously, ~7.0 instead of 6.5.
  • This means that the parameter --dataset (or the equivalent -e short option) is mandatory for the command sdc-createmachine. On previous versions of the API, it was possible to provision a machine without specifying an image to the create machine command. This behavior has been deprecated, and the desired image must be specified.
  • Also, starting at version 7.0, there isn't a default dataset. For backward compatibility purposes, when a request using ~6.5 is received, the latest version of the smartos dataset will become the default one.
  • Starting with version 7.0, virtual machines can also be resized but, only resizing virtual machines to a higher capacity/package is supported.
  • Version 7.0 also deprecates the URN attribute for any entity, either Images or Packages. URN support will finish with SDC 6.5 support.
  • Starting with version 7.0, packages listed by GET /:account/packages accept search filters. Additionally, the package members vcpusidand version are included on packages, as explained into packages section.
  • Since Version 7.0 historical list of machine accomplished actions is available through request GET /:account/machines/:id/audit.
  • Version 7.0 adds the ability for customers to manage Firewall Rules through /:account/fwrules resource, as explained into Firewall Rules section.
  • Version 7.0 exposes account details through GET /:account, and allows the modification of the account properties - with the exception of password and login - through POST /:account. Details are explained into the Account section
  • Version 7.0 exposes Networks details through /:account/networks resource, as explained into Networks section.
  • Since Version 7.0.0 node-smartdc's sdc-createmachine accepts an optional --networks|-w argument, which can be set to the id of one or more of the networks retrieved from /:account/networks.

Setting rsync service on SmartOS

Rsync是一套歷久彌新的Linux/Unix系統備份工具,透過rsync可以達到差異的備份方式,讓整個備份的動作可以更有效能的執行... 而MiCloud上提供的主機預設都預載有rsync的功能,而Linux上使用可能大家已經有嚐試過,這邊複習一下,也順便說一下Windows (沒錯,Windows上也可以透過rsync來將資料備份到遠端的rsync server上唷!)上操作rsync的方式。

Rsync Server設定

Step 1: 編輯設定檔
$ vi /etc/rsync.conf
內容:
log file = /tmp/rsyncd.log
pid file = /tmp/rsyncd.pid
port=873
[backup]
hosts allow = 192.168.1.10              #允許的clisnt IP
hosts deny = *                          #除上面allow設定的IP,不允許存取的Client,請設為* 全部
comment = ewant upload file backup
path = /home/backup/upload
uid = root
gid = root
auth users =backup
secrets file = /etc/rsyncd.secrets
read only = no
exclude = temp/ .*                      #要排除的備份檔案或目錄,須以空格區分

設定檔中的backup是備份的模組,這個名稱可以自由取,將會用在client端操作指令上

Step 2: 編輯密碼檔
$ vi /etc/rsyncd.secrets
內容:
backup:xxxxxxxxxxxxxxxxx

上面rsyncd.secrets文件中是存放"帳號:密碼"的內容,最後,密碼檔案必須將權限變更為600,不然連線上會有異常...

Step 3: 啟動服務
$ rsync --daemon --config=/etc/rsync.conf --no-detach

啟動服務的部份,如果沒有加上--no-detach的話,則服務會啟動在背景運作

Client端操作(SmartOS/Linux/Mac)

大部分的Linux/Unix系統都有預載rsync了,這部份部戲談安裝部分...

Step 1: 編輯密碼檔
$ vi .rsync
內容:
xxxxxxxxxxxxxxxxx

此步驟勢將server side step 2中設定的密碼部分寫入密碼檔,檔案位置存放在可以讀取的位置即可,名稱也不拘,之後指令需要指定密碼檔的路徑與名稱

Step 2: 執行同步
client端的同步指令如下:
rsync -avz --password-file=[密碼檔][欲同步資料夾] backup@[rsync server ip位置]::[模組名稱]
範例:
$ rsync -avz --password-file=.rsync /tmp/test backup@192.168.1.10::backup


Client端操作(Windows)

Windows的安裝,請至: https://www.itefix.no/i2/cwrsync-get 取得安裝檔,安裝與基本的操作可以參考官方文件。安裝完成後,需要設定環境變數PATH可以吃得到安裝的目錄下的bin,這樣才可以使用到下面的rsync指令,我所安裝的版本因為只有cygrsync.exe,這邊我直接做一個快捷,命名為rsync.cmd,這樣日後操作上比較方便。

Step 1: 編輯密碼檔
同Linux系列的Step 1

Step 2: 執行同步
指令的操作部分,指令格式不便,但因為系統先天性差別,路徑的寫法稍微與Linux系列有所不同...
  • 其中路徑仍然只吃"/"而不是Windows慣用的"\"
  • 針對磁碟位置的定義,最前面要加上"/cygdrive",例如: c:/opt/rsync.conf,則路徑定義為:/cygdrive/c/opt/rsync.conf
  • 操作人員,不能是Administrator (這部份滿怪的,但是實際上操作如果是Administrator,則會出現"password file must be owned by root when running as root"的錯誤,說明文件在這裡)
範例:
$ rsync -avz --password-file=/cygdrive/c/Users/simon/.rsync /cygdrive/d/tmp/test backup@192.168.1.10::backup

不透過Rsync Server,直接做Rsync

架設rsync server雖然說不難,但是終究多了個餓步驟,其實rsync也可以像scp一樣直接來的... 指令如下:

rsync -r [預備份資料] [備份目的地]

範例:
$ rsync -r /cygdrive/d/tmp/test backup@192.168.1.10:/home/backup/upload

上面操作是針對Windows的系統(路徑有指定了/cygdrive),如果是Linux系列的使用者,直接使用Linux路徑即可∼

參考文獻:

2013年8月18日 星期日

Easy use of HAProxy

專門的事情交給專業去做 - 如果要做LB,交給 - HAProxy準沒錯!
感謝許多網友的介紹(這位仁兄的部落格有非常詳細的說明)
透過HAProxy可以快速做到網站服務基本的Load Balancing
在MiCloud上要架設一台HAProxy就更快了...

準備:
申請一台SmartOS,建議申請Standard64主機,套件支援到2013Q1

STEP1: 查找支援的haproxy版本

$ pkgin se haproxy
haproxy-1.4.21       Reliable, high performance TCP/HTTP load balancer

=: package is installed and up-to-date
<: data-blogger-escaped-available="" data-blogger-escaped-but="" data-blogger-escaped-installed="" data-blogger-escaped-is="" data-blogger-escaped-newer="" data-blogger-escaped-package="" data-blogger-escaped-version="">: installed package has a greater version than available package


STEP2: 安裝合適版本套件

$ pkgin install haproxy-1.4.21
calculating dependencies... done.

nothing to upgrade.
1 packages to be installed: haproxy-1.4.21 (2592K to download, 0B to install)

proceed ? [Y/n] Y
downloading packages...
haproxy-1.4.21.tgz                               100%  928KB 132.6KB/s 149.9KB/s   00:07
installing packages...
installing haproxy-1.4.21...
haproxy-1.4.21: copying /opt/local/share/examples/haproxy/haproxy.cfg to /opt/local/etc/haproxy.cfg
//////////////////////////////////////////////////////////////////////////////

This package is SMF enabled, which means you can use SMF to 'enable',
'disable' or 'restart' the persistent daemon process, e.g.:

  svcadm enable haproxy:default

The SMF manifest was automatically imported now.

See our wiki on what's SMF and how to use it to your advantage:

  http://wiki.joyent.com/display/smart/About+the+Service+Management+Facility

//////////////////////////////////////////////////////////////////////////////
pkg_install warnings: 0, errors: 0
reading local summary...
processing local summary...
updating database: 100%
marking haproxy-1.4.21 as non auto-removable
- See more at: http://blogger.micloud.tw/#sthash.9ZPGTyp4.dpuf

STEP3: 設定HAProxy

完整的設定在網路上很多,這邊不細談設定部分,只精簡的說明要proxy某台主機的作法:

STEP4: 最後,起動一下服務(因為服務是由SMF方式掛載,可以透過svc*系列指令操作,詳情可以參考:)

$ svcadm enable haproxy

檢查:如果state(第一個欄位)為online的話,表示服務啟動OK拉∼

$ svcs haproxy
STATE          STIME    FMRI
online          3:03:20 svc:/pkgsrc/haproxy:default

Debug:

$ svcs -xv haproxy <-- 檢查啟動是否有相依性錯誤
$ tail -f `svcs -L haproxy` <-- 檢查服務運作screen output log

關閉服務:

$ svcadm disable haproxy

重起服務:

$ svcadm restart haproxy




2013年8月10日 星期六

MiCloud課程資訊

MiCloud於2013年第三季開始提供許多課程供內部與外部人員參與,課程內容將以MiCloud之應用與使用Node.js開發雲端服務為主題,課程的點點滴滴將記錄於網站(https://sites.google.com/a/mitac.com.tw/training),供大家參考。

課程內容包含:
  • MiCloud服務相關
  • Node.js初階~進階課程
歡迎有興趣的朋友報名參加

2013年8月5日 星期一

MiCloud CloudAPI CLI - Tag & User Script, 使用 User Script 建立 VM 環境

MiCloud CloudAPI繼承 Joyent CloudAPI而持續研發更多的功能,前面已經介紹如何入門使用 MiCloud CloudAPI

本篇在介紹以 CloudAPI 建置 Machine 的進階應用: 使用 CloudAPI 的 Tag 與 metadata 。

Machine的屬性


在 Machine 建立的當下,MiCloud 賦予 Machine 一些主機上的特殊屬性,讓使用者可以透過API的方式查詢,一般我們可以在 CLI 上查詢 Create Machine 的 help page 可以知道有哪些參數可以帶入:

# sdc-createmachine --help
sdc-createmachine [--account string] [--debug boolean] [--dataset string] [--help boolean] [--identity path] [--keyId string] [--metadata ] [--name string] [--package string] [--tag ] [--url url]


其中 tag 參數 metadata 參數是今天要介紹的重點...

關於Tag


tag 是一個以 key/value 存在的一組一組值,附屬在主機之下,在 CloudAPI 中可以透過下面方式對主機增加 tag (其中主機的 id 可以在 sdc-listmachines 中,每台主機的 id 欄位中找到):

# sdc-addmachinetags --tag servername=testtag01 [your machine id]
{
  "servername": "testtag01"
}


如果希望依次新增多個 tag,也可以這樣做:

# sdc-addmachinetags -t foo=bar -t servername=testtag01 b34f99ea-ef8d-4332-b043-9f4d49104833
{
  "servername": "testtag01",
  "foo": "bar"
}

然後可以透過 sdc-listmachinetags 來顯示主機的 tag 有哪些...

# sdc-listmachinetags [your machine id]
{
  "servername": "testtag01",
  "foo": "bar"
}


如果在 shell 中欲使用到 tag 中的某一個數值,可以這樣做
(PS:請先安裝json tool套件:npm install jsontool -g)

# sdc-listmachinetags b34f99ea-ef8d-4332-b043-9f4d49104833 | json foo
bar


對於一個管理者而言,tag 可以當做附加給這台主機的一些額外屬性,讓主機可以有更多的資訊可以作為日後自動化的參考值...

關於 Metadata / User Script


metadata 裡面主要存放與 tag 相同格式的 key/value 的參數值,而不同的是,當您設定 key=user-script 時候,將會有特殊的用途

主機將在 boot 時候,直接使用 shell 執行 user-script 裡面所帶的參數內容,此部份的設定是讓使用者可以自訂開通或開機時候的執行腳本,讓自動化部屬在每次開機時候完成...
如果主機一開始沒有設定任何 user-script 時候,使用 sdc-getmachinemetadata 會得到空的 json 物件

# sdc-getmachinemetadata b34f99ea-ef8d-4332-b043-9f4d49104833
{}


而,可以透過與 tag 相通的設定方式在主機上 attach 參數(唯一不一樣的是,它叫做sdc-updatemachinemetadata)


# sdc-updatemachinemetadata --metadata foo=bar b34f99ea-ef8d-4332-b043-9f4d49104833
{
  "foo": "bar"
}


查詢參數的方式是使用 sdc-getmachinemetadata 來查詢

# sdc-getmachinemetadata b34f99ea-ef8d-4332-b043-9f4d49104833
{
  "foo": "bar"
}


以上,設定與key的操作大同小異...

如果要機器聽話在開通或開機完成的時候自動執行您的腳本,直接在 metadata 指定key=user-script的屬性,並且帶入值為您欲執行的腳本即可:

# sdc-updatemachinemetadata --metadata "user-script"="echo HELLO > /root/user-script.log" b34f99ea-ef8d-4332-b043-9f4d49104833
{
  "foo": "bar",
  "user-script": "echo HELLO > /root/user-script.log"
}


設定完的 user-script 可以透過 sdc-getmachine 來看到設定的結果:

# sdc-getmachine b34f99ea-ef8d-4332-b043-9f4d49104833
{
  "id": "b34f99ea-ef8d-4332-b043-9f4d49104833",
  "name": "212ec88",
  "type": "smartmachine",
  "state": "running",
  "dataset": "local:robin:hadoop-node:0.1.0",
  "ips": [
    "211.78.254.144"
  ],
  "memory": 1024,
  "disk": 15360,
  "metadata": {
    "foo": "bar",
    "user-script": "echo HELLO > /root/user-script.log"
  },
  "created": "2013-03-23T14:50:21+00:00",
  "updated": "2013-06-07T04:29:29+00:00",
  "primaryIp": "211.78.254.144"
}

主機重新開機後,user-script 將會應用至該主機:

# sdc-rebootmachine b34f99ea-ef8d-4332-b043-9f4d49104833

# ssh root@211.78.254.144
Last login: Fri Jun  7 10:59:34 2013 from 211.78.254.110

[root@b34f99ea-ef8d-4332-b043-9f4d49104833 ~]# ls -l
總計 1
-rw-r--r-- 1 root root 6 6月   7 12:30 user-script.log
[root@b34f99ea-ef8d-4332-b043-9f4d49104833 ~]# cat user-script.log
HELLO


順道一提,當在撰寫 user-script 時候,script 的內容可以直接參考到其他的 metadata 屬性,例如:


sdc-updatemachinemetadata \
--metadata "user-script"="echo HELLO $USER > /root/user-script.log" \
--metadata USER=simon b34f99ea-ef8d-4332-b043-9f4d49104833

則重開機後,會發現 user-script.log 裡面會是:

# cat user-script.log
HELLO simonsu


另一種建立 user-script 的方式,是直接在 create machine 的參數中給予 script 參數,內容需要帶入一個腳本檔案,範例如下:

建立主機的指令:

# sdc-createmachine \
--dataset local:robin:hadoop-node:0.1.0 \
--package "S 1GB RAM (1CORE)" \
--script ./install.sh \
--tag servername=JoomlaServer01


其中 install.sh 內容如下

# cat install.sh
curl -k https://raw.github.com/micloud/installer/master/smartos-standard64/install-joomla.sh | sh

以上,給需要自動化部屬 Cloud Machine 的使用者參考

2013年7月29日 星期一

MiCloud API Analysis, Dtrace

MiCloud API Analysis


MiCloud 繼承 Joyent 的雲端平台,提供有一個進階的服務監控方式 -- Dtrace,這是個非常進階的狀態監控系統,原生於Solaris Unix上,已有 Mac 與 SmartOS 的實作套件,亦可於 MiCloud環境上直接使用。

本篇講解如何使用 CloudAPI 操作此部份分析功能。

首先請大家先準備好 Node.js 環境與 CloudAPI ,假設大家已經安裝好Node.js,那只要透過下面指令就可以安裝 CloudAPI (由於SDC環境持續改板中,請安裝對應目前 MiCloud 環境的smartdc套件,目前選定的是 6.5.4 版本的 smartdc ):

npm install smartdc@6.5.4


安裝好相關套件後,可以透過sdc-describeanalytics指令查詢有哪些可用分析:

$ sdc-describeanalytics


針對回應的部份將會相當長…其中切幾個部分來看:

(1). 模組概述: 此部份為所有監控項目的大略說明

{
  "modules": {
    "cpu": {
      "label": "CPU"
    },
    "memory": {
      "label": "Memory"
    },
    "mysql": {
      "label": "MySQL"
    },
    …(略)
    "zfs": {
      "label": "ZFS"
    }
  },


(2). 欄位說明: 此部份為每種欄位的設定說明

  "fields": {
    "zonename": {
      "label": "zone name",
      "type": "string"
    },
    "pid": {
      "label": "process identifier",
      "type": "string"
    },
    "execname": {
      "label": "application name",
      "type": "string"
    },
    …(略)
    "errno": {
      "label": "error code",
      "type": "string"
    },
    "zdataset": {
      "label": "ZFS dataset",
      "type": "string"
    }
  },


(3). 型別說明:此部份說明於分析上定義的基本資料型態有哪些...

  "types": {
    "string": {
      "name": "string",
      "arity": "discrete",
      "unit": ""
    },
    "subsecond": {
      "arity": "numeric",
      "unit": "seconds",
      "abbr": "s",
      "base": 10,
      "power": -3,
      "name": "subsecond"
    },
    …(略)
    "number": {
      "arity": "numeric",
      "name": "number",
      "unit": ""
    }
  },


(4). 可用監控設定說明: 這個是主要監控要設定的參考值...

  "metrics": [
    {
      "module": "cpu",
      "stat": "thread_samples",
      "label": "thread samples",
      "interval": "interval",
      "fields": [
        "zonename",
        "pid",
        "execname",
        "psargs",
        "ppid",
        "pexecname",
        "ppsargs",
        "subsecond"
      ],
      "unit": "samples"
    },
    {
      "module": "cpu",
      "stat": "thread_executions",
      "label": "thread executions",
      "interval": "interval",
      "fields": [
        "zonename",
        "pid",
        "execname",
        "psargs",
        "ppid",
        "pexecname",
        "ppsargs",
        "leavereason",
        "runtime",
        "subsecond"
      ],
      "unit": "operations"
    },…(略)
    {
      "module": "zfs",
      "stat": "dataset_quota",
      "label": "quota size",
      "interval": "point",
      "fields": [
        "zdataset"
      ],
      "type": "size"
    }
  ],


(5). 轉換說明:此部份可以透過IP轉換地理位置,來進階顯示於世界地圖上…

  "transformations": {
    "geolocate": {
      "label": "geolocate IP addresses",
      "fields": [
        "raddr"
      ]
    },
    "reversedns": {
      "label": "reverse dns IP addresses lookup",
      "fields": [
        "raddr"
      ]
    }
  }
}


建立分析項目前,我們先來看看建立分析的指令…

$ sdc-createinstrumentation --help
sdc-createinstrumentation [--account string] [--clone number] [--debug boolean] [--decomposition string] [--help boolean] [--identity path] [--keyId string] [--module string] [--predicate string] [--stat string] [--url url]


這邊我們先測試監控cpu的值,使用"--module cpu --stat usage"來建立分析項目,而執行後,系統匯吐回完整的設定值:

$ sdc-createinstrumentation --module cpu --stat usage
{
  "module": "cpu",
  "stat": "usage",
  "predicate": {},
  "decomposition": [],
  "value-dimension": 1,
  "value-arity": "scalar",
  "enabled": true,
  "retention-time": 600,
  "idle-max": 3600,
  "transformations": {},
  "nsources": 0,
  "granularity": 1,
  "persist-data": false,
  "crtime": 1371829609584,
  "value-scope": "point",
  "id": "3",
  "uris": [
    {
      "uri": "/peihsinsu@hotmail.com/analytics/instrumentations/1/value/raw",
      "name": "value_raw"
    }
  ]
}


最後監控步驟

植入監控後,接下來就是採收了,剛剛上面的監控設定好後,有回傳整個監控的詳細設定,其中有個id欄位,是整個監控取值的重點,透過sdc-getinstrumentation加上id來取回監控的結果… 首先來看看sdc-getinstrumentation可以使用哪些參數:

$ sdc-getinstrumentation --help
sdc-getinstrumentation [--account string] [--debug boolean] [--help boolean] [--identity path] [--keyId string] [--value boolean] [--url url]  instrumentation_id


這邊我們使用"--value true"來指定回傳部分為值,並在最後帶入"3",就是剛剛建完監控所回傳的id欄位值,然後我們可以得到下面的結果:

$ sdc-getinstrumentation --value true 3
{
  "value": 0,
  "transformations": {},
  "start_time": 1371829715,
  "duration": 1,
  "end_time": 1371829716,
  "nsources": 1,
  "minreporting": 1,
  "requested_start_time": 1371829715,
  "requested_duration": 1,
  "requested_end_time": 1371829716
}

 SimonAIR in ~
○ → sdc-getinstrumentation --value true 3
{
  "value": 48,
  "transformations": {},
  "start_time": 1371829863,
  "duration": 1,
  "end_time": 1371829864,
  "nsources": 1,
  "minreporting": 1,
  "requested_start_time": 1371829863,
  "requested_duration": 1,
  "requested_end_time": 1371829864
}


一台以上機器

但是當我們有一台以上機器時候,上面這樣的結果值就很難滿足我們監控的需求,這時候可以加入decomposition藍未來將結果做某個屬性的分類… 下面是使用zonename(就是主機建立時候系統所給予的主機ID)來建立的監控:

$ sdc-createinstrumentation --module cpu --stat usage --decomposition zonename
{
  "module": "cpu",
  "stat": "usage",
  "predicate": {},
  "decomposition": [
    "zonename"
  ],
  "value-dimension": 2,
  "value-arity": "discrete-decomposition",
  "enabled": true,
  "retention-time": 600,
  "idle-max": 3600,
  "transformations": {},
  "nsources": 0,
  "granularity": 1,
  "persist-data": false,
  "crtime": 1371830663771,
  "value-scope": "point",
  "id": "4",
  "uris": [
    {
      "uri": "/peihsinsu@hotmail.com/analytics/instrumentations/4/value/raw",
      "name": "value_raw"
    }
  ]
}


建立完成後,取值就會發現value部分將會帶出每台主機的ID,並且匯顯示對應的值...

$ sdc-getinstrumentation --value true 4
{
  "value": {
    "4066be38-321a-4884-8979-d8629284d2d0": 0
  },
  "transformations": {},
  "start_time": 1371830729,
  "duration": 1,
  "end_time": 1371830730,
  "nsources": 1,
  "minreporting": 1,
  "requested_start_time": 1371830729,
  "requested_duration": 1,
  "requested_end_time": 1371830730
}


監控記憶體

另外,下面換監控記憶體的使用量,採用"--module memory --stat rss"來監控主機,一樣以"--decomposition zonename"來分類...

$ sdc-createinstrumentation --module memory --stat rss --decomposition zonename
{
  "module": "memory",
  "stat": "rss",
  "predicate": {},
  "decomposition": [
    "zonename"
  ],
  "value-dimension": 2,
  "value-arity": "discrete-decomposition",
  "enabled": true,
  "retention-time": 600,
  "idle-max": 3600,
  "transformations": {},
  "nsources": 0,
  "granularity": 1,
  "persist-data": false,
  "crtime": 1371830787956,
  "value-scope": "point",
  "id": "5",
  "uris": [
    {
      "uri": "/peihsinsu@hotmail.com/analytics/instrumentations/5/value/raw",
      "name": "value_raw"
    }
  ]
}


接下來可以透過sdc-getinstrumentation來取值… 此時搭配json commond line tool可以更有效率的切割資料...

$ sdc-getinstrumentation --value true 5 | json value
{
  "4066be38-321a-4884-8979-d8629284d2d0": 84439040
}


當系統希望取記憶體使用數值來做其他處理時,我們也可以透過下面的方式,只把"值"取出來就好...

$ sdc-getinstrumentation --value true 5 | json value.4066be38-321a-4884-8979-d8629284d2d0
84439040


關於 json command tools,請參考:http://opennodes.github.io/wiki/index.html?page=jsontool.md



2013年6月9日 星期日

MiCloud 會員也可以使用 Google 登入!




上回我們介紹過如何透過 Google 帳號加入 MiCloud ,那已經是 MiCloud 使用者,這次我們將介紹,如何整合 Google 帳號。

已經是 MiCloud 的使用者,目前 MiCloud 增加新功能,結合 Google Account 讓你能夠有多個選擇自由登入。新的功能剛開始,底下是我們的服務解說,

首先登入到 MiCloud Portal,進入帳號管理設定,




開啟 Google SSO 服務,選擇項目:



下次如果需要再次登入的時候,可以點選頁面上的『Login with Google』附註 選項,就馬上可以透過 Google Account 帳號直接登入。




還沒有開通 Google login 的會員們,快點來啟動這個方便的服務吧!

附註:

MiCloud 會員如果要使用 Google Account SSO 登入,帳號必須相同,例如:

註冊帳號為

Google Account 就必須為

目前 Google 已經開放給予外部 domain 進行申請,歡迎大家使用這個服務吧!

如果你覺得文章對自己有幫助的話,歡迎點個讚 (like),加入 MiCloud Fans page ,最新的文章、討論與大家分享。

2013年6月7日 星期五

使用 Google 帳號登入 MiCloud


最近大家有沒有發現, Micloud 登入首頁多了一個 Google 的登入標誌呢?現在可以透過 Google 帳號來申請服務,讓我們看看要怎麼進行,

首先,進入註冊連結,




接著會要求 Google 帳號授權,點擊『允許存取』


看到成功畫面之後表示註冊成功,記得到信箱去收信,啟動你的 MiCloud 帳號。



之後就可以透過 Google Account 登入 MiCloud 服務。增加你的方便性,一個帳號多重選擇。

歡迎支持

想取得最新雲端服務,以及 MiCloud  資訊,歡迎點個讚 (like),加入 MiCloud Fans page ,最新的文章、討論與大家分享。

2013年5月26日 星期日

DNS 服務,你對於 DNS 懂多少?


DNS 安全性,開發者必知


DNS - Domain Name System,簡單的說,在網際網路上的各式主機不論IPv4或IPv6均以IP位置為識別,而DNS就是提供網際網路上IP與名稱對應的一套系統,提供大家可以透過好記的名稱來找得到服務提供主機的一個方式,後面將會從自己經驗分享 DNS 安全性問題,以及 DNS 的基本保護方式,當然『安全』從你我開始


先了解...



了解DNS之前,有些專有名詞需要再重新了解一下...


  • IP位置 - 一個識別網際網路上唯一存在的ID,要提供服務的主機都需要有對應到網路上可存取的一個IP位置,相當於一個入口,讓我們可以訪問需要的服務。
  • 協定(Protocol) - 可以想像成馬路的分類,可以給機車走的、單車走的、汽車走的、大卡車走的都不一樣,同樣的,網際網路上有HTTP走的、HTTPS走的、FTP走的...都是一些溝通的協定,背後也有自己的一個溝通的定義。
  • 網域名稱(Domain Name) - 代表著一個或一組IP位置的名稱,使用網際網路的使用者可以透過這個名稱找到相對應的伺服器存取服務。
  • 網址(URI / URL) - 一般我們稱的網址 = 協定+網域名稱+資源位置,類似:http://www.google.com/drive就是個網址的實例,我們透過他來存取對應的資源。


簡述DNS的運作原理



一般使用者了解到IP的機制後,大致上想得到每次網址列打上網址(就是domain name),下面一個最簡單的實例,當使用者瀏覽器上打上某個網址時,電腦會解攜出欲訪問的網域名稱,並且透過DNS系統查詢該網域名稱真實的IP位置後,再結合網址的資源位置直接訪問實際資源所在的位置(此時已經定位出實際IP位置,並連線該IP查詢定義位置中的資源)...






圖一、訪問網路資源概念圖


而網際網路上不是只有一台DNS Server,一般私有網路大多自己架設內部的DNS Server,以提供內部查詢使用,作用上,一方面是方便將特定私有往段服務IP定義逾期上,以提供內部使用,另一方面則是透過DNS Cache機制,讓服務的存取可以更加快速。圖二是以內部網路為例,存取網路資源時候DNS查詢的流程,而一般設定DNS時候,都會設定轉查的路徑,例如我信任Google的DNS服務,那我就會設定我的上一層DNS為8.8.8.8或8.8.4.4(此兩個IP為Google的DNS位置),所有超過我這台DNS伺服器所能回答的問題,都將往上詢問上一層DNS Server,由他回答...



圖二、內部DNS服務


而DNS詢問網域名稱的實際過程卻又複雜過圖二所交代的,實際上打上一個網域名稱,則第一層DNS向上詢問不果的時候,DNS server會去詢問該domain的root dns server(一般root dns server會定義在DNS server上),然後由root dns回應該domain是隸屬於哪台DNS server管轄,之後該DNS server就會記住這個對應,日後有該domain的DNS問題就都會詢問這個網域管理的DNS server。而這奇妙的一切,都是設定在DNS server中... 不過這邊不講設定,了解一下概念,如圖三所示:



圖三、DNS的階層是查詢(1)

最後一種情況是當DNS Server有設定子網域的時候,查詢到該網域的所屬DNS server後,該DNS server會轉查子網域負責的DNS server,再將查詢結果IP往上回傳... 圖四是說明這樣狀況的詢問流程:



圖四、DNS的階層是查詢(2)


失守DNS Server的風險


談到這邊,大致上可以猜想得到如果不幸DNS Server掛點,無法提供回應的時候,網路上將會無法解析您服務的真正位置,也就是說服務將會中斷而無法使用... 此時就是考慮IT是否用新備份的時候了,回復一台完整可供查詢的DNS Server將是服務回復的關鍵因素!
而另一個風險... 想像如果DNS server上面的紀錄(一般稱DNS record)被串改,則用戶可能就此連到別的網站去,如果被有心人士利用,則可以作為詐騙的工具...試想如果有人做了一個跟PXHome一樣的交易網站,在交易時候透過偽裝的程式就可以輕易的盜取使用者的交易或個人資料,甚至是信用卡資料,只要偽裝的網站長得一樣,一般人很難察覺... 即使有SSL加密的網站,也很難防範DNS Server被攻陷造成的傷害...



圖五、失守DNS Server示意圖


保護 DNS Server的方式


敝人在下不是網路之才,所學不深,目前了解到防範DNS server被攻擊的幾種情境,主要以DDoS最為麻煩(DNS Abuse Attack),而這些攻擊不外乎是利用大量的查詢來癱瘓DNS Server,有的神級Hacker甚至可以透過攻擊尋得漏洞侵入DNS Server... 而保護DNS server應當要做到:

  • 落實iptables的管理,非服務Port不開放,且DNS Server不要裝其他服務
  • 落實網路節點上的防火牆管理,此點同上,僅是層次上不同
  • 如不需服務大眾,盡可能改為內部存取ONLY (一般設定上可以限制存取網段,可配合iptables做設定)
  • 如不需要,請關閉any查詢 (所耗資源較大)
  • 做好DNS Cluster Group的設定 (避免掛一台而無法提供服務)

而說到保護,在好的保護不如做好完整的備份與還原機制,X戰警的金剛狼就是最好的例子...快速恢復的能力就是王道!能快速復原被攻陷的DNS Server,讓服務快速恢復營運,勝過做100種防護,而此點在目前的Cloud環境上將是最好的演示∼透過類似映象檔備份或是Image的備份,再快速生成主機,恢復服務,就不用再擔心被Hacker攻破啦∼ (PS: 漏洞還是要修啦@@) 這邊提供一個備份的策略給大家參考:

  • 日備份,以git為版本儲存體
  • 每次備份檢核前一份備份(版本)資料,透過diff做差異report
  • 差異部分通知管理者、管理者主管(交叉檢核)
  • 準備好還原機的映象檔及備機

保護用戶端 DNS Server被串改的方式


最後談到,保護用戶端的部份,我想最快的方式就是使用OpenDNS所提供的DNSCrypt工具,讓Client端跟DNS Server端建立私密通道,可保證(盡可能保證啦)中間的資料不被串改,因此,只要您所使用的DNS Server有實作此協定,可以安裝DNSCrypt試試看!

後記
上回文章我們從 gov.ph 網站安全性談起,從網站開發者的角色,從腳本語言的基本漏洞開始談起。這回我們與大家來談 DNS ,從 DNS 基本概念,到如何執行,最後講身為開發者需要注意 DNS 的哪些部分。最終最終大部分的漏洞,幾乎都是開發者的疏忽,只要多做判斷、多做保護,網站的安全性問題可以被降低許多。
MiCloud 內部也有提供 DNS 服務,給予外部、內部使用,MiCloud DNS 可以單獨申請使用,使用受信任、外部的服務,也是方法之一。
希望各位在開發、架構都能夠謹慎考量,注意到每一個細節,了解其中實作理論,讓網站開發更為完整、更為安全,避免掉無謂的安全性問題再度發生。網路上沒有絕對的安全,但是基礎的防範,是身為開發者應有的責任。

參考資料




如果你覺得文章對自己有幫助的話,歡迎點個讚 (like),加入 MiCloud Fans page ,最新的文章、討論與大家分享。