docker-lambda + sharp で画像変換する AWS Lambda Function
はじめに
docker-lambda
+ sharp
で画像変換する AWS Lambda Function 作ったのでそのメモ。
TL;DR
docker-lambda
+sharp
で画像変換する AWS Lambda Function 作った- せっかくなので
webp
にも変換してみた - リポジトリ: 17number/aws-lambda-resize-s3-image-sharp
目次
環境・条件
1 | $ sw_vers |
詳細
リポジトリ: 17number/aws-lambda-resize-s3-image-sharp
作業メモ
npm init
で初期化。
1 | $ npm init |
npm-add-dependencies
で sharp
を追加。
1 | $ npm-add-dependencies sharp |
Dockerfile
を作成。
1 | FROM lambci/lambda:build-nodejs10.x |
index.js
を作成。
1 | // dependencies |
ビルド。
1 | $ docker build -t aws-lambda-nodejs10.x-image-optimizer . |
デプロイファイルを作成。
1 | $ docker run --rm -v "$PWD":/var/task aws-lambda-nodejs10.x-image-optimizer:latest |
aws lambda create-function
で Lambda function を作成。
1 | $ aws lambda create-function \ |
aws lambda add-permission
で権限を設定。
1 | $ aws lambda add-permission --function-name resizeImage \ |
S3 コンソール で、Lambda Function に通知するためのイベントを設定。
解説・変更点など
async/await
なるべくネストを減らすために async/await
を使うようにした。
aws-sdk
の S3
は(たぶん他クラスも)、promise()
メソッドがあるので、
1 | s3.getObject(params, (err, data) => { /* some process */ }); |
↑のようなコードを、↓のように変更した。
1 | let image = await s3.getObject(params).promise(); |
webp 対応
sharp
を使うと webp
にも変換ができる。
webp
とは、以下のような画像形式。
- Google 主導で開発した新しい画像形式
jpg
,png
よりも軽くて綺麗- まだすべてのブラウザでは対応していない
sharp
を使った変換方法はこれだけ。
1 | const sharp = require("sharp"); |
webp
について詳しく知りたい方は 【画像軽量化】Webpにそろそろ対応したほうが良さそうなので現時点で最適方法の考察 - ウェブ企画ラボ などの記事をどうぞ。
ACL, Cache-Control
S3.putObject
は、パラメータで ACL
(アクセスコントロール)、CacheControl
が設定できる。
公開用の画像ファイルで、一度作ったら基本的に変わらない想定なので、それぞれ "public-read"
, "max-age=31536000"
(=1年) とした。(もっと短い方が良いかも)
1 | s3.putObject( |
なお、AWS Lambda Function を実行するロールの権限が不足していると、ACL
の部分でエラーになる(なった)ので注意。対象 Bucket の操作権限を付与すれば解決するはず。
まとめ
docker-lambda
+sharp
で画像変換する AWS Lambda Function 作った- せっかくなので
webp
にも変換してみた - リポジトリ: 17number/aws-lambda-resize-s3-image-sharp
参考文献
- AWS・LambdaにSharpモジュールで画像圧縮を高機能に - Qiita
- AWSのLambdaでasync / awaitを使う - Qiita
- 【画像軽量化】Webpにそろそろ対応したほうが良さそうなので現時点で最適方法の考察 - ウェブ企画ラボ
- WebPに関する10の誤解〜5分で学ぶWebP - Qiita
- S3にアップロードされた画像にCache-Controlを付ける方法3選 - Qiita
関連記事
- AWS lambda で S3 の画像をリサイズする(チュートリアル)
- docker-lambda を使って AWS Lambda Function を開発する方法
- Node.js の画像変換モジュール sharp の使い方(リサイズ)
- AWS S3 から Cloud Storage for Firebase にファイルをコピー
- AWS S3 バケットをリネーム(できないので別バケットにコピー)
- Python boto3 で AWS S3 を操作する
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア