編譯 Pandoc 並在 AWS Lambda 上執行

Aug 4, 2017 AWS English

文件檔格式轉換幾乎是 Web 應用程式會需要的功能。要實現這個功能,我們可以利用 Pandoc 與可拋棄式的運算環境,例如: AWS Lambda。但是,Lambda 預設的套件並未包含 Pandoc,所以要在 Lambda 上使用的話,我們必須先自行編譯 Pandoc 執行檔。因此,本篇文章將介紹如何編譯 Pandoc 並在 AWS Lambda 上執行。



前置準備

為了編譯一個可以在 AWS Lambda 環境下運行的 Pandoc,我們必須準備一個極為相似的運算環境。幸運地是,我們可以利用 Dockerdocker-lambda 來模擬 Lambda 環境。取得 Docker Image:

docker pull lambci/lambda:build-python2.7


編譯 Pandoc

開始之前,先來安裝開發套件 (注意,容器預設的工作目錄為 /var/task):

# 安裝開發套件
yum -y install gmp-devel freeglut-devel python-devel zlib-devel gcc m4

除了那些套件之外,我們還需要 GHCCabal

# 安裝 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


使用 Pandoc

如何在 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.