用 10 分鐘部署專案到 AWS Lambda

Screen Shot 2018-10-24 at 9.37.49 AM

看到這標題也許非常聳動,也可能覺得不可思議,今天來探討如何將專案直接部署到 AWS Lambda 並且自動化將 API Gateway 設定完成。當然要做到完全自動化,必須要使用一些工具才能完成,本篇將介紹由 TJ 所開發的 apex/up 工具,如果您不熟悉 EC2 也不太懂 Command line 操作,本文非常適合您,不需要管理任何 EC2 機器,也不需要在熟悉任何 Linux Command 就可以完成簡單的專案部署。首先為什麼我選擇 apex/up 而不是選擇 apex/apex,原因是使用 up 工具,您的專案是不用更動任何程式碼,就可以將專案直接執行在 AWS Lambda,那 API Gateway 部分也會一並設定完成,將所有 Request 直接 Proxy 到該 Lambda function。如果您希望對於 AWS Lambda 有更多進階操作,我會建議您用 apex/apexServerless。您可以想像使用 up 就可以將 AWS Lambda 當作小型的 EC2 服務,但是不用自己管理 EC2,現在 up 支援 Golang, Node.js, Python 或 Java 程式語言,用一行 command 就可以將專案部署到雲端了。

[Read More]

Go 語言 1.11 版本推出 go module

Go-Logo_Blue

本篇來聊聊 Go 語言在 1.11 版本推出的 新功能,相信大家也許還不知道此功能是做什麼用的,我們來回顧看看在初學 Go 語言的時候,最令人困擾的就是 GOPATH,所有的專案都必須要在 GOPATH 底下開發,然而在更久前還沒有 Vendor 時候,兩個專案用不同版本的同一個 Package 就必須要使用多個 GOPATH 來解決,但是隨著 Vendor 在 1.5 版的推出,解決了這問題,所以現在只要把專案放在 GOPATH 底下,剩下的 Package 管理都透過 Vendor 目錄來控管,在很多大型開源專案都可以看到把 Vendor 目錄放入版本控制已經是基本的 Best Practice,而 go module 推出最大功能用來解決 GOPATH 問題,也就是未來開發專案,隨意讓開發者 clone 專案到任何地方都可以,另外也統一個 Package 套件管理,不再需要 Vendor 目錄,底下舉個實際例子來說明。

[Read More]

Go 語言專案程式碼品質

本篇想介紹我在寫開源專案會用到的工具及服務,其實在編譯 Go 語言同時,就已經確保了一次程式碼品質,或者是在編譯之前會跑 go fmtgo vet 的驗證,網路上也蠻多工具可以提供更多驗證,像是:

  • errcheck (檢查是否略過錯誤驗證)
  • unused (檢查沒用到的 func, variable or const)
  • structcheck (檢查 struct 內沒有用到的 field)
  • varcheck (拿掉沒有用到的 const 變數)
  • deadcode (沒有用到的程式碼)

但是這麼多驗證工具,要一一導入專案,實在有點麻煩,我自己在公司內部只有驗證 go fmtgo vetmisspell-check (驗證英文單字是否錯誤) 及 vendor-check (驗證開發者是否有去修改過 vendor 而沒有恢復修正)。如果你有在玩開源專案,其實可以不用這麼麻煩,導入兩套工具就可以讓你安心驗證別人發的 PR。底下來介紹一套工具及另外一套雲端服務。

[Read More]

Go 語言的 graphQL-go 套件正式支援 Concurrent Resolvers

要在 Go 語言寫 graphQL,大家一定對 graphql-go 不陌生,討論度最高的套件,但是我先說,雖然討論度是最高,但是效能是最差的,如果大家很要求效能,可以先參考此專案,裡面有目前 Go 語言的 graphQL 套件比較效能,有機會在寫另外一篇介紹。最近 graphql-go 的作者把 Concurrent Resolvers 的解法寫了一篇 Issue 來討論,最終採用了 Resolver returns a Thunk 方式來解決 Concurrent 問題,這個 PR 沒有用到額外的 goroutines,使用方式也最簡單 1 2 3 4 5 6 7 8 9 10 11 12 13 14 "pullRequests": &graphql.Field{ Type: graphql.NewList(PullRequestType), Resolve: func(p graphql.ResolveParams) (interface{}, error) { ch := make(chan []PullRequest) // Concurrent work via Goroutines. go func() { // Async work to obtain pullRequests. ch <- pullRequests }() return func() interface{} { return <-ch }, nil }, }, 使用方式 先用一個簡單例子來解釋之前的寫法會是什麼形式 [Read More]

在 PostgreSQL 時區轉換及計算時間

postgres

通常在使用資料表時,都會在每一筆紀錄上面寫入當下時間,而這個時間會根據目前系統所在的時區而有所不同,當然我們都會使用 UTC+0 作為標準時區,而欄位我們則會是使用 timestamp 或者是 unix time 格式,兩者最大的差異就是在前者 (timestamp) 會根據目前系統的時區來記錄,而後者 (unix time) 則是紀錄秒數差異 (Jan 01 1970) 而不會隨著系統時區改變而變化。如果是發展開源專案,則會使用後者居多,這樣不會因為使用者時區變化,而產生不同的差異,在 Gitea 開源專案保留了兩者,但是只要計算時間則是用 (unix time) 作轉換。

[Read More]

在 Go 語言內的 URL RawQuery 的改變

更新 (2018.08.29) 感謝中國網友幫忙發個 Issue,大家有空可以關注看看,等官方怎麼回應

Go 語言內的 net/url 函式庫讓開發者可以簡單的 Parse 指定的 URL,最近 Google 上了這個 Patch,這個 Patch 讓原本的 RawQuery 值產生了變化,原先沒有驗證 RawQuery 是否包含了不合法的字元,現在只要 RawQuesy 內含有任意的不合法字元,就會直接被 QueryEscape 函式轉換,這個 Patch 不影響這次 Go 1.11 版本,會影響的是明年 2019 年釋出的 Go 1.12 版本,但是大家都知道在 GitHub 上面有在寫測試的話,都會在 Travis 內加入 master 版本當作驗證,如果有用到 RawQuery 的話,肯定會遇到這問題,底下來描述為什麼會出現這問題。

[Read More]

用 Drone CI/CD 整合 Packer 自動產生 GCP 或 AWS 映像檔

Screen Shot 2018-07-29 at 12.47.51 PM

本篇來介紹 Hashicorp 旗下其中一個產品叫 Packer,其實在 Hashicorp 旗下有很多其他雲端工具都非常好用,如果大家有興趣都可以上官網參考看看。而 Packer 是用來產生各大雲平台映像檔的工具,平行產生 AWS, GCP, DockerDigitalOcean … 等等眾多雲平台之映像檔對 Packer 來說相當容易,詳細可以參考這邊,也就是說透過 Packer 來統一管理各大雲平台的映像檔,用 JSON 檔案進行版本控制。假設您有需求要管理工程團隊所使用的 Image,你絕對不能錯過 Packer。Packer 不是用來取代像是 Ansible 或是 Chef 等軟體,而是讓開發者更方便整合 Ansible .. 等第三方工具,快速安裝好系統環境。

[Read More]

用 Caddy 申請 Let’s Encrypt Wildcard 憑證

Screen Shot 2018-07-27 at 11.29.44 AM

2018 年 3 月 Let’s Encrypt 官方正式公告支援 Wildcard Certificate 憑證,有在玩多個 subdomain 有福了,未來只要申請一張 *.example.com 就全部通用啦,當然很高興 Caddy 也跟進了,在 v11.0 正式支援多種 DNS Provider,只要申請 DNS 提供商的 API Key 或 Secret 設定在啟動 Caddy 步驟內就可以了。底下用 Godaddy 舉例。

[Read More]

Go 語言實戰 GraphQL

Screen Shot 2018-07-19 at 8.58.48 AM

很高興能在 2018 ModernWeb 研討會跟大家分享用 Go 語言實戰 GraphQL,相信大家都知道 GraphQL 帶給前端後端及手機開發者很多好處,強烈推薦大家來嘗試看看。這場議程最主要是推廣 GraphQL 及 Go 語言。底下有投影片大家可以參考看看。

[Read More]