AWS Lambda(Python3.7)でPandocを実行する
2019/05/04
目次
昨日まで(AWS Batch)
昨日までは、Pandocを実行して、S3バケットにアップロードされたマークダウンをEPUBに変換するのに、AWS Batchを使おうと想ってました。
構成はこのような構成で、以下のブログに検証結果を書き残しました。
- Pandocサーバーのコンテナイメージを作成する
- ECR(Amazon Elastic Container Registry)にコンテナイメージをアップロードする
- AWS BatchでPandocコンテナイメージを実行する
今日から(AWS Lambda)
もともとAWS Lambdaでやりたかったのですが、Node.jsの手順はこちらのHOW TO RUN PANDOC IN AWS LAMBDAにあるのですが、Pythonでやるために調べるのが面倒だなあと思ってまして。。。。。
serverlesspub/pandoc-aws-lambda-binaryのReadmeを改めて読んでると、Lambda Layersでarn:aws:lambda:us-east-1:145266761615:layer:pandoc:1を直接指定したら使えるよ、と。
ソースにあるCloudFormationのテンプレートを見るとランタイムにPythonも入っているから大丈夫そうだなと。
ここで「ん?」と思って調べたのですが、Layerへのアクセス権はCLIで設定するようです。
aws lambda add-layer-version-permissionで設定できるようです。
アクセス許可されていないLayerのarnを指定してみたら、次のような表示になってちゃんと拒否されました。
ARNを指定してLayerを追加してPandocを試してみる
Lambda関数にレイヤーを追加するときに「レイヤーバージョンARNを提供」を選択して追加しました。
LambdaのIAMロールは「AWSLambdaExecute」をアタッチしたロールを設定しました。
ランタイムはPython3.7です。
テストしたコードは下記です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import json, subprocess, boto3 def lambda_handler(event, context): args = ['ls', '/opt'] response = subprocess.check_output(args) print(response) args = ['ls', '/opt/bin'] response = subprocess.check_output(args) print(response) args = ['/opt/bin/pandoc', '--version'] response = subprocess.check_output(args) print(response) |
LayerはLambdaのoptディレクトリに展開されるので、lsコマンドで内容を確認してみてます。
arn提供元のReadmeに書いてたとおり、bin/pandocの構成になっているはずなのでとりあえずバージョンを確認してみます。
出力は以下でした。
1 2 3 4 |
b'bin\n' b'pandoc\n' b'pandoc 2.2.1\nCompiled with pandoc-types 1.17.4.2, texmath 0.11.0.1, skylighting 0.7.1\nDefault user data directory: \nCopyright (C) 2006-2018 John MacFarlane\nWeb: http://pandoc.org\nThis is free software; see the source for copying conditions.\nThere is no warranty, not even for merchantability or fitness\nfor a particular purpose.\n' |
予定どおりです。
Pythonでも問題なくPandocが動きそうです。
自アカウントのLayerで構築する
でも提供元のLayerがなくなったらその時点で終わりです。
なのでやっぱり自前のLayerが欲しいです。
調べれば作ることはできそうです。
でもたった今動きが確認できたものが、Lambdaのoptディレクトリ以下にあります。
せっかくなので、LambdaからPandoc実行ファイルをS3バケットへアップロードして、それをローカルへダウンロードしてbinディレクトリを作ってzipにしました。
これをLayerにアップロードして自前のLayer完成です。
提供元の方、ありがとうございます!
PandocでマークダウンからEPUBに変換してみる。
次のコードでテストしてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import subprocess, boto3 def lambda_handler(event, context): s3 = boto3.resource('s3') s3.meta.client.download_file( 'bucket', 'input/input.md', '/tmp/input.md' ) args = [ '/opt/bin/pandoc', '-f', 'markdown', '/tmp/input.md', '-o', '/tmp/output.epub' ] response = subprocess.check_output(args) s3.meta.client.upload_file( '/tmp/output.epub', 'bucket', '/output/output.epub' ) |
無事に変換されたEPUBができてました。
これでS3にマークダウンが置かれたことをトリガーに自動化できそうです。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
Transit GatewayポリシーテーブルでCloud WANのコアネットワークに接続しました
「ポリシーテーブルってなんですか?」のご質問をいただいたので設定してみました。 …
-
Backlogの課題チケット更新内容をMicrosoft Teamsに通知する(AWS Lambda Python)
BacklogにSlack連携が追加されました。 ですが、私の所属している会社で …
-
GoogleForm,GASからAPI Gateway, Lambdaで入力情報をDynamoDBに格納する
vol.26 AWS認定試験テキスト認定クラウドプラクティショナーのデモ(Dyn …
-
T2.microからT3.nanoに変更(メモリエラーも対応)
このブログのEC2インスタンスをT2.micro 1インスタンスからT3.nan …
-
クロスリージョンでEFSをマウントしてみる
ニーズがあるかどうかはさておき、クロスリージョンでのEFSファイルシステムをマウ …
-
AWSセルフマネージドAD環境にリモートデスクトップで接続
AWSクイックスタートのActive Directory Domain Serv …
-
SendGridのイベントをAPI Gateway -> Lambda(Python) -> DynamoDBに格納する
SendGridのメールイベントログはコンソールで確認出来るのは直近7日分で一括 …
-
JAWS FESTA 2019 Sapporo 参加&当日スタッフ&企業サポーターで!
2019年のJAWS FESTA は札幌です! 今回もありがたいことに、所属して …
-
EC2 Amazon LinuxのNginx+RDS MySQLにレンタルWebサーバーからWordPressを移設する(手順整理版)
ブログサイト(WordPress)をレンタルWebサーバーからAWSに移設する事 …
-
AWS Step Functions まずはパラレルでLambdaを並列実行してみました
複数のlambdaの実行制御をLambdaでやってましたが、その部分をStep …