2015年3月27日

Azure App Service - 透過Logic App與API App發佈OneDrive中的相片到Facebook上

Azure App Service是新發佈的Azure服務,透過整合Web App、Mobile App、API App與Logic App,讓開發人員能夠簡單的開發出強大的應用程式。其中Web App與Mobile App即為先前WebSite服務及Mobile服務。

新推出的API App能夠透過Biztalk Service的系統整合能力,輕易的與其他服務例如Facebook、Tweeter整合。

Logic App則可以透過簡單的拖拉將各個API處理流程整合起來,讓我們不必處理繁複的系統整合也可以完成強大的功能。

以下是透過Azure App Service的Logic App與API App試著將OneDrice上的相片發佈到Facebook上的步驟,整個過程僅需要拖拉,完全不需要寫任何一行code。

  • 登入https://portal.azure.com
  • 建立一個新的API App,並為他建立一個新的Resource Group
  • 建立一個新的Logic App,加入先前建立的Resource Group

image

  • 建立完成之後,點開Logic App的Blade,展開Triggers and Actions

image

  • 如果是第一次使用,在Resource Group中應該沒有任何API App,點這裡使用現有的API App

image

  • 這個DEMO會使用到Facebook與OneDrive,一一把這兩個Connector加入

image

image

  • 然後回到剛剛的Logic App/Actions and Triggers

image

  • 就可以看到剛剛建立的Facebook與OneDrive Connector了

image

  • 接下來,我想要讓Logic App從我的OneDrive中把相片發佈到Facebook timeline上;因此,我先把OneDrive拉到畫面上
  • 接著需要驗證你的權限,點Authorize來登入OneDrice

image

  • 成功後可以看到OneDrive connector提供的幾個Action

image

  • 這裡選擇Get File,並且輸入參數,其中,File Path為我的OneDrive上的相片位置

image

  • 按下OK,然後把Facebook拉進畫面來
  • 選擇Publish Photo

image

  • 一一將資料填入相對應的欄位,下拉選單可以看到由OneDrive connector傳遞過來的參數。在檔案內容的欄位,我需要把OneDrive的GetFile/Content對應到Facebook的Image欄位。在測試時,檔案如果太大,上傳到Facebook就會失敗,我準備的測試檔案為900 KB,可以成功上傳。

image

  • Page ID欄位不填,按下OK

image

  • 存檔

image

  • 回到Logic App blade測試看看

image

  • 這裡可以看到執行紀錄

image

  • 成功了!!

image

  • 測試完畢記得要把Logic App Disable

2015年3月17日

在Azure上透過Docker建立Tomcat+mySQL環境 (3)

前面兩篇文章設定的環境是在一台虛擬機器上啟動一個container;然而這樣一來,我們並沒有享受到docker帶給我們的好處。因為docker運行時並不需要透過hypervisor模擬硬體,理論上同樣規格的硬體可以支撐更多container執行才對。

因此,我們需要更進一步,在同一台機器上啟動多個container,然後透過Azure提供的HA機制讓這些不同主機上的container可以達到HA。

以下是我們想要建立的環境:透過一個haproxy,將Internet來的流量,平均分配給所有的container。在這個POC中,為了方便,我會設定Internet透過Cloud Service的8080來存取這個網站;當透過8080存取網站時,流量會先到達haproxy,透過haproxy分配給後面的container。

如果透過80存取網站,則還是會走前兩篇的方式存取網站。

image

在dockerweb1這台虛擬機器上,我會建立新的tomcat container;並將host 81 port對應到這個container的8080 port (因為host 80已經在前篇文章中對應給原本的container了,因此無法再使用host 80 port)

安裝HAProxy

  • 首先建立一台新的虛擬機器(haproxy),將他加入同一個虛擬網路的Subnet-Web
  • ssh到這台機器中安裝haproxy
    • apt-get install haproxy
  • 安裝完成後,建立或修改/etc/haproxy.cfg
    • 其中可以看到我設定了三台web server:10.0.0.4:80、10.0.0.4:81與10.0.0.5:80
    • 這裡面10.0.0.4是dockerweb1這台虛擬機器的IP,10.0.0.5是dockerweb2的IP;而80/81是該主機上的port,透過docker port mapping對應給container的8080

image

  • 接著,為了方便troubleshoot,修改rsyslog相關設定以便haproxy可以把log寫到syslog
    • vi /etc/rsyslog.conf
    • Unmark以下兩行

image

  • 建立或新增/etc/rsyslog.d/haproxy.conf
    • vi /etc/rsyslog.d/haproxy.conf
    • 新增以下這一行
      • local2.* /var/log/haproxy/haproxy.log

image

  • 重啟rsyslog
    • service rsyslog restart

啟動Web Container

  • ssh到dockerweb1主機
  • 啟動新的container,這裡改用host 81 port對應到container 8080 port
    • docker run -p 81:8080 -d -v /home/azureuser/webapps/:/tmp/apache-tomcat-7.0.59/webapps michilab /bin/sh /tmp/apache-tomcat-7.0.59/bin/catalina.sh run
  • 在host透過sudo docker ps確認container執行狀態以及port mapping

image

如此,由Internet來的流量,經過Azure LBSet,到haproxy,haproxy根據haproxy.cfg中的設定,將流量導向我們指定的10.0.0.4:80與10.0.0.4:81;在10.0.0.4這台主機上,我們啟動兩個container,一個將80對應到其8080;另一個將81對應到其8080。

image

打開瀏覽器;可以發現流量確實有分散到不同container上了。

image

2015年3月16日

在Azure上透過Docker建立Tomcat+mySQL環境 (2)

上一篇文章中我們將host container所需要的環境建置完成,並且也設定了container image;接著我們要將tomcat網站與mySQL連接起來,並且設定Load balancer來Load balance tomcat網站的流量。

Load Balance的部分,一開始我們會透過Azure本身的Load Balance Set來達成。由於tomcat預設使用8080 port,因此在Load Balance Set的設定上,我們會把Public 80 port對應到Privte 80 port;然後透過docker本身,將host的80 port與container的8080做mapping。

image

設定LBSet

  • 登入http://manage.windowsazure.com
  • 打開虛擬機器 –> dockerweb1 –> Endpoints
  • 新增一個Load Balanced端點,設定Public Port為80,Private Port為80

image

  • 切換到dockerweb2的端點設定,新增一個端點並加入剛剛建立的LBSet中

設定Tomcat應用程式

  • SSH到dockerweb1
  • 建立一個新的folder /home/azureuser/webapps;稍後我們會將這個folder與tomcat container中的webapps目錄作對應,如此一來,當我們在host修改這個目錄下的檔案,也會直接反映在container中的相對應的folder中。可以把這個方式想像成是在container裡面設定一個map folder到host中,方便管理。
  • 透過以下的指令執行tomcat container(這邊叫做michilab);其中:
    • -v用來指定folder對應;
    • -p用來指定將host的80 port對應到container的8080 port;
    • -d表示這個container將以背景模式執行

sudo docker run -p 80:8080 -d -v /home/azureuser/webapps/:/tmp/apache-tomcat-7.0.59/webapps michilab /bin/sh /tmp/apache-tomcat-7.0.59/bin/catalina.sh run

  • 接著,把我的測試用tomcat程式下載到host上的/home/azureuser/webapps中,並確定已經修改web.xml中的連線資訊指向mySQL Server;其中10.32.0.4:3306是dockermysql1的IP及host port

image

  • 在dockerweb2執行上述指令

設定mySQL

mySQL預設使用3306 port,這裡我會將host 3306與container 3306做對應;因此tomcat可以透過host IP:3306來與mySQL溝通

  • ssh到mySQL host將測試用的資料庫以及資料建置完成
  • 透過以下指令加入一個新的使用者,並允許遠端連線

INSERT INTO user(host,user,password) VALUES('%','apuser',password('mypassword'));
GRANT ALL ON *.* TO 'apuser'@'%' identified by 'mypassword'';
FLUSH PRIVILEGES;

  • 離開container並commit以上的改變,然後執行以下的命令啟動mySQL container
    • Sudo docker run -t –i –p 3306:3306 michilab bash
  • 在container中執行以下指令啟動mySQL service
    • service mysqld start

如此以來所有的準備都完成了,接著打開瀏覽器瀏覽Cloud Service的網址,應該就可以看到結果了。

在這個Lab中,我們為了簡單,在每一個host上只啟動一個container;這樣的好處是可以直接利用Azure LBSet來做Load balance;後續我們會透過HAProxy建置一個簡單的proxy,來load balance多個container在一個host上的情況。

在Azure上透過Docker建立Tomcat+mySQL環境 (1)

Docker是一個近來快速興起的虛擬化技術,與虛擬機器不同的是,docker以應用程式為中心,將應用程式執行階段所需要的程式碼、函式庫等與OS/硬體層分離。在OS內的核心系統層打造虛擬執行環境。由於他不需要在Container內執行OS,因此不需要等待開機的時間,一個應用程式可以在幾秒之內就啟動並開始提供服務。

這系列的文章將會介紹透過Azure虛擬機器建立一個如下的Tomcat+mySQL環境,由於筆者只是個Linux初學者,因此除了需要能夠達到Load balance web server以及mySQL必須位於另一個host上之外,一切其他都會盡量以較簡單的方式來達成。

topology

事前準備

  • 建立一個虛擬網路DockerVnet,分為兩個子網段Subnet-Web1(10.0.0.0/11)與Subnet-DB(10.32.0.0/11)

建立虛擬機器

建立虛擬機器的步驟比較簡單,Azure的Gallery已經提供了幾個內建docker服務的image可以選擇;我們需要做的就是到Azure Portal建立兩台Web Host加入Subnet-Web以及一台SQL Host加入Subnet-DB

image

  • 建立虛擬機器dockerweb1,確認將他加入虛擬網路中

image

  • 重複以上步驟將dockerweb1、dockerweb2與dockermysql1建立完成
  • 建立完成後,你應該可以在Resource Group中看到所有的機器,下圖中的haproxy為筆者後續建立用來做load balance測試之用,這裡可以先跳過他。

image

設定Tomcat Container

建立虛擬機器完成後,接下來便是設定我們的Container;由於筆者需要的情境是兩台host上各自建立一個container執行tomcat應用程式;此tomcat應用程式需要到mysql上取得資料並顯示。因此在這裡我們需要在dockerweb1與dockerweb2上建立一個container,在container中安裝tomcat與java runtime,安裝我們的應用程式並設定連線資訊指向mysql。

由於特殊需求,我需要將tomcat安裝在CentOS 5.8的image上,因此以下的範例,Container都是用CentOS 5.8的版本;但是實際上當然可以依照需求修改。

  • 首先ssh到dockerweb1上確認docker服務已經安裝與執行

image

  • 接著,我從docker registry中取得CentOS 5.8的image
    • sudo docker pull gpmidi/centos-5.8
  • 完成後確認docker image
    • sudo docker images

image

  • 接著,以此image啟動container,我們會在這個container中安裝tomcat及java環境
    • sudo docker run –it gpmidi/centos-5.8 bash

image

  • 請特別注意這裡紅色框框的地方,這是container id,稍後我們會需要這個container id

image

  • 在container中安裝Java環境,由於這裡的動作都是標準動作,因此這裡就只列出我使用的命令
  • 安裝完成後,切換到tomcat\bin目錄執行sh startup.sh測試安裝結果
  • 確定完成後,執行exit離開此container
  • 回到host環境後,要將剛剛我們針對container設定的改變commit回local repository
    • sudo docker commit -a=”Michael” -m=”TOMCAT” <<Container ID>> <<Repository>>
    • 例如:sudo docker commit -a=”Michael Chi” -m=”Tomcat” 123456 michilab;則以後我們可以直接以michilab這個image來啟動已經設定好tomcat的container
  • 重複以上步驟將dockerweb2也設定完成

設定mySQL Container

  • SSH到mySQL Host (dockermysql1)上,抓取CentOS 5.8的image,啟動此container
  • 在此container安裝mySQL
    • yum install mysql-server mysql php-mysql
  • 安裝完成後,修改網路設定檔
    • vi /etc/sysconfig/network
  • 把host name改為以下
    • HOSTNAME=internal.hostname.DOMAIN.com
  • 啟動mysql伺服器
    • service mysqld start
  • 設定root使用者的帳密

mysql -u root
Set the root user password for all local domains
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new-password');
SET PASSWORD FOR 'root'@'localhost.localdomain' = PASSWORD('new-password');
SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('new-password');
Drop the Any user
DROP USER ''@'localhost';
DROP USER ''@'localhost.localdomain';
Exit MySQL

  • 建立測試用的資料庫

CRETE DATABASE test
Use test
CREATE INSTANCE mysqld98 basedir="/var/mysql98"
CREATE TABLE `memMember` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `fbId` varchar(20) DEFAULT NULL,
  `name` varchar(50) NOT NULL,
  `birthday` datetime DEFAULT NULL,
  `phone` varchar(30) DEFAULT NULL ,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  • 執行exit離開container
  • 回到host commit改變
    • sudo docker commit -a=”Michael” -m=”mySQL” <<container id>> <<repository>>

Blog Archive

About Me