初投稿。メモも兼ねて
必要なもの
- Docker version 18.03.0-ce
- Python 3.7.3
- graphviz version 2.40.1
- AWS Lambda
- AWS S3
環境構築
1.Lambdaの環境に合わせてビルドするためにコンテナを用意する
$ docker run -v "{$PWD}":/var/task -it amazonlinux:2 /bin/bash
2.ビルドツールとかpython3をインストール
$ yum groupinstall "Development tools"
$ yum install -y cairo-devel pango-devel wget python3
3.Graphvizをビルド
$ wget https://graphviz.gitlab.io/pub/graphviz/stable/SOURCES/graphviz.tar.gz
$ tar -xvf graphviz.tar.gz
$ cd graphviz-2.40.1
$ ./configure --prefix=/var/task
$ make
$ make install
4.確認
$ /var/task/bin/dot -V
dot - graphviz version 2.40.1 (20161225.0304)
Lambda上でPythonから動かす
1.Lambdaで起動するスクリプトを書いとく
def lambda_handler(event,context):
# パスを通しておく
os.environ["PATH"]+=":/var/task/bin"
# SVG形式を指定。PNGとPDFはだめだった。
G = Digraph(format='svg')
G.attr('node', shape='circle')
N = 15
for i in range(N):
G.node(str(i), str(i))
for i in range(N):
if (i - 1) // 2 >= 0:
G.edge(str((i - 1) // 2), str(i))
print(G)
G.render('/tmp/tree')
# 描画できているか確認するためにS3にアップロード
bucket_name = "my-bucket-name"
s3 = boto3.resource('s3')
s3.Bucket(bucket_name).upload_file('/tmp/tree.svg', 'tree.svg')
return "OK"
2.S3にアップロードするdeploy_package.zipを作成
$ pip3 install -t /var/task graphviz
$ zip -r9 deploy_package.zip
3.deploy_package.zipをS3にアップロードしてLambdaを作成。ロールにS3アップロード権限付けること。
結果
LambdaをテストするとS3バケットに「tree.svg」があるはず。
参考
参考にさせて頂きました。
Deploying Graphviz on AWS Lambda
graphvizを使ってPython3で木構造を描く