Posts
AWS api-getway 客製化的 Domain Name
AWS api-getway Customized Domain Name 利用AWS的serverless服務開發 httpserver的情況下,很常會使用(Lambda+Apigateway)的服務,通常會用api-getway去當url route的服務。部屬成功時,api-getway都會給一組類似以下的網址,https://${api-id}.execute-api.region.amazonaws.com/stage ,因為網址有可能因為部署的需求而改變,所以如果想要制定自己的url名稱,就得使用api-getway裡面的custom domain name功能。
設定custom domain name分成以下幾個主要步驟
申請AWS ACM(AWS Certificate Manager)服務 綁定ACM服務到api-gateway 將route53綁定到api-gateway產出的CDN網址 申請AWS ACM
如果要使用custom domain name,我們得提供有效的SSL/TLS certificate保護我們的網址。ACM是AWS專門管理或產出SSL/TLS憑證的服務,需要在上面申請保護我們的url,請注意!!! 如果是因custom domain name而需申請ACM的話,請將申請區域調到 ==US East (N. Virginia)== 。ACM
申請的畫面會如下圖,如果想保護所有subdoamin可以用wildcard寫法,使用號,例如:.example.com 申請結束後AWS會寄信給domain擁有人(基本上就是開發者),要求是否同意授權保護此網址,只要點擊連結就會啟用服務。 api-gateway綁定ACM
申請好ACM就可以將custom domain name綁定到api-getway上。填好要綁定的domain名稱,剛創建好的ACM服務,與選定mapping的api-getway即可。綁定的過程中會出現 Target Domain Name 這個就要最後一步要將route53指向的cloud front網址。 route53 綁定 cdn
登入進 route 53,為自己的domain建立一個A record,將target指向剛剛所產生的cloud front網址。 以上步驟都完成時就可以使用自己所設定的domain name去存取server了。
Posts
AWS IoT | 進階資訊分享
AWS IoT - 進階 IoT reserved topic 在 AWS IoT的資源上,有部份的 topic name是被保留。 $aws/events/presence/connected/# : 如果有任何的使用者連上 IoT 就會推播訊息到這個 Topic $aws/events/presence/disconnected/#: 如果有任何的使用者斷線,就會推播訊息
這個是當使用者 connected/disconnected 推播到 topic 裡的訊息範例 { "clientId": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6", "timestamp": 1460065214626, "eventType": "connected", "sessionIdentifier": "00000000-0000-0000-0000-000000000000", "principalIdentifier": "000000000000/ABCDEFGHIJKLMNOPQRSTU:some-user/ABCDEFGHIJKLMNOPQRSTU:some-user" } $aws/events/subscriptions/subscribed/#: 如果有任何的使用者訂閱了任何的 topic就會推播訊息到這個topic $aws/events/subscriptions/unsubscribed/#: 如果有任何的使用者解訂閱了任何的 topic就會推播訊息
這個是 subscribed/unsubscribed 推播的訊息範例 { "clientId": "186b5", "timestamp": 1460065214626, "eventType": "subscribed" | "unsubscribed", "sessionIdentifier": "00000000-0000-0000-0000-000000000000", "principalIdentifier": "000000000000/ABCDEFGHIJKLMNOPQRSTU:some-user/ABCDEFGHIJKLMNOPQRSTU:some-user" "topics" : ["foo/bar","device/data","dog/cat"] } :::info
同時要聆聽相同 Topic 底下不同的子 Topic 可用 + 號串聯,例如: $aws/events/subscriptions/+/#: 可以同時聆聽到 connected, disconnected, subscribed, unsubscribed …的訊息 company/+/member: + 號可以是任意的字串,只要符合這個 Topic 的 name 的規則,都可以收到資訊 :::
Posts
AWS IoT with websocket
在大多數的瀏覽器都有支援websocket的protocol前提下,實作網頁即時接收訊息的功能上,我們希望每個網頁都可以當作是一個mqtt的裝置,如此一來就可以即時推播給各個網頁,也可以即時的接收到來自client端的訊息。 AWS在IoT的服務上也有做到MQTT Over the WebSocket Protocol,透過AWS SigV4的身份認證, 利用Port 443,我們可以透過網頁連線上AWS IoT的服務。 server side
以下是server端需要產出帶有authentication的query url,使用上,前端只需要將url用get的方式呼叫就可以連接上IoT。 function SigV4Utils() {} SigV4Utils.getSignatureKey = function (key, date, region, service) { var kDate = AWS.util.crypto.hmac('AWS4' + key, date, 'buffer'); var kRegion = AWS.util.crypto.hmac(kDate, region, 'buffer'); var kService = AWS.util.crypto.hmac(kRegion, service, 'buffer'); var kCredentials = AWS.util.crypto.hmac(kService, 'aws4_request', 'buffer'); return kCredentials; }; SigV4Utils.getSignedUrl = function(host, region, ) { var datetime = AWS.util.date.iso8601(new Date()).replace(/[:\-]|\.\d{3}/g, ''); var date = datetime.
Posts
AWS IoT介紹
AWS IoT 說明
certificate:裝置可以透過 certificates 去做驗證,保證使用 IoT 的溝通上 security 是沒有任何問題的。除了certificates之外,也可以透過IAM權限,Congnito 的權限控管去操作 IoT 的 resources (如上圖)。 利用 AWS IoT 提供的 sdk 可以在 AWS resource 內產出一組 certificate, 裏面包含的資訊會有certificate pem keyPair(a pair of public & private key) certificateId & ARN
取得憑證後,需要在憑證上套用policy,policy就好像規定這拿著這隻憑證鑰匙可以進哪個門,不能進哪個門,以達到 AWS IoT 的 resource 控管。
Policy設定 以下的這個 Policy設定代表使用者只要有合理的 certificates,就可以針對IoT上所有的resources 做連線,推播,接收的動做,沒做任何的限制管控,如果要限制使用者能力有下面另外一個範例 { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "iot:Publish", "iot:Subscribe", "iot:Connect", "iot:Receive" ], "Resource": ["*"] }] } 如果想讓使用者只能針對自己 CertificateId 的 topic 操作,policy 就要修改成以下的方式,利用 ${iot:CertificateId} 的變數,AWS IoT 會去檢查裝置端連線時所使用的憑證,達到每個憑證只能操作對應憑證 ID 的 Topic,降低資訊被竊取的風險。 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": "arn:aws:iot:ap-northeast-1:1234:topicfilter/${iot:CertificateId}" }, { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:ap-northeast-1:1234:client/${iot:CertificateId}" }, { "Effect": "Allow", "Action": [ "iot:Publish", "iot:Receive" ], "Resource": "arn:aws:iot:ap-northeast-1:1234:topic/${iot:CertificateId}" } ] } connect 的 policy 要跟操作 IoT resources 要分開寫,因為 connect 是針對 client resource 操作,但是其他的動作是針對 IoT 上的 topic resource 做操作,如果都在一條 statement 會導致錯誤。
Posts
AWS S3 REST 數位簽章與驗證
AWS S3 REST簽章與驗證 假設在S3裡的物件只設定給 “authenticated AWS user” 操作,那我們要如何利用數位簽章讓使用者可以透過 api resquest 去做身份認可(identity)並操作S3裏面的物件。 假設在S3上我們有一個name為 wisigntest 的bucket,裏面存在一個名為hello.jpg的物件,設定為 “authenticated AWS user” 可以R/W。我們將紀錄如何使用API去存取S3物件。 簡易瀏覽物件
GET /hello.jpg HTTP/1.1 Host: https://wisigntest.s3-ap-northeast-1.amazonaws.com Date: Fri, 28 Apr 2017 05:56:29 GMT Authorization: AWS AKIAIOSFODNN7EXAMPLE:frJIUN8DYpKDtOLCwo//yllqDzg= 下面是我用Postman去讀取S3檔案的畫面 The Authentication Header
下面的格式是主要傳送給 API 的 Header 上要添加的 Authorization 資訊,透過Signature,AWS可以驗證此次的操作是否有效。
Authorization: AWS {AWSAccessKeyId}:{Signature} 下面是 Nodejs 計算的Signature程式碼
var crypto = require("crypto"); // from IAM role var secret_access_key = '64nd6BY7gTPDspq54gQcRth5dvORNdDvqL4BZ5zd'; var access_key_id = 'AKIAIUHT2BNZP65ADZKQ' var StringToSign = "GET" + "\n" + "" + "\n" + "" + "\n" + new Date().
Posts
Ceph Cluster Storage 初階學習
Ceph 元件 MON (monitor): 維護整個cluster的狀態 透過crush演算法取得osd位置,執行建立與傳輸資料 不會主動的輪詢OSD的各種狀態 保證cluster所有數據的一致性 單一可運行,建議可部署多個,每個node上最多只能有一個MON OSD (ObjectStorageDevice) cluster中的資料的儲存體 - 當OSD發現自身或其他OSD發生異常時會上報MON - 對其他的OSD發送heart beat訊號 MGR MDS 使用CephFS才需要使用此服務 - 提供資料運算,緩存和資料同步 Ceph RGW(即RADOS Gateway)是Ceph对象存储网关服务,是基于LIBRADOS接口封装实现的FastCGI服务,对外提供存储和管理对象数据的Restful API。 安裝osd時有錯誤發生,發現log的描述如下: ** ERROR: osd init failed: (36) File name too long 原因: Ceph官方建議用XFS作OSD的文件系統,如果安裝OSD主機上的文件系統格式為ext4,會使得OSD的資料不能安全的保存。所以要解決這個問題就得:
將安裝OSD的文件系統改為XFS 修改OSD的文件配置,然後重新啟動OSD osd max object name len = 256 osd max object namespace len = 64 用來檢查Ceph目前的狀態
ceph -s 當Ceph系統都已經架設完畢時,可以安裝ceph-fuse作為Client端掛載到monitor機器上 sudo apt-get install ceph-fuse
$ ceph- fuse -m 192.168.0.1:6789 /fuse_folder/ 系統都已設定完畢,但是使用ceph-fuse出現
Posts
Javascript detect network connect status
[JS] detect network connect status 當我們在開發網站時,可能會遇到需要偵測網路情況,給予使用者是當的反饋。例如做檔案上傳時,如果網路斷線又回復連接時,需要提醒使用者可以做續傳的動作。目前市面上多樣的瀏覽器所提供的online/offline事件,可能沒有辦法有效的偵測到。 :::warning It is important to note that this event and attribute are inherently unreliable. A computer can be connected to a network without having Internet access. :::
目前各家瀏覽器針對 “Offline” 的定義都不相同,所以沒有一個有效率的方式可偵測瀏覽器的網路情況。斷線的定義位於broswer當電腦在受保護的私人網路下,所以沒有連線到外界網路的能力,要定義為Offline嗎? 都沒接上網路但是client和server端都在127.0.0.1網段,可以互相溝通要算有網路嗎? 一般開發網站時可能比較需要偵測連線到外埠網路的情況,所以下面是一斷偵測網路連線狀態的 example code。藉由嘗試存取自己網站的favicon.ico去判定對是否有網路的連線能力,我們透過 httprequest 的 HEADER method 去嘗試,再這個 method 下比較節省流量。HTTP Method :::warning The HEAD method asks for a response identical to that of a GET request, but without the response body :::
export function doesConnectionExist() { return new Promise((resolve) => { const xhr = new XMLHttpRequest(); const url = 'https://example.
Posts
Kubeflow Mnist範例介紹
官網的Git:kubeflow mnist
利用簡單的mnist來做為範例,介紹如何在Kubeflow進行training跟serving的流程。Kubeflow利用argo workflow將整個流程寫成腳本,透過指令驅動整個AI training與serving過程。training階段會將訓練model的程式碼包成docker image,建立TFjob將model訓練出來。serving階段,會將訓練好的model利用seldon-core的幫助,建立起prediction服務。 Training 的流程 將training的程式從git上載下來,打包成training image 將打包好的image推上去docker registry 利用TFjob執行image產生model 將model給volume出來 Serving 的流程 將serving的程式從git上載下來,打包成serving image 將打包好的image推上去docker registry 將剛train好的model給volume到seldon-core的image上 透過定義seldon graph啟動predict的機制 測試 可以利用seldon-core出的測試工具來檢視predict serving是否正確執行:
$ seldon-core-api-tester --ambassador-path /seldon/kubeflow/mnist-classifier -p contract.json <host ip> <host port> Debug 錯誤訊息:
error when creating "/tmp/manifest.yaml": tfjobs.kubeflow.org is forbidden: User "system:serviceaccount:kubeflow:default" cannot create tfjobs.kubeflow.org in the namespace "kubeflow" 將kubeflow namespace的帳號default 加上cluster-admin的權限 kubectl create clusterrolebinding sa-admin --clusterrole=cluster-admin --serviceaccount=kubeflow:default 錯誤訊息:
Failed to submit workflow: workflows.argoproj.io is forbidden: User "system:serviceaccount:kubeflow:jupyter-notebook" cannot create workflows.
Posts
Kubeflow安裝及入門
安裝需求 安裝好ksonnet, Version 0.11.0 or later. Kubernetes 1.8 or later 安裝ksonnet export KS_VER=0.12.0 export KS_PKG=ks_${KS_VER}_linux_amd64 wget -O /tmp/${KS_PKG}.tar.gz https://github.com/ksonnet/ksonnet/releases/download/v${KS_VER}/${KS_PKG}.tar.gz \ --no-check-certificate mkdir -p ${HOME}/bin tar -xvf /tmp/$KS_PKG.tar.gz -C ${HOME}/bin export PATH=$PATH:${HOME}/bin/$KS_PKG 官方皆學的網站可以參考: linux install ks
安裝kubeflow 下載安裝kubeflow的script export KUBEFLOW_SRC=kf_src mkdir ${KUBEFLOW_SRC} cd ${KUBEFLOW_SRC} export KUBEFLOW_TAG=v0.3.1 curl https://raw.githubusercontent.com/kubeflow/kubeflow/${KUBEFLOW_TAG}/scripts/download.sh | bash 將下載好的ks檔部署到K8S環境上 export KFAPP=kf_conf scripts/kfctl.sh init ${KFAPP} --platform none cd ${KFAPP} ../scripts/kfctl.sh generate k8s ../scripts/kfctl.sh apply k8s 驗證kubeflow status 執行kubectl get pods --all-namespaces可以檢視目前pod運行的狀態 會發現有一個pod會是pending的狀態,vizier-db-547967c899-ppr4p 執行kubectl describe vizier-db-547967c899-ppr4p -n kubeflow 可以看到events出現以下字眼