SlideShare a Scribd company logo
画像処理を
AWS LambdaのPythonで!
JAWS-UG Meetup in AWS Cloud Roadshow 名古屋
ワンダープラネット株式会社
取締役 CTO 村田知常
自己紹介
• 村田 知常(むらた ともつね)

  tomotsune.murata
• ワンダープラネット株式会社 取締役 CTO
• 好きな言語 Swift
• 好きなAWS

   Amazon S3
  ワンダープラネット株式会社
• 2012年9月3日 設立
• iOS/Android向けフルネイティブのソーシャルゲームを出してます
• AWSには大変お世話になってます!
本日、ver.1.1.6を配信!本日、ver.1.1.6を配信!
re:Invent2015で来ました
\(^O^)/
Lambda
+
• サーバーサイドのメイン言語
• MayaのPythonスクリプティング
• ちょっとしたコマンドラインツール
+
早速、試しました!
(-_☆)キラーン
画像処理をAWS LambdaのPythonで!
• Pythonで実装
• RSSフィードを定期的に取得

→ 新機能 スケジュール化 の検証
• RSSフィードの解析に「feedpaser」

→ 外部ライブラリの利用
• CloudWatchのLogsに出力

→ printで手抜き
本当に試したかったのは
これではなかった…
S3に画像をアップしたら
Pythonライブラリを使って
画像を加工したい
※ 外部サービスは使わず
ブログアップ日に
間に合わなかった…
画像処理ライブラリ
使おう
とした
Python Imaging Library (PIL)のforkプロジェクト
• ピクセル毎の操作
• マスキングと透明度の制御
• ぼかし、輪郭補正、スムージング、輪郭検出などの画像フィルタ
• シャープ化、明るさ補正、コントラスト補正、色補正などの画像の調整
• 画像へのテキストの追加
• その他いろいろ
Unable to import module 'lambda_function': /
var/task/PIL/_imaging.so: invalid ELF header
普通にMac上で実装したものを
Lambdaで実行すると…
Pillowインストール時に環境に合わせて
一部ライブラリをビルドしている
Mac向けにビルドしたものは
Linux上では動かないよ
$ sudo yum install python-devel
$ sudo yum install libtiff-devel libjpeg-devel libzip-devel freetype-devel 
lcms2-devel libwebp-devel tcl-devel tk-devel
$ sudo yum install gcc
EC2(Amazon Linux AMI 2015.09)上で構築
必要なライブラリをインストール
作業ディレクトリに移動
$ vim setup.cfg
[install]
install-purelib=$base/lib64/python
$ pip install Pillow -t .
Pillowのドキュメントに
沿ってインストール
ビルドに必要
(gcc無いのね…)
<workdir>
├── PIL
│   ├── BdfFontFile.py
│   :
│   :
├── Pillow-3.0.0.egg-info
│   ├── PKG-INFO
│   :
│   :
├── lambda_function.py ← このファイルを作成し実装
└── setup.cfg
完成するとこんな感じ
Macで作ると
Pillow-3.0.0.dist-info
準備完了
\(^O^)/
EC2(Amazon Linux AMI 2015.09)上で構築
Lambda functionの実装
• inputフォルダにPNG画像をPut
• Lambdaを起動しサムネイルを作成
• サムネイルをoutputフォルダに出力
Lambda functionの実装
オリジナル画像
80x80画像
Lambdaで
画像を加工
from PIL import Image
import boto3
import os
import re
s3 = boto3.client('s3')
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
print u'Bucket=' + bucket
print u'key=' + key
tmp = u'/tmp/' + os.path.basename(key)
output = re.sub(r'^input/', u'output/', key)
try:
s3.download_file(Bucket=bucket, Key=key, Filename=tmp)
img = Image.open(tmp, 'r')
img.thumbnail((80, 80), Image.ANTIALIAS)
img.save(tmp, 'PNG')
s3.upload_file(Filename=tmp, Bucket=bucket, Key=output)
return
except Exception as e:
print(e)
raise e
Lambda functionの実装
from PIL import Image
import boto3
import os
import re
s3 = boto3.client('s3')
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
print u'Bucket=' + bucket
print u'key=' + key
tmp = u'/tmp/' + os.path.basename(key)
output = re.sub(r'^input/', u'output/', key)
try:
s3.download_file(Bucket=bucket, Key=key, Filename=tmp)
img = Image.open(tmp, 'r')
img.thumbnail((80, 80), Image.ANTIALIAS)
img.save(tmp, 'PNG')
s3.upload_file(Filename=tmp, Bucket=bucket, Key=output)
return
except Exception as e:
print(e)
raise e
Lambda functionの実装
Bucketから
ファイルを取得
/tmp/下に保存
Lambdaから
/tmp/はアクセス可能
容量は500MB
from PIL import Image
import boto3
import os
import re
s3 = boto3.client('s3')
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
print u'Bucket=' + bucket
print u'key=' + key
tmp = u'/tmp/' + os.path.basename(key)
output = re.sub(r'^input/', u'output/', key)
try:
s3.download_file(Bucket=bucket, Key=key, Filename=tmp)
img = Image.open(tmp, 'r')
img.thumbnail((80, 80), Image.ANTIALIAS)
img.save(tmp, 'PNG')
s3.upload_file(Filename=tmp, Bucket=bucket, Key=output)
return
except Exception as e:
print(e)
raise e
Lambda functionの実装
80 x 80
サムネイルを作成
from PIL import Image
import boto3
import os
import re
s3 = boto3.client('s3')
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
print u'Bucket=' + bucket
print u'key=' + key
tmp = u'/tmp/' + os.path.basename(key)
output = re.sub(r'^input/', u'output/', key)
try:
s3.download_file(Bucket=bucket, Key=key, Filename=tmp)
img = Image.open(tmp, 'r')
img.thumbnail((80, 80), Image.ANTIALIAS)
img.save(tmp, 'PNG')
s3.upload_file(Filename=tmp, Bucket=bucket, Key=output)
return
except Exception as e:
print(e)
raise e
Lambda functionの実装
output/に
ファイルをアップロード
時間があったら
デモ
まとめ
• Pillowを使えば色々と凝った画像処理が可能
• ビルドを必要とするライブラリを

AWS Lambdaで使うノウハウを習得
• AWS LambdaをPythonで実装できる!
• これで開発・運用をサポートする

ツール作成が る
ご清聴ありがとうございました

More Related Content

PDF
lambda-lgtm
PDF
AWSでAPI Gatewayから非同期でLambdaを起動してS3にファイルアップロードしようとしたらハマった話。
PPTX
はじめてのAWS Lambda
PDF
AWS Lambda のご紹介 2015 JAWS沖縄
PDF
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
PDF
AWS LambdaとAPI Gatewayでサーバレスなシステム構築に踏み出してみる
PPTX
node.jsでS3にバックアップを送り続けるコードを書いてみた話。Node s3maの紹介-jawsugさいたま
PDF
AWS Lambdaによるサーバレスアーキテクチャの基本に触れてみよう!【kintone & AWS ハンズオン祭り2015秋 B-2】
lambda-lgtm
AWSでAPI Gatewayから非同期でLambdaを起動してS3にファイルアップロードしようとしたらハマった話。
はじめてのAWS Lambda
AWS Lambda のご紹介 2015 JAWS沖縄
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
AWS LambdaとAPI Gatewayでサーバレスなシステム構築に踏み出してみる
node.jsでS3にバックアップを送り続けるコードを書いてみた話。Node s3maの紹介-jawsugさいたま
AWS Lambdaによるサーバレスアーキテクチャの基本に触れてみよう!【kintone & AWS ハンズオン祭り2015秋 B-2】

What's hot (20)

PDF
Application Deployment on AWS
PDF
AWS Black Belt Techシリーズ AWS Lambda
PPTX
aws lambdaでpythonを実行するときのチューニング案を試してみた!
PDF
AWS Lambdaで作るクローラー/スクレイピング
PDF
Lambdaのscheduled eventで実現する運用視点のサーバレスパターン
PDF
速習 AWS Lambda
PDF
Lambda × Mobileの可能性
PDF
AWS SAMで始めるサーバーレスアプリケーション開発
PDF
20160526 AWSサービスアップデート
PPTX
20160312 Jaws Days 2016 API Gateway+Lambda
PDF
俺のLambda
PDF
Lambdaによるクラウド型言語の実装
PPTX
AWS Batch Fargate対応は何をもたらすか
PDF
PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編
PDF
Serverless Architecture on AWS(20151023版)
PDF
AWS Black Belt Tech シリーズ 2015 - AWS Data Pipeline
PDF
AWS re:Invent2019 Overview & New Releases Summary for Game
PDF
20150908 ”時間の流れ” という無限リストを扱うAWS Lambda
PDF
AWS Search Services
PPTX
サーバーレスアプリケーションの作り方
Application Deployment on AWS
AWS Black Belt Techシリーズ AWS Lambda
aws lambdaでpythonを実行するときのチューニング案を試してみた!
AWS Lambdaで作るクローラー/スクレイピング
Lambdaのscheduled eventで実現する運用視点のサーバレスパターン
速習 AWS Lambda
Lambda × Mobileの可能性
AWS SAMで始めるサーバーレスアプリケーション開発
20160526 AWSサービスアップデート
20160312 Jaws Days 2016 API Gateway+Lambda
俺のLambda
Lambdaによるクラウド型言語の実装
AWS Batch Fargate対応は何をもたらすか
PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編
Serverless Architecture on AWS(20151023版)
AWS Black Belt Tech シリーズ 2015 - AWS Data Pipeline
AWS re:Invent2019 Overview & New Releases Summary for Game
20150908 ”時間の流れ” という無限リストを扱うAWS Lambda
AWS Search Services
サーバーレスアプリケーションの作り方
Ad

Similar to 画像処理をAWS LambdaのPythonで! (20)

PDF
serverless framework + AWS Lambda with Python
PPTX
Jawsdays2017(配布用)
PPTX
AWS Lambda + Go
PDF
AWS Black Belt Online Seminar - Amazon Lightsail
PPTX
サーバレスアプリケーション構築入門
PDF
JAWSDAYS2016 Technical Deep DIVE
PDF
CloudFormation/SAMのススメ
PDF
Programming AWS with Perl at YAPC::Asia 2013
PDF
AWS Glueを使った Serverless ETL の実装パターン
PDF
20170705 blackbelt AWS Lambda
PPTX
JAWS-UG 愛媛 第6回勉強会(Lambda)
PDF
AWS Lambda ハンズオン 2-Tier アーキテクチャで未来へ
PDF
Anchors Aweigh!! - re:Invent報告@re:Port 2016 大阪
PPTX
はじめてのAws lambda
PDF
JAWS-UG Okinawa 2017/01
PDF
AWS小ネタ集
PDF
初めてのクラウド AWS編
PDF
20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice
PDF
APIMeetup 20170329_ichimura
PDF
Windows 開発者のための Dev&Ops on AWS
serverless framework + AWS Lambda with Python
Jawsdays2017(配布用)
AWS Lambda + Go
AWS Black Belt Online Seminar - Amazon Lightsail
サーバレスアプリケーション構築入門
JAWSDAYS2016 Technical Deep DIVE
CloudFormation/SAMのススメ
Programming AWS with Perl at YAPC::Asia 2013
AWS Glueを使った Serverless ETL の実装パターン
20170705 blackbelt AWS Lambda
JAWS-UG 愛媛 第6回勉強会(Lambda)
AWS Lambda ハンズオン 2-Tier アーキテクチャで未来へ
Anchors Aweigh!! - re:Invent報告@re:Port 2016 大阪
はじめてのAws lambda
JAWS-UG Okinawa 2017/01
AWS小ネタ集
初めてのクラウド AWS編
20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice
APIMeetup 20170329_ichimura
Windows 開発者のための Dev&Ops on AWS
Ad

More from Tomotsune Murata (11)

PDF
Photon Enterprise Cloud 事例
PDF
人気ゲームアプリ「クラッシュフィーバー」におけるAWS活用
PDF
クラッシュフィーバーのシステム構成
PDF
クラッシュフィーバー開発の裏側
PDF
Xcode7 / iOS 9 対応でハマったこと
PDF
コストみてますか?
PDF
すっかりマカーな私がWindowsに戻ってみた
PDF
MFi Controller〜それは忘れられたiOS7新機能〜
PDF
SQLiteを手軽に・セキュアに
PDF
cocos2dで手軽にアニメーション
PDF
スタートアップだからこそ使うAWS(第5回JAWS-UG Nagoya)
Photon Enterprise Cloud 事例
人気ゲームアプリ「クラッシュフィーバー」におけるAWS活用
クラッシュフィーバーのシステム構成
クラッシュフィーバー開発の裏側
Xcode7 / iOS 9 対応でハマったこと
コストみてますか?
すっかりマカーな私がWindowsに戻ってみた
MFi Controller〜それは忘れられたiOS7新機能〜
SQLiteを手軽に・セキュアに
cocos2dで手軽にアニメーション
スタートアップだからこそ使うAWS(第5回JAWS-UG Nagoya)

画像処理をAWS LambdaのPythonで!

  • 1. 画像処理を AWS LambdaのPythonで! JAWS-UG Meetup in AWS Cloud Roadshow 名古屋 ワンダープラネット株式会社 取締役 CTO 村田知常
  • 2. 自己紹介 • 村田 知常(むらた ともつね)
   tomotsune.murata • ワンダープラネット株式会社 取締役 CTO • 好きな言語 Swift • 好きなAWS
    Amazon S3
  • 3.   ワンダープラネット株式会社 • 2012年9月3日 設立 • iOS/Android向けフルネイティブのソーシャルゲームを出してます • AWSには大変お世話になってます! 本日、ver.1.1.6を配信!本日、ver.1.1.6を配信!
  • 9. • Pythonで実装 • RSSフィードを定期的に取得
 → 新機能 スケジュール化 の検証 • RSSフィードの解析に「feedpaser」
 → 外部ライブラリの利用 • CloudWatchのLogsに出力
 → printで手抜き
  • 13. 画像処理ライブラリ 使おう とした Python Imaging Library (PIL)のforkプロジェクト • ピクセル毎の操作 • マスキングと透明度の制御 • ぼかし、輪郭補正、スムージング、輪郭検出などの画像フィルタ • シャープ化、明るさ補正、コントラスト補正、色補正などの画像の調整 • 画像へのテキストの追加 • その他いろいろ
  • 14. Unable to import module 'lambda_function': / var/task/PIL/_imaging.so: invalid ELF header 普通にMac上で実装したものを Lambdaで実行すると… Pillowインストール時に環境に合わせて 一部ライブラリをビルドしている Mac向けにビルドしたものは Linux上では動かないよ
  • 15. $ sudo yum install python-devel $ sudo yum install libtiff-devel libjpeg-devel libzip-devel freetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel $ sudo yum install gcc EC2(Amazon Linux AMI 2015.09)上で構築 必要なライブラリをインストール 作業ディレクトリに移動 $ vim setup.cfg [install] install-purelib=$base/lib64/python $ pip install Pillow -t . Pillowのドキュメントに 沿ってインストール ビルドに必要 (gcc無いのね…)
  • 16. <workdir> ├── PIL │   ├── BdfFontFile.py │   : │   : ├── Pillow-3.0.0.egg-info │   ├── PKG-INFO │   : │   : ├── lambda_function.py ← このファイルを作成し実装 └── setup.cfg 完成するとこんな感じ Macで作ると Pillow-3.0.0.dist-info 準備完了 \(^O^)/ EC2(Amazon Linux AMI 2015.09)上で構築
  • 17. Lambda functionの実装 • inputフォルダにPNG画像をPut • Lambdaを起動しサムネイルを作成 • サムネイルをoutputフォルダに出力
  • 19. from PIL import Image import boto3 import os import re s3 = boto3.client('s3') def lambda_handler(event, context): bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] print u'Bucket=' + bucket print u'key=' + key tmp = u'/tmp/' + os.path.basename(key) output = re.sub(r'^input/', u'output/', key) try: s3.download_file(Bucket=bucket, Key=key, Filename=tmp) img = Image.open(tmp, 'r') img.thumbnail((80, 80), Image.ANTIALIAS) img.save(tmp, 'PNG') s3.upload_file(Filename=tmp, Bucket=bucket, Key=output) return except Exception as e: print(e) raise e Lambda functionの実装
  • 20. from PIL import Image import boto3 import os import re s3 = boto3.client('s3') def lambda_handler(event, context): bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] print u'Bucket=' + bucket print u'key=' + key tmp = u'/tmp/' + os.path.basename(key) output = re.sub(r'^input/', u'output/', key) try: s3.download_file(Bucket=bucket, Key=key, Filename=tmp) img = Image.open(tmp, 'r') img.thumbnail((80, 80), Image.ANTIALIAS) img.save(tmp, 'PNG') s3.upload_file(Filename=tmp, Bucket=bucket, Key=output) return except Exception as e: print(e) raise e Lambda functionの実装 Bucketから ファイルを取得 /tmp/下に保存 Lambdaから /tmp/はアクセス可能 容量は500MB
  • 21. from PIL import Image import boto3 import os import re s3 = boto3.client('s3') def lambda_handler(event, context): bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] print u'Bucket=' + bucket print u'key=' + key tmp = u'/tmp/' + os.path.basename(key) output = re.sub(r'^input/', u'output/', key) try: s3.download_file(Bucket=bucket, Key=key, Filename=tmp) img = Image.open(tmp, 'r') img.thumbnail((80, 80), Image.ANTIALIAS) img.save(tmp, 'PNG') s3.upload_file(Filename=tmp, Bucket=bucket, Key=output) return except Exception as e: print(e) raise e Lambda functionの実装 80 x 80 サムネイルを作成
  • 22. from PIL import Image import boto3 import os import re s3 = boto3.client('s3') def lambda_handler(event, context): bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] print u'Bucket=' + bucket print u'key=' + key tmp = u'/tmp/' + os.path.basename(key) output = re.sub(r'^input/', u'output/', key) try: s3.download_file(Bucket=bucket, Key=key, Filename=tmp) img = Image.open(tmp, 'r') img.thumbnail((80, 80), Image.ANTIALIAS) img.save(tmp, 'PNG') s3.upload_file(Filename=tmp, Bucket=bucket, Key=output) return except Exception as e: print(e) raise e Lambda functionの実装 output/に ファイルをアップロード
  • 24. まとめ • Pillowを使えば色々と凝った画像処理が可能 • ビルドを必要とするライブラリを
 AWS Lambdaで使うノウハウを習得 • AWS LambdaをPythonで実装できる! • これで開発・運用をサポートする
 ツール作成が る