AWS lambda で S3 の画像をリサイズする(チュートリアル)
はじめに
AWS lambda で S3 の画像を圧縮する チュートリアル を試したので、それに関するメモ。
TL;DR
- チュートリアル 通りにやれば OK
- 事前に aws-cli のセットアップをしておく必要あり
- インストール:
pip install awscli
- 設定:
aws configure
- インストール:
- 調子に乗ってランタイムを Node.js 8.10 から Node.js 10.x に変えると動かないので注意
目次
環境・条件
1 | $ sw_vers |
詳細
GitHub: 17number/aws-lambda-resize-s3-image-tutorial
事前準備
aws-cli のセットアップ
インストール
pip install awscli
でインストール。
1 | $ pip install awscli |
コマンド補完の有効化
[Tab]
キーによるコマンド補完を有効にするために、以下コマンドを実行。
1 | $ complete -C aws_completer aws |
コンフィグ
インストール後、aws configure
で aws
コマンドを使うための準備を行う。アクセスキーなどは IAM で発行しておく。
1 | $ aws configure |
設定した内容は ~/.aws/config
と ~/.aws/credentials
に書き出される。環境変数やその他コンフィグについては 公式: Other Configurable Variables を参照。
チュートリアル
チュートリアル の内容通りに進めれば OK。
プロジェクト初期化
ディレクトリを作成。+α で作業ログを Git で残していくために、Git の初期化と空コミット。
git init
1 | $ mkdir lambda-s3 && cd lambda-s3 |
.gitignore
gibo で .gitignore
を作成。
1 | $ gibo dump node macos >> .gitignore |
npm init
npm の初期化
1 | $ npm init |
ロールの作成
IAM Management Console - Roles で以下のロールを作成。
- [信頼されたエンティティ] – [AWS Lambda]。
- [Permissions (アクセス許可)] – [AWSLambdaExecute]。
- ロール名 –
lambda-s3-role
Buckets の作成
S3 Management Console で Bucket を 2つ作成。
チュートリアルでは、mybucket
と mybucketresized
になっているが、正直文字区切りが分かりづらいので source-bucket
と source-bucket-r
という -r
で区別するようにした。
Bucket 作成後、source-bucket
に適当な画像をアップロード。
index.js の作成
lambda function の元となる関数が書かれたファイル index.js
をローカルで作成。
1 | $ code index.js |
チュートリアル のコードを以下の通りに変更した。
- リサイズ後画像を格納する Bucket 名:
xxxxresized
→xxxx-r
- リサイズ後画像名:
xxxx.jpg
→r-xxxx.jpg
必要なパッケージのインストール
1 | $ npm install async gm aws-sdk |
lambda function の作成
function.zip
という名前で index.js
と node_modules
を圧縮。
1 | $ zip -r function.zip index.js node_modules |
aws lambda create-funciton
で、lambda function を作成。
--role arn:aws:iam::...
は ロール管理画面 からlambda-s3-role
に移動して表示されたものを使用--timeout 10
と--memory-size 1024
は必要に応じて調整--runtime nodejs10.x
だと、うまく動作しない(しなかった)ので注意
1 | $ aws lambda create-function --function-name CreateThumbnail \ |
補足: lambda function の更新
もし作成後の lambda function を更新したい場合には、aws lambda update-function-code
や aws lambda update-function-configuration
を使う。
タイムアウトなどのコンフィグ更新
1 | $ aws lambda update-function-configuration --function-name CreateThumbnail \ |
ソースコードの更新
1 | $ aws lambda update-function-code --function-name CreateThumbnail \ |
lambda function のテスト
inputFile.txt
を作成し、***
の部分を修正。
1 | { |
aws lambda invoke
で lambda function を実行。
1 | $ aws lambda invoke --function-name CreateThumbnail \ |
lambda function 実行後に、リサイズ後画像が Bucket に作成されていれば成功。
関数の呼び出しポリシー 設定
S3 から lambda function を呼び出せるように、権限を設定。
ますは現状のポリシーを確認、未設定なのでエラーとなる。
1 | $ aws lambda get-policy --function-name CreateThumbnail |
aws lambda add-permission
コマンドで、lambda function の実行条件を設定。
--principal s3.amazonaws.com
: S3 からの呼び出しを許可--statement-id
: お好みで設定(resize-upload-image
など)--source-arn
: オリジナル画像の保存 Bucket 名--source-account
: IAM で Bucket 作成者の ID を確認して設定(arn:aws:iam::123456789012:user/hoge
の123456789012
部分)
Bucket 名はグローバルに一意であり、A さんがオーナーの bucket-alpha
を削除した後に、B
さんが同名の bucket-alpha
を作成することが可能。
--source-arn arn:aws:s3:::my-source-bucket
, --source-account 123456789012
と、Bucket 名と所有アカウントを指定することで、特定アカウントからのアップロードのみをトリガに設定できる。
1 | $ aws lambda add-permission --function-name CreateThumbnail \ |
aws lambda get-policy
でポリシーを再確認。
1 | $ aws lambda get-policy --function-name CreateThumbnail |
S3 → lambda の連携を設定
S3 コンソール でイベントを有効化。
設定後、Bucket に画像をアップロードして、別の Bucket にリサイズ後の画像が作成されれば完了。
まとめ
- チュートリアル 通りにやれば OK
- 事前に aws-cli のセットアップをしておく必要あり
- インストール:
pip install awscli
- 設定:
aws configure
- インストール:
- 調子に乗ってランタイムを Node.js 8.10 から Node.js 10.x に変えると動かないので注意
その他・メモ
以下、チュートリアルとは直接関係ないけど、「lambda 画像 圧縮」とかで調べた参考記事。別途、調べたり試したりする予定。
- AWS・LambdaにSharpモジュールで画像圧縮を高機能に - Qiita
- ImageMagick ではなく、Sharp を使う例
- AWS Lambda@Edge で画像をリアルタイムにリサイズ&WebP形式へ変換する - クックパッド開発者ブログ
- Lambda@Edge を使う方法
- Lambda@Edgeを利用して画像リサイズ機能を実装した
- Lambda@Edge を使う方法 2
- imgix導入で画像最適化とサイトスピードを改善した話 - 一休.com Developers Blog
- imgix というサービスを使う方法(そもそも AWS Lambda を使わないやり方)
- ysugimoto/aws-lambda-image: Automatic image resize/reduce on AWS Lambda
- AWS Lambda での圧縮でよく使うであろう処理や設定をひとまとめにしたもの。
参考文献
- チュートリアル: Amazon S3 で AWS Lambda を使用する - AWS Lambda
- AWS コマンドラインインターフェイス(CLI: AWSサービスを管理する統合ツール)| AWS
- Node.js 内の AWS SDK for JavaScript | AWS
- AWS CLI のインストール - AWS Command Line Interface
- AWS CLI の設定 - AWS Command Line Interface
- aws/aws-cli: Universal Command Line Interface for Amazon Web Services
- AWS Lambdaを使ってS3にアップロードしたイメージを最適化する | I am mitsuruog
関連記事
- docker-lambda + sharp で画像変換する AWS Lambda Function
- docker-lambda を使って AWS Lambda Function を開発する方法
- AWS S3 から Cloud Storage for Firebase にファイルをコピー
- AWS S3 バケットをリネーム(できないので別バケットにコピー)
- Python boto3 で AWS S3 を操作する
- Node.js の画像変換モジュール sharp の使い方(リサイズ)
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア