隨手記,不記就會忘記。每天都要進步一點。
無伺服器實作入門 - 使用 AWS Lambda 和 DynamoDB 實作無伺服器 CRUD API
(Updated: April 5, 2022 ) 在上一篇文章,已經介紹如何安裝 Serverless Framework 以及註冊 AWS 帳號,接下來要組合使用AWS Lambda 和 DynamoDB 並透過 API gateway 的介導讓外部進行存取,實作一個記事本後端 CRUD API。 用預設模板(template)建立服務 俗話說「萬丈高樓平地起」,建立一個無伺服器服務就從模板開始。 在create命令加上--help列出幫助訊息,當中會列出有哪些預設模板可以用,不同的模板有不同的起始程式碼和設定。 serverless create --help --template 透過預設模板創建服務 --template-url 讀取遠端儲藏庫來創建服務 --path 指定創建服務的資料夾,不存在的話就會建立一個新的 我們要使用aws-nodejs這個模板來建立我們的服務: serverless create --template aws-nodejs --path serverless-notes-rest-api cd serverless-notes-rest-api npm init -y serverless-notes-rest-api資料夾下面有三個檔案handler.js、serverless.yml 和package.json,雖然裡面是很陽春的程式碼和設定,我們還是可以先部署到 AWS 看看。 serverless deploy --verbose 如果你在部署的過程中遇到錯誤,有可能是 AWS 帳戶權限給錯了,或是 serverless framework 讀不到正確的 credentials,所以最好在部署指令上加--verbose印出詳細的 log 去一一排除。...
無伺服器實作入門 - 安裝 Serverless Framework
無伺服器架構不是真的沒有伺服器,而是將管理伺服器基礎架構的責任轉移到雲服務供應商(AWS、Azure等)身上,從而簡化軟體開發過程,使開發團隊更專注在實現商業邏輯和產品的開發。 基礎設施即代碼 (IaC) 基礎設施即代碼 (IaC)對於軟體開發來說很重要,也是常被忽略的一環。雖然雲服務有提供圖形化的網頁介面控制台來配置無伺服器架構,一開始功能少的時候手動操作還應付得來,但是當功能拆分變多、業務規模變大時,對於測試、部署和環境管理配置就很難達到可重複性和一致性的需求。因此一開始就學習所謂的「正確姿勢」,對於後續開發、維護上的效率就能有所提升。 無伺服器框架可以滿足自動化部署服務的需求,由於我們會將無伺服器搭建在AWS上,所以可以選擇的框架有 AWS SAM 和 Serverless Framework。兩個都是開源框架,但是前者是專門針對 AWS 服務所開發的,而後者則支援多個不同的雲端供應商,如果後續要轉換到其他雲端進行開發,則框架還可以繼續沿用。 本文選擇使用 Serverless Framework 作為本次搭建的工具。 安裝 Serverless Framework 使用 Node.js 套件管理器 NPM 來安裝 serverless CLI: npm install -g serverless 官方也有提供 binary 執行檔的安裝方法 Installing Serverless Framework as a standalone binary 安裝完後輸入下方指令檢查一下,確認執行路徑有指向安裝框架的位置: serverless --version 註冊 AWS 並創建 Programmatic access 帳號 如果你沒有 AWS 帳號,首先要去註冊(sign up)一個 Root user,需要填寫信用卡資訊才能註冊。註冊資料填寫過程在此不詳述。 註冊成功後用 Root user 登入。由於 Root user 具有完全控制的管理員權限,基於安全理由官方建議(AWS account root user credentials and IAM user credentials )應該建立一個 IAM user 來存取 AWS 資源。由於篇幅的關係在此不詳述,附上官方文件操作說明 Creating IAM users (console),希望大家都能遵照這個安全原則進行操作。...
使用PyPDF4在PDF文件加入浮水印(watermark)
PDF(Portable Document Format)是工作上常會用到的一種文件格式,有較不容易修改、傳輸方便、設備相容性和印刷品質較佳等優點。一般我們開發的軟體要自動發報告、帳單或收據給客戶,也都會優先選擇PDF為主要格式。 合併PDF是目前加入浮水印的一種簡便方法,當浮水印樣式和內容固定的情況下開發會較為單純。本文以Pyhton的PyPDF4套件為例,雖然PyPDF4和PyPDF2不完全兼容,但此範例中所導入的函示方法和PyPDF2一樣,將套件名稱改掉後程式碼可以互相通用。 用來示範的兩份PDF檔案,original_doc.pdf 和 watermark.pdf,程式會將浮水印合併到 original_doc.pdf 每一頁。 original_doc.pdf watermark.pdf 套件安裝 首先,安裝最新版的PyPDF4 (以下指令基於python3): pip3 install PyPDF4 合併浮水印 merge_watermark()是實現合併浮水印的方法,每當合併完一頁PDF浮水印就透過writer實例立刻輸出。 from PyPDF4 import PdfFileWriter, PdfFileReader def merge_watermark(input_pdf, output_pdf, watermark): """ Merge watermark to target PDF """ watermark_obj = PdfFileReader(watermark) watermark_page = watermark_obj.getPage(0) pdf_reader = PdfFileReader(input_pdf) pdf_writer = PdfFileWriter() # Add watermark to each page for page_num in range(pdf_reader.getNumPages()): page = pdf_reader....
Linux Shell 重新導向: 將標準錯誤(stderr)輸出到螢幕和檔案
開發的時候曾經遇到一個情況,需要在 shell 執行程式時將 stderr 導向 console,但是不能顯示stdout 的訊息,且必須同時 stderr 和 stdout 記錄到 log 檔案。 文件描述符 (file descriptor) 在 UNIX/Linux 系統中,是使用非負整數(0, 1, 2, …)來表示文件描述符(file descriptor, fd),用於標示系統中打開的文件和資源。 系統預設打開 0 (stdin), 1 (stdout), 2 (stderr),也是我們平常常用到的描述符。 接下來會將需求實作出來,並舉幾個例子以及需要注意的地方: 藉由ls一個不存在的檔案來測試,並將 stderr 訊息導向 error.log,我們cat檔案可以看到錯誤訊息:ls: cannot access foo.txt: No such file or directory。 ls foo.txt 2>error.log 將 stderr 導向 stdout,指令中 &(ampersand)符號是告訴shell我們把 fd 2 導向 fd 1 這個fd而不是一個檔案名稱。 在linux下,一切皆檔案,所以系統背後所做的事情是將 fd 1 複製給 fd 2。 ls foo.txt 2>&1 以下的指令先將 stdout 導向 error....
寫部落格與分享
做為一名軟體工程師,工作也有幾年的時間了,一直都有紀錄和分享的想法,心裡卻擔心要分享的東西是不是太簡單了,或是不夠高大尚,老實說是我多慮了,對於現代人來說: 網路其實是人腦的延伸 寫程式寫到一半上網查個指令或程式碼片段,對工程師來說是家常便飯,你覺得簡單的東西人可能不覺得簡單。將知識消化的過程記錄下來,給了自己能回溯學習的機會,也給了其他人參考學習的來源。 相信每個人一定都有一個最熟悉的「主」語言,雖然說語言只是完成事情的工具,但是隨著程式語言不斷演進和開發需求的不同,懂得越多意味著擁有更多選擇,能用不同方式來解決同樣的問題。 如果你只有槌子,看甚麼都像釘子 因此,持續學習不同程式語言或新知識對於工程師來說就是一項必備的能力,但不要以為看懂了就能記起來,除非你是記憶力的人,否則其實大部分人都需要時常複習和練習,才能把知識變成是自己的東西。 做筆記 雖然市面上有許多種筆記軟體可供選擇,個人還是習慣使用文字檔寫個 Markdown 存在雲端,依照語言或項目做分類。當然,選擇自己慣用的方法即可。 筆記整理得多了,有時候也能幫助別人 例如,對某項技術比較生疏的同事,我就可以用15分鐘整理一份簡略版筆記讓他上手;想在小組內達成某個技術上的共識,也可以做一份簡報在小組會議的時候做分享。 能夠教別人才是真的懂 常常發現自己縱使做了筆記,也實作了一些成果出來,但當要跟別人說明時卻又說不出個所以然、吚吚啊阿講不到核心重點,事實上是因為自己也不是很懂。 撰寫文章也是「刻意練習」的一種方式 撰寫文章是最簡單的刻意練習方式,但和作筆記不同。撰寫文章會刻意的將得到的知識重複檢視並加以消化,這個過程往往可以發現自己誤解或不甚了解之處。透過不斷重複這些步驟: 學習 -> 筆記 -> 組織成文章,記錄的資訊量愈大,我們就愈能理解自己關注的領域。...