前提・実現したいこと
AWS lambdaでslackのslashコマンドを作成しようとしています。
slashコマンドの処理内容は、「インターネットからPDFをダウンロードし、それを画像に変換してslackに投稿する」です。
PDFを画像に変換するためにpdf2imageというモジュールを使用したいと思っているのですが、lambdaでpdf2imageが使える環境を構築する段階で躓いています。
環境
・ソースコード
python
1# lambda_function.py 2from pdf2image import convert_from_path 3 4# 略 ここまででPDFをダウンロードし、/tmp/menu.pdf に保存 5 poppler_dir = '/home/ec2-user/environment/FunctionName/FunctionName/poppler/bin' 6 os.environ["PATH"] += os.pathsep + poppler_dir 7 8 pdf_path = "/tmp/menu.pdf" 9 pages = convert_from_path(pdf_path, 150) 10# 略 ここからPDFを画像にしslackに投稿
・ディレクトリ構造
/home/ec2-user/environment ├ FunctionName | ├ FunctionName | | ├ poppler | | | ├ bin | | | └ ... | | └ lambda_function.py | ├ pdf2image | ├ Pillow | ├ PIL | ├ venv | ├ __init__.py | ├ requirements.txt | └ template.yaml └ README.md
発生している問題・エラーメッセージ
pdf2imageのconvert_from_pathを使用したところ、以下エラーが発生しました。
{ "errorType": "PDFInfoNotInstalledError", "errorMessage": "Unable to get page count. Is poppler installed and in PATH?", "stackTrace": [ " File \"/var/task/FunctionName/lambda_function.py\", line 32, in lambda_handler\n pages = convert_from_path(pdf_path, 150)\n", " File \"/var/task/pdf2image/pdf2image.py\", line 89, in convert_from_path\n page_count = pdfinfo_from_path(pdf_path, userpw, poppler_path=poppler_path)[\"Pages\"]\n", " File \"/var/task/pdf2image/pdf2image.py\", line 431, in pdfinfo_from_path\n \"Unable to get page count. Is poppler installed and in PATH?\"\n" ] }
os.environ["PATH"] += os.pathsep + poppler_dir
で、poppler/binへのパスは通っているハズなんですが...
試したこと
1. エラーを見るに、環境変数PATHにpoppler/binが通せてないように見えたので、こちらを参考に以下を試してみました。
export PATH=$PATH:/home/ec2-user/environment/FunctionName/FunctionName/poppler/bin
が、解決しませんでした。
2. こちらも見つけたので試してみました。
#template.yaml Resources: FunctionName: Type: 'AWS::Serverless::Function' Properties: # 中略 Environment: Variables: path: '/home/ec2-user/environment/FunctionName/FunctionName/poppler/bin'
が、こちらでも解決しませんでした。
3.こちらやこちらを参考に、ソースコードのpoppler_dirを以下のように変えてみました。
poppler_dir = Path(__file__).parent.absolute() / "poppler/bin" poppler_dir = os.path.join(os.getcwd(), "poppler", "bin") print(str(poppler_dir)) # /var/task/poppler/bin
が、これでも解決しませんでした。
質問内容
cloud9でlambda関数を編集しているのですが、環境変数にパスを通す方法を教えて頂けますと大変助かります。
もしくは、環境変数を設定しない方法でpdf2imageを使用する方法や、pdf2image以外でPDFを画像に変換するモジュール等あればそちらでも大変ありがたいです。
追記
その後も調べたところ、Lambdaに上げたpopplerはWindows用ということが判明しました。
なのでLinux用のpopplerをインストールしようとしましたが、cmakeのバージョンが低い、freetypeが無い、fontconfigが無い等々、問題が続出し...
英語のドキュメントを騙し騙し読むのも疲れてしまったので、LambdaからEC2起動→EC2で処理(動作確認済)→LambdaでEC2停止という構成にしようと思います。
完成したら自己解決とします
あなたの回答
tips
プレビュー