画像のアップロードと処理
S3への画像アップロードと自動軽量化
LightFile Lambdaは、S3バケットに画像をアップロードすると自動的に軽量化処理を開始します。
基本的な使い方
AWSコンソールでアップロード
- S3コンソールを開く
- バケット(例:
my-company-lightfile-test)を選択 - 「アップロード」ボタンをクリック
- 画像ファイルを選択してアップロード
AWS CLIでアップロード
# 単一ファイルのアップロード
aws s3 cp image.jpg s3://my-company-lightfile-test/
# 複数ファイルのアップロード
aws s3 cp ./images/ s3://my-company-lightfile-test/ --recursive
# 特定の拡張子のみアップロード
aws s3 sync ./images/ s3://my-company-lightfile-test/ \
--exclude "*" \
--include "*.jpg" \
--include "*.png"処理される画像
以下の条件をすべて満たす画像が処理されます:
- ファイル形式 - JPEG(.jpg、.jpeg)またはPNG(.png)
- ファイルサイズ - MIN_SIZE〜MAX_SIZE の範囲内(デフォルト: 5KB〜3MB)
- 未処理 -
lightfile-status: doneメタデータがない
スキップされる画像
以下の場合は処理されません:
- すでに処理済み(
lightfile-status: doneメタデータがある) - ファイルサイズが小さすぎる(< MIN_SIZE)
- ファイルサイズが大きすぎる(> MAX_SIZE)
- サポートされていない形式(JPEG/PNG以外)
既存バケットへのLambda関数の追加
CloudFormationでインストールしたLambda関数を、既存のS3バケットに関連付けることができます。
S3バケットのACL設定を確認
S3バケットのセキュリティはACL有効である必要があります。無効になっている場合は設定を変更ください。

IAMロールへの許可ポリシーの追加
Lambda関数を実行するIAMロールの許可ポリシーに、S3バケット内のオブジェクトへの権限を追加します。
AWSコンソールでIAMロールの一覧を開き、Lambda関数を実行するIAMロール(CloudFormationでインストールした場合は末尾-lightfile-roleのIAMロール)を開きます。
ここではインラインポリシーによる方法を解説します。
許可タブから許可を追加 - インラインポリシーを追加を選択します。

ポリシーエディタに次のJSONを記入し、次へボタンを押します。
バケット名のところは実際のバケット名に置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:GetObjectTagging",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::バケット名/*"
}
]
}ビジュアルエディタで操作する場合
ビジュアルエディタで操作する場合は、対象S3バケットの任意のオブジェクトに対し、次のアクションを許可してください。
s3:PutObjects3:GetObjectAcls3:GetObjects3:GetObjectTaggings3:PutObjectAcl
確認と作成
最後に任意のポリシー名を入力し、ポリシーの作成ボタンを押してください。

これでIAMロールの権限設定は完了です。
S3へのイベント通知の追加
S3バケットとLambda関数をイベント通知により関連づけます。
この操作にはS3側からの操作とLambda関数側からの操作があります。ここではS3側からの操作を解説します。
イベント通知の作成
対象のS3バケットを開き、プロパティタブ - イベント通知 - イベント通知を作成を押します。

任意のイベント名(例 bucket-lightfile)、対象ファイルのプレフィックス(例 images/)、サフィックスを入力します。
イベントタイプはすべてのオブジェクト作成イベントを選択してください。

S3バケットが画像専用の場合
プレフィックスとサフィックスは空欄でも問題ありません。
S3バケットが画像専用では無い場合
例えばimages/以下は画像のみという場合は、プレフィックスにimages/のみ指定します。
さまざまなタイプのファイルが混在するようであれば、サフィックスを.jpg / .jpeg / .png とした、3つのイベント通知をそれぞれ作成します。
イベントの送信先
イベントの送信先はLambda関数とし、Lambda関数にはCloudFormationで作成されたLightFile LambdaのLambda関数を指定します。

変更の保存を押すとS3とLambda関数の関連付けが完了します。
既存画像の一括処理
既存のバケットから画像をコピーして一括処理できます:
# 既存バケットからコピー
aws s3 sync s3://existing-bucket/ s3://my-company-lightfile-test/ \
--exclude "*" \
--include "*.jpg" \
--include "*.png"大量の画像を一括処理する場合:
- 処理に時間がかかります
- CloudWatchでエラーを監視してください
- Lambda同時実行制限に注意してください
画像の再処理
画像を再処理したい場合は、メタデータを削除してから再アップロードします:
# メタデータを削除
aws s3api copy-object \
--bucket my-company-lightfile-test \
--key photo.jpg \
--copy-source my-company-lightfile-test/photo.jpg \
--metadata-directive REPLACE \
--metadata "{}"または、バックアップから復元:
# バックアップからコピー
aws s3 cp \
s3://my-company-lightfile-backup/my-company-lightfile-test/photo.jpg \
s3://my-company-lightfile-test/photo.jpg