LightFile NextLightFile Next

画像のアップロードと処理

S3への画像アップロードと自動軽量化

LightFile Lambdaは、S3バケットに画像をアップロードすると自動的に軽量化処理を開始します。

基本的な使い方

AWSコンソールでアップロード

  1. S3コンソールを開く
  2. バケット(例: my-company-lightfile-test)を選択
  3. 「アップロード」ボタンをクリック
  4. 画像ファイルを選択してアップロード

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有効である必要があります。無効になっている場合は設定を変更ください。

ACL有効

IAMロールへの許可ポリシーの追加

Lambda関数を実行するIAMロールの許可ポリシーに、S3バケット内のオブジェクトへの権限を追加します。

AWSコンソールでIAMロールの一覧を開き、Lambda関数を実行するIAMロール(CloudFormationでインストールした場合は末尾-lightfile-roleのIAMロール)を開きます。

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:PutObject
  • s3:GetObjectAcl
  • s3:GetObject
  • s3:GetObjectTagging
  • s3: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