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
関連記事
-
AWSアカウント内特定リージョン内のDynamoDBテーブルを全削除するLambda(Python)
やりたいこと タイトル通りですが、特定アカウントの特定リージョン内のDynamo …
-
「CMC_Central 2024」に参加しました
個人サポーターとしてCMC_Central 2024に参加しました。 オープニン …
-
Amazon Chimeのチャットを使ってみました
Amazon Chimeはビデオミーティングや配信したりというサービスですが、チ …
-
EKS「現在の IAM プリンシパルは、このクラスター上の Kubernetes オブジェクトにアクセスできません」
マネジメントコンソールでクラスターのオブジェクトを見ようと、リソースの名前空間や …
-
JAWS-UG Osaka 第15回勉強会 AWS Summit Tokyo 2016 アップデート追っかけ会
「JAWS-UG Osaka 第15回勉強会 AWS Summit Tokyo …
-
Amazon Linux2のPHPを7.2から7.3へアップデートしました
WordPressのサイトヘルスの推奨に従って使っていないテーマを削除したの推奨 …
-
AWS WAFのマネージドルールを見てみました
Web ACLで[Add managed rule groups]を選択しました …
-
AWSアカウントの解約
アカウント作成メニュー確認のために作成したAWSアカウントを解約しました。 使っ …
-
SCPが影響しないサービスにリンクされたロールにEC2が引き受けるIAMロールは含まれないことを確認
ドキュメントで確認 サービスコントロールポリシーのユーザーガイドには、「SCPは …
-
JAWS-UG関西「AI で人を笑わせてみよう!ハンズオン」に参加しました
AI で人を笑わせてみよう!ハンズオン 灼熱の7月最終日にJAWS-UG関西のオ …