SlideShare une entreprise Scribd logo
1  sur  25
Télécharger pour lire hors ligne
画像処理を
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スクリプティング
• ちょっとしたコマンドラインツール
+
早速、試しました!
(-_☆)キラーン
• 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で実装できる!
• これで開発・運用をサポートする

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

Contenu connexe

Tendances

Application Deployment on AWS
Application Deployment on AWSApplication Deployment on AWS
Application Deployment on AWSEiji Shinohara
 
aws lambdaでpythonを実行するときのチューニング案を試してみた!
aws lambdaでpythonを実行するときのチューニング案を試してみた!aws lambdaでpythonを実行するときのチューニング案を試してみた!
aws lambdaでpythonを実行するときのチューニング案を試してみた!Shun Fukazawa
 
AWS Lambdaで作るクローラー/スクレイピング
AWS Lambdaで作るクローラー/スクレイピングAWS Lambdaで作るクローラー/スクレイピング
AWS Lambdaで作るクローラー/スクレイピングTakuro Sasaki
 
Lambdaのscheduled eventで実現する運用視点のサーバレスパターン
Lambdaのscheduled eventで実現する運用視点のサーバレスパターンLambdaのscheduled eventで実現する運用視点のサーバレスパターン
Lambdaのscheduled eventで実現する運用視点のサーバレスパターンJin k
 
Lambda × Mobileの可能性
Lambda × Mobileの可能性Lambda × Mobileの可能性
Lambda × Mobileの可能性yuki0211s
 
AWS SAMで始めるサーバーレスアプリケーション開発
AWS SAMで始めるサーバーレスアプリケーション開発AWS SAMで始めるサーバーレスアプリケーション開発
AWS SAMで始めるサーバーレスアプリケーション開発真吾 吉田
 
20160526 AWSサービスアップデート
20160526 AWSサービスアップデート20160526 AWSサービスアップデート
20160526 AWSサービスアップデートGenta Watanabe
 
20160312 Jaws Days 2016 API Gateway+Lambda
20160312 Jaws Days 2016 API Gateway+Lambda20160312 Jaws Days 2016 API Gateway+Lambda
20160312 Jaws Days 2016 API Gateway+LambdaKazuki Ueki
 
Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装Sugawara Genki
 
AWS Batch Fargate対応は何をもたらすか
AWS Batch Fargate対応は何をもたらすかAWS Batch Fargate対応は何をもたらすか
AWS Batch Fargate対応は何をもたらすかShun Fukazawa
 
PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編
PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編
PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編Yoshihiro Ohsuka
 
Serverless Architecture on AWS(20151023版)
Serverless Architecture on AWS(20151023版)Serverless Architecture on AWS(20151023版)
Serverless Architecture on AWS(20151023版)Keisuke Nishitani
 
AWS Black Belt Tech シリーズ 2015 - AWS Data Pipeline
AWS Black Belt Tech シリーズ 2015 - AWS Data PipelineAWS Black Belt Tech シリーズ 2015 - AWS Data Pipeline
AWS Black Belt Tech シリーズ 2015 - AWS Data PipelineAmazon Web Services Japan
 
AWS re:Invent2019 Overview & New Releases Summary for Game
AWS re:Invent2019 Overview &New Releases Summary for GameAWS re:Invent2019 Overview &New Releases Summary for Game
AWS re:Invent2019 Overview & New Releases Summary for GameAmazon Web Services Japan
 
20150908 ”時間の流れ” という無限リストを扱うAWS Lambda
20150908 ”時間の流れ” という無限リストを扱うAWS Lambda20150908 ”時間の流れ” という無限リストを扱うAWS Lambda
20150908 ”時間の流れ” という無限リストを扱うAWS Lambda都元ダイスケ Miyamoto
 
サーバーレスアプリケーションの作り方
サーバーレスアプリケーションの作り方サーバーレスアプリケーションの作り方
サーバーレスアプリケーションの作り方Yoichi Toyota
 

Tendances (20)

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

Similaire à 画像処理をAWS LambdaのPythonで!

serverless framework + AWS Lambda with Python
serverless framework + AWS Lambda with Pythonserverless framework + AWS Lambda with Python
serverless framework + AWS Lambda with Pythonmasahitojp
 
Jawsdays2017(配布用)
Jawsdays2017(配布用)Jawsdays2017(配布用)
Jawsdays2017(配布用)Yutaka Hiroyama
 
AWS Black Belt Online Seminar - Amazon Lightsail
AWS Black Belt Online Seminar - Amazon Lightsail AWS Black Belt Online Seminar - Amazon Lightsail
AWS Black Belt Online Seminar - Amazon Lightsail Amazon Web Services Japan
 
サーバレスアプリケーション構築入門
サーバレスアプリケーション構築入門サーバレスアプリケーション構築入門
サーバレスアプリケーション構築入門YoshihiroHorizono1
 
JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE 陽平 山口
 
CloudFormation/SAMのススメ
CloudFormation/SAMのススメCloudFormation/SAMのススメ
CloudFormation/SAMのススメEiji KOMINAMI
 
Programming AWS with Perl at YAPC::Asia 2013
Programming AWS with Perl at YAPC::Asia 2013Programming AWS with Perl at YAPC::Asia 2013
Programming AWS with Perl at YAPC::Asia 2013Yasuhiro Horiuchi
 
AWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターンAWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターンseiichi arai
 
JAWS-UG 愛媛 第6回勉強会(Lambda)
JAWS-UG 愛媛 第6回勉強会(Lambda)JAWS-UG 愛媛 第6回勉強会(Lambda)
JAWS-UG 愛媛 第6回勉強会(Lambda)Takahiro Kato
 
AWS Lambda ハンズオン 2-Tier アーキテクチャで未来へ
AWS Lambda ハンズオン 2-Tier アーキテクチャで未来へAWS Lambda ハンズオン 2-Tier アーキテクチャで未来へ
AWS Lambda ハンズオン 2-Tier アーキテクチャで未来へAmazon Web Services Japan
 
Anchors Aweigh!! - re:Invent報告@re:Port 2016 大阪
Anchors Aweigh!! - re:Invent報告@re:Port 2016 大阪Anchors Aweigh!! - re:Invent報告@re:Port 2016 大阪
Anchors Aweigh!! - re:Invent報告@re:Port 2016 大阪真吾 吉田
 
はじめてのAws lambda
はじめてのAws lambdaはじめてのAws lambda
はじめてのAws lambdadcubeio
 
JAWS-UG Okinawa 2017/01
JAWS-UG Okinawa 2017/01JAWS-UG Okinawa 2017/01
JAWS-UG Okinawa 2017/01司 知花
 
初めてのクラウド AWS編
初めてのクラウド AWS編初めてのクラウド AWS編
初めてのクラウド AWS編Koichiro Nishijima
 
20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice
20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice
20190619 AWS Black Belt Online Seminar Dive Deep into AWS ChaliceAmazon Web Services Japan
 
Windows 開発者のための Dev&Ops on AWS
Windows 開発者のための Dev&Ops on AWSWindows 開発者のための Dev&Ops on AWS
Windows 開発者のための Dev&Ops on AWSAmazon Web Services Japan
 

Similaire à 画像処理をAWS LambdaのPythonで! (20)

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

Plus de Tomotsune Murata

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

Plus de Tomotsune Murata (11)

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