Aug 4, 2017 AWS English
文件檔格式轉換幾乎是 Web 應用程式會需要的功能。要實現這個功能,我們可以利用 Pandoc 與可拋棄式的運算環境,例如: AWS Lambda。但是,Lambda 預設的套件並未包含 Pandoc,所以要在 Lambda 上使用的話,我們必須先自行編譯 Pandoc 執行檔。因此,本篇文章將介紹如何編譯 Pandoc 並在 AWS Lambda 上執行。
為了編譯一個可以在 AWS Lambda 環境下運行的 Pandoc,我們必須準備一個極為相似的運算環境。幸運地是,我們可以利用 Docker 和 docker-lambda 來模擬 Lambda 環境。取得 Docker Image:
docker pull lambci/lambda:build-python2.7
開始之前,先來安裝開發套件 (注意,容器預設的工作目錄為 /var/task):
# 安裝開發套件
yum -y install gmp-devel freeglut-devel python-devel zlib-devel gcc m4
除了那些套件之外,我們還需要 GHC 與 Cabal:
# 安裝 GHC
GHC='https://downloads.haskell.org/~ghc/8.0.1/ghc-8.0.1-x86_64-centos67-linux.tar.xz'
curl -OL $GHC && tar xf ghc* && cd ghc* && ./configure --prefix=/usr && make install && cd ..
# 安裝 Cabal
CABAL='https://www.haskell.org/cabal/release/cabal-install-1.24.0.0/cabal-install-1.24.0.0-x86_64-unknown-linux.tar.gz'
mkdir .bin && cd .bin && curl -OL $CABAL && tar xf cabal* && cd ..
現在,讓我們開始編譯:
# 編譯 Pandoc
.bin/cabal sandbox init && \
.bin/cabal update && \
.bin/cabal install hsb2hs && \
.bin/cabal install --disable-documentation pandoc -fembed_data_files
# 壓縮 Pandoc
cp .cabal-sandbox/bin/pandoc .
gzip pandoc
編譯完成後,從容器中取得壓縮過的 Pandoc:
docker cp [container-name]:/var/task/pandoc.gz /path/to/local/pandoc.gz
如何在 AWS Lambda 上使用 Pandoc 呢?首先,建立一個 Lambda Function 並上傳你的程式與壓縮過的 Pandoc。接著,你必須了解 AWS Lambda 只讓我們在 /tmp 底下建立與下載檔案,所以我們將會解壓縮 Pandoc 到該處,並在那裡進行文件檔格式轉換。讓我們看個簡單的範例:
import subprocess
def init_cmd(cmd):
return subprocess.Popen(
cmd,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
def execute_cmd():
cmd = (
"cp pandoc.gz /tmp/pandoc.gz && "
"gzip -d /tmp/pandoc.gz && "
"chmod 755 /tmp/pandoc && "
"/tmp/pandoc -S -s /tmp/input-file -o /tmp/output-file"
)
process = init_cmd(cmd)
out, err = process.communicate()
# Then do anything you want
若對於文章內容有任何建議與指正,非常歡迎你告訴我或者與我一起討論 ! :)
zeckli.devforgalaxy@gmail.com © 2015-2019 zeckli, thanks to Jekyll and GitHub.