Posts
Google cloud storage產生signed url的應用
Signed url的目的跟說明 這個功能主要是讓系統認可的使用者可以透過取的一個暫時的網址去存取雲端空間的權限
目前市面上有很多雲端提供者(cloud provider),例如Google(GCP), Amazon, Azure…,他們都提供網路空間上開發者進行系統整合。
但是這些的空間通常因爲安全性(Security)的考量,都會將空間設定是私人,為的是防止有心人隨意上傳檔案。 但是會衍生出系統使用者(user)並沒有辦法上傳檔案,為了解決這個問題上 signed URL這個機制。
使用者必須先透過系統驗證機制(帳號/密碼, oauth…)讓系統知道使用者是誰之後,系統認可後為使用者製造出一段暫時性的網址,讓使用者去上傳或者是瀏覽檔案系統
在此篇文章中我們針對Google service的進行說明
如何做到Signed url的機制 使用者必須透過驗證機制讓伺服器知道他是合法的使用者,如此一來伺服器可以為使用者製造出一個暫時有權限的網址,並透過API回傳給使用者,使用者取的後就可以使用這個網址直接上傳到目標的空間。當有心人士想上傳不合法的檔案,會因為無取得系統的認可而不能上傳檔案(因為folder預設會是privated)。
Debug過程 Send PUT http request to upload the file to a GCS bucket. And then the error message pop up on the chrome dev console. :::danger Access to XMLHttpRequest at ‘https://storage.googleapis.com/xxxxxx' from origin ‘http://127.0.0.1:5000’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. ::: You have to update the bucket CORS policy by running following command.
Posts
Deploy s3 bucket by cloudformation
預先準備 需要先把 aws cli 給裝起來
利用CLI可以把預先寫好的基礎建設結構佈署到AWS上,下面是簡單部署一個S3的bucket範例。
aws cloudformation deploy --stack-name paulteststack --template-file ./s3-create-template.json --stack-name: 想要deploy到哪一個cloudformation stack裡 --template-file: template 檔案的所在位置 還有很多參數可以設定,詳情可以參考 create-stack
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Create S3 bucket on AWS", "Resources": { "S3Test": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "paul-test-1495611707" } } } } template 可以依照情境進行更進階的調整,例如調整bucket的CROS讓外部的前端程式可以進行存取。 { "AWSTemplateFormatVersion": "2010-09-09", "Description": "Create S3 bucket on AWS", "Resources": { "S3Test": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "paul-test-1495611707", "AccessControl": "PublicReadWrite", "CorsConfiguration": { "CorsRules": [ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET" ], "AllowedOrigins": [ "*" ], "ExposedHeaders": [ "Date" ], "Id": "myCORSRuleId1", "MaxAge": "3600" }, { "AllowedHeaders": [ "x-amz-*" ], "AllowedMethods": [ "DELETE" ], "AllowedOrigins": [ "http://www.
Posts
Deploy s3 bucket by cloudformation - 進階版
開發系統時部分的程式碼會參考到基礎建設的名稱,例如:S3 bucket自動部署創建出來的名稱,或是需要利用aws resource arn去做trigger lambda事件的綁定,都需要輸出佈建後的結果。 { "AWSTemplateFormatVersion": "2010-09-09", "Description": "Create S3 bucket on AWS", "Parameters": { "StageName": { "Type": "String" } }, "Resources": { "S3Test": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": { "Fn::Sub": [ "paul-test-${StageName}", { "StageName": { "Ref": "StageName" } } ] }, "AccessControl": "PublicReadWrite", "CorsConfiguration": { "CorsRules": [ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET" ], "AllowedOrigins": [ "*" ], "ExposedHeaders": [ "Date" ], "Id": "myCORSRuleId1", "MaxAge": "3600" } ] } } } }, "Outputs": { "S3Test": { "Description": "Information about s3 bucket name", "Value": { "Fn::Sub": [ "paul-test-${StageName}", { "StageName": { "Ref": "StageName" } } ] }, "Export": { "Name": { "Fn::Sub": [ "${StackName}-S3Test-bucketname", { "StackName": { "Ref": "AWS::StackName" } } ] } } } } } Fn::Sub: 代表字串裡的變數,可用接下來的變數給取代。當字串不需要有變數取代時,可以簡單的利用{ "Fn::Sub" : String }描述即可。需要由變數替換的模板為{ "Fn::Sub" : [ String, { Var1Name: Var1Value, Var2Name: Var2Value } ] }。
Posts
Druid
Druid Terms multi-tenant: a single instance of software runs on a server and serves multiple tenants OLAP: Online analytical processing, is an approach to answering multi-dimensional analytical (MDA) queries swiftly in computing SaaS: a software distribution model in which a third-party provider hosts applications and makes them available to customers over the Internet ROLL-UP: 將原始數據在匯入資料庫時就進行彙整處理
Scenario 資料已經整理好,不需要更新操作 不需要做表格的join 對於資料時間維度要求比較高的工作 即時性極重要的project External Dependencies Zookeeper: cluster內部溝通資訊所用 Metadata Storage: 儲存segment的meta data和configuration,提供coordinator node去調配segment的的載入情況 Deep Storage: segment的永久儲存空間,提供Historical node去下載segment
Posts
Kubernate Env Setup FAQ(by Kubeadm)
前置作業 如何關掉swap功能: 如果是linux,可透過以下指令去關掉swap功能 sudo swapoff -a && sudo sed -i '/swap/d' /etc/fstab
安裝執行工具 安裝kubelet kubeadm kubectl的方法
sudo apt-get update && sudo apt-get install -y apt-transport-https curl sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - sudo cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl 官網說明:https://kubernetes.io/docs/setup/independent/install-kubeadm/
開始架設 將電腦變成master node可執行:
kubeadm init 首先adm會先去做幾項檢測 通過後會下載跟安裝k8s所需要的控制元件
安裝過程的錯誤 Q1 Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes") 主要是因為沒執行以下的動作,導致user的權限不符合,無法使用kubctl cmd
Posts
PgPool2 install issu 紀錄安裝過程
安裝pgpool-II 透過網路上簡易的git repostory去快速的安裝pgpool-2 docker環境 例如:docker-pgpool2
將pgpool conf檔跟執行的shell複製進去docker裡面 執行pgpool 需要在postgres建立pgpool所需要登入的角色,例如使用者:pgpool
利用指令可以查詢現在postgres node status:
pcp_node_info [option...] [node_id] pcp_node_info --verbose -h localhost -U postgres 0 問題 出現2018-09-18 05:32:46: pid 6: FATAL: could not open pid file as /var/run/pgpool/pgpool.pid. reason: No such file or directory的錯誤訊息 需要幫process建立/var/run/pgpool的資料夾
pgpool都已經裝好,postgres sever也已經就緒,但是出現無法登入的問題,相同帳號密碼不透過pgpool會登入成功?
看了一下pgpool2的log檔,出現以下資訊
2018-07-27 06:51:28 DEBUG: pid 30: I am 30 accept fd 5 2018-07-27 06:51:28 LOG: pid 30: connection received: host=192.168.17.178 port=64325 2018-07-27 06:51:28 DEBUG: pid 30: Protocol Major: 1234 Minor: 5679 database: user: 2018-07-27 06:51:28 DEBUG: pid 30: SSLRequest from client 2018-07-27 06:51:28 DEBUG: pid 30: read_startup_packet: application_name: pgAdmin 4 - DB:postgres 2018-07-27 06:51:28 DEBUG: pid 30: Protocol Major: 3 Minor: 0 database: postgres user: postgres 2018-07-27 06:51:28 DEBUG: pid 30: new_connection: connecting 0 backend 2018-07-27 06:51:28 DEBUG: pid 30: new_connection: skipping slot 0 because backend_status = 0 2018-07-27 06:51:28 DEBUG: pid 30: new_connection: connecting 1 backend 2018-07-27 06:51:28 DEBUG: pid 30: pool_read_message_length: slot: 1 length: 12 2018-07-27 06:51:28 DEBUG: pid 30: pool_do_auth: auth kind:5 2018-07-27 06:51:28 DEBUG: pid 30: trying md5 authentication 2018-07-27 06:51:28 ERROR: pid 30: pool_get_passwd: username is NULL 2018-07-27 06:51:28 DEBUG: pid 30: do_md5: (null) does not exist in pool_passwd 2018-07-27 06:51:28 DEBUG: pid 30: do_md5failed in slot 1 正常普通安裝pgpool,設定檔的路徑會出現在/etc/pgpool2,通常會有四個檔案,pcp.
Posts
S3 multipart uplaod prsigned url教學
當系統需要做續傳功能或大檔上傳的功能時,S3提供multipart upload的功能,可將檔案切分上傳,最後到S3再進行合併。主要分成3步驟:
Multipart upload init 上傳一個或多個parts Multipart upload complete 上傳初始化 檔案要上傳到S3時,需指明當這個 multipart upload 完成組合成一個 object 後,object 的 key 值為何,若希望以 multipart upload 建立的 object 帶有自訂的 metadata,亦須在 multipart upload 初始化時提供。成功初始化後,S3會建立一組 upload ID 當成未來上傳為此 object 的依據。
<?xml version="1.0" encoding="UTF-8"?> <InitiateMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Bucket>test201705021548</Bucket> <Key>hello.jpg</Key> <UploadId>QAUmLo15J46MyspVk6PgCPg7C1yk9RdOR2XfsdwEe2xDVS33HTh.cAJzFfwcug--</UploadId> </InitiateMultipartUploadResult> 操作步驟
為 init multipart 的需求產出數位簽章。 var StringToSign = "POST" + "\n" + "" + "\n" + "" + "\n" + new Date().toUTCString() + "\n" + "/test201705021548/hello.jpg?uploads"; init成功時,S3會回傳對應的 upload ID
Posts
收集 AWS IoT data到 AWS kinesis 處理資料流
使用AWS IoT服務來開發大量的資料傳輸系統,主要是想彙整資料或是做數據分析,AWS同樣提供資料串流的分析服務 kinesis. kinesis服務裡面有三個類別,Data Streams, Data Firehose, Data Analytics. Data Streams: streams 這個服務其實就有點類似 Kafka. 在IoT mqtt的protocol下,publish/subscribe之間系統是不會保存任何傳遞的資料。所以一但需要做資料流分析時,需要將收到的資料存在Message Queue裡,kinesis streams就擔任這個初階的角色,stream可以搭配firhorsec,analytics,lambda…一起使用。
Data Firehose: firehose可以將stream的資料倒至其他AWS的服務,例如: S3, Redshift…,firehose服務裡提供transformation功能將資料整理成需要的格式。
Data Analytics: 利用收到的data stream,只要提供需要sql程式,設定好Source(data stream)與Destination,AWS就會提供即時分析服務。
IoT trigger Kinese stream
只要在IoT的Service上建立rule,只要推送資料到設定的topi就會將資料導入Kinese stream。 選定 Send messages to an Kinesis Stream 就可以在符合Rule時將資料導入data stream 選定預先創立好的stream,設定Partition key,還有執行角色就完成 Partition key說明
利用Partition key,IoT的資料可以藉由group的方式去將資料分配的儲存在stream的shards裡面,最容易的方式是用網頁上提供的function: newuuid(),去隨機產出亂數平均的儲存資料,或是利用IoT的資料裡面的Key直做group。 [{'key':'a1', 'value':1}, {'key':'a2', 'value':2}, {'key':'a1', 'value':3}] 如果Partition key填入${key},那麼第1,3比資料會被送到stream裡的同一個shard,2則被送到另一個shard。
trigger lambda處理收集好的batch資料
shard只由一個lambda服務 pull 多shard由多個lambda執行task, semphore問題
Posts
Flask 第一個 APP(初學入門)
學了Python卻不知道可以應用在哪裡? 這個影片包含了
如何寫一個最簡單的Web server 做好的網站要怎麼執行 我想要Debug該怎麼做 點選以下影片觀看↘↘
設定或開發環境遇到問題了?
請看影片:Python的開發環境設定
檔案介紹 main.py: 整個Flask APP 主要的進入檔案
requirement.txt: 執行APP所需要的相依套件(開發工程師不可能所有功能都自己獨立製作,所以需要很多Open Source的套件來輔助,完成一套用的系統)
程式碼解說 @app.route('/') URL的入口點,當使用者打錯網址時, APP沒有辦法找到對應的function來處理時,就會出現 404 not found 的錯誤。
return "<div>Hello World, gFu.<div>" 當使用者連上正確的URL時,APP就會幫忙處理資料,但是這個簡單的範例並沒多加複雜的邏輯,只有回傳單純的html元素給使用者。
Posts
Flask 要如何做測試
flask-unittest 為什麼需要寫測試 寫測試對許多初學者來說,會覺的非常費時且沒有必要,心裡想著,我都親自測試過了,程式執行起來沒有什麼問題,為什麼需要花很多時間測試呢?
對於這個疑問,最簡單的回答是,寫測試大多是為了未來
專案只有幾個情況下比較不需要寫測試:
專案只會執行幾次就不再使用 還在初期的規規劃跟實驗的狀態(POC) 當你的專案有以下的情況,測試程式碼就會勢在必行:
越寫多程式碼,程式的複雜度跟耦合度漸漸變高時 專案成員變多,程式碼改動變頻繁的時候 測試程式碼就變的極為重要 測試可以讓你所開發的程式碼不會受到別人的改動而遭受影響(Side effect),當然要配合Dev Ops的CI/CD 效果才會比較好. Pytest vs. unittest
在Python內建的模組裡有包含了測試,所以不需要安裝任何第3方套件就可以載入unittest模組來寫測試. 我個人式比較常用pytest.
pytest的好處是:
提供比unittest更多的輔助工具來幫助測試 所有用unitest語法寫的測試程式碼,都可以用pytest來執行 執行測試 在Terminal上面執行pytest指令並加上一個資料夾,pytest就會自動去收集這個資料夾裡面帶有test_*.py 或是 *_test.py檔名的測試並執行
pytest tests -v -s -v: 描述詳細的測試訊息 -s: 顯示程式碼裡面印出來的資訊
Unittest Mock Mock 的功能對於測試非常的重要,例如:A function 裡面包含執行 B, C, D功能,但是在測試 A 功能時,我們並不想要測試 C 功能,只需要 bypass C 功能,這個時候 Mock 功能就派上用場.
patch 是Mock裡面所提供的一個功能,它可以去取代掉原本功能的過程,例如:
@patch('func.MathFunc.get_random_point') def test_multiply(self, mock_func): mock_func.return_value = (8, 6) 以上的程式碼代表,原本的get_random_point功能想要被取代,不論原本那個功能裡面的邏輯是什麼, 最終回傳值就一定會是一個tuple包含8,6這兩個值。
Flask test 利用Flask在寫Web Application時, 通常會進行API test.