在強者我朋友的大力推坑下,我也開始碰 AWS 了~ 依照以往習慣仍是來寫幾篇筆記分享。最先碰的是 DynamoDB 這個服務,除了相較於我之前用過的幾個資料庫服務更加方便外,也是我近期的 side project 會想用的東西,所以就先來碰了~XD
Create table
一開始先來研究一下如何創建一個 Table,畢竟有了 Table 才能把 Data 存入裡面,直接放上代碼:
Import
import 的部分有用到 aws sdk,可以透過 go get 取得,其他的就是標準庫裡的東西了~
Create client
line 14~ 18 創建了一個 DynamoDB client,大致分為兩步驟,先創建一個 session,接著再用該 session 創建 client,先來看看 session 結構吧:
簡略來說,他就是個具有和伺服器溝通功能的結構, Config 是個儲存設定資訊的結構,裡面很多東西貼上來的話太占版面,所以我就不貼了(笑~),Handlers 則是用來處理 request 的,裡面集成了許多種類的 HandlerList 針對不同階段做處理,裡面長這樣:
大致上能把它視為把所有 request handle 的事務都切塊模組化後,以一個類似樹狀的層級包裝管理,並能在使用時妥善處理 request 的結構。
而 session.Must 是一個能幫助你確認 session 是否有效的方法,確保後續操作上不會出什麼問題,它內部是這樣描述的:
實際創建 session 的則是 NewSessionWithOptions 方法,代碼中的寫法
session.NewSessionWithOptions(session.Options{ SharedConfigState: session.SharedConfigEnable,})
會採用你自己放在 ~/.aws/credentials 的 shared credentials file 來建立 session,另外也有多種不同的建立方法,原始碼有點多就先不貼了,shared credentials file 是我自己目前最常用的,其他的有興趣再去研究吧~
最後 svc := dynamodb.New(sess) 這行便是創建了 dynamodb client 的結構,採用了我們剛剛建立好,確保不會出什麼問題的 sess 作為參數,後續對於 dynamodb 的操作都會透過此 client 結構來執行。
Create CreateTableInput instance
DynamoDB 對於操作的部分已經定義好了明確的結構,呼叫方法時便是以實作出來的結構體作為參數。單一結構體內可描述的行為非常多元,可一次性完成多項任務,無須分多個方法呼叫。CreateTableInput 就是其中一種,後續筆記中的其他方法也都同樣適用這個邏輯。
AttributeDefinitions 是 CreateTableInput 結構中的其中一個元件,是一個 AttributeDefinition 的 slice ,主要用於定義屬性的名稱和型別,詳細描述如下:
另一塊是 KeySchema,是個 KeySchemaElement 的 slice ,描述了屬性的分類及排序的鍵值:
ProvisionedThroughput 元件主要用來描述資料庫的吞吐量限制,超過限制的話會被回傳 ThrottlingException,看起來像是個防止被惡意注入或竊取的防護措施。ProvisionedThroughput 結構內容如下:
最後 TableName 就是 Table 名稱,沒什麼好解釋的了 ~ XD
好了!我們已經在 CreateTableInput 結構體內完整描述了我們要做的操作,接著就是執行創建 Table 和 error handling 了,再貼一次簡潔又療癒的代碼,幫讀者省掉往上滑看代碼的力氣。
Ref
DynamoDB 初體驗感覺還算簡單易用,但第一次寫筆記總是詳細點比較好。之前看 github 上其他大神的 Golang 教材,也引用了不少原始碼,我自己讀起來是覺得頗有幫助的,所以這次我也連原始碼一起看了一遍希望能進一步理解設計的巧妙之處。
後續會再補上 DynamoDB client 的其他方法使用筆記,不過基本上邏輯流程都大同小異,寫起來就不會太囉嗦了 XD ~感謝各位願意讀完文章,歡迎各位路過的大大給予指教!