既存のS3バケットを軽量化の対象に追加するには

LightFile Lambda関数は、S3バケットにオブジェクトが作成(および更新)されたときに発行されるイベントをトリガーとして起動させます。

イベントの設定を追加するだけで、いくつでも別のS3バケットを画像軽量化処理の対象に追加することができます。

ただしその前にLambda関数を実行するIAMロールに対象のS3バケットに対して次の読み書きを許可するアクセス権限の追加が必要です。その手順も解説します。

  • s3:GetObject
  • s3:GetObjectAcl
  • s3:GetObjectTagging
  • s3:PutObject
  • s3:PutObjectAcl
  • s3:PutObjectTagging

S3バケットのデフォルトセキュリティ

2023年4月より、Amazon S3バケットのデフォルトセキュリティが強化されました。

  • ACL無効 - オブジェクト所有者はバケット所有者に強制
  • パブリックアクセスはすべてブロック

LightFile Lambda関数は、基本的にWeb用に公開された画像の軽量化を想定しており、以下の解説は2023年4月より前のバケットセキュリティに準じています。

ただし、機密性の高いバケットにおいてもLightFile Lambda関数は利用可能です。詳しくは、LightFile Lambda関数 » 機密性の高いバケットでの利用も参照ください。

また、このページの末尾ではセキュリティ緩和の手順を解説しています。画像が公開可能な性質

IAMロールへのアクセス権限の追加

LightFile Lambda関数 » かんたんインストールでインストールを行った前提で解説します。

カスタムインストールを行った場合はLightFile Lambda関数 » カスタムインストールに記載したアクセス権限を、同様に対象のS3バケットについて追加してください。

かんたんインストールでMyResourcePrefixmy-companyとした場合、my-company-lightfile-roleというIAMロールが作成されています。

IAMの管理画面のロール一覧を開き、そのロールの設定画面を開きます。

インラインポリシーmy-company-lightfile-s3-policyポリシーの編集ボタンを押します。

S3リソースを開き、ARNの追加を選択します。

Bucket nameに対象のS3バケット名を入力し、Object nameすべてにチェックを入れます。追加ボタンを押してダイアログを閉じます。

Bucket nameすべてにすると、このロールですべてのS3バケットのすべてのオブジェクトに書き込みができるため、都度の権限設定が不要になります。セキュリティポリシーに応じて検討ください。

ポリシーの確認ボタンを押し、変更の保存ボタンを押すと設定完了です。

S3イベントのプレフィクスとサフィックスについて

S3オブジェクトの作成イベントには、プレフィックスサフィックスを指定できます。わかりやすく言うとディレクトリパスの絞り込みと、拡張子の絞り込みです。

もしそのS3バケットには画像ファイルにしか格納されず、パスに限らずすべてのファイルを軽量化の対象とするなら、両方とも空欄で問題ありません。

また、LightFileは拡張子の判定を行うため、画像ファイル以外のファイルに対して起動されても影響を与えることはありません。

しかしLambda関数は起動時間に応じて課金されるため、できる限り無駄なファイルに起動しないように絞り込みを行うことをお勧めします。

絞り込み条件が複数ある場合はその数だけイベント設定が必要

S3イベントの条件となるプレフィックスとサフィックスは、カンマ区切りで複数指定したり、正規表現を指定することができません。

そのため複数の条件を設定する場合は、その数だけイベント設定を行う必要があります。

Lambda関数の起動イベントの追加設定

イベントの追加設定はS3の管理画面と、Lambdaの管理画面のどちらでも行うことができます。

どちらの方法でも動作の違いはありません。操作しやすい方法をお選びください。

S3の管理画面から行う場合

対象のS3バケットのプロパティタブのEventsウィジェットを開き、通知の追加をクリックします。

名前は管理しやすいように任意で指定します。

イベントすべてのオブジェクト作成イベントを選択します。

送信先Lambda関数として、LightFile Lambda関数を選択します。

保存ボタンを押すとイベントが設定されます。

Lambdaの管理画面から行う場合

Lambda関数のDesignerウィジェットでS3トリガーをクリックします。

トリガーの設定で対象のバケットを選択し、イベントタイプすべてのオブジェクト作成イベントを選択します。

特定のディレクトリパスのみ対象にする場合はプレフィックスに指定します。対象がS3バケット全体の場合は空欄のままとします。

サフィックスには.pngなど、ピリオドから始まる画像の拡張子を指定します。

追加ボタンをクリックするとイベントが設定されます。

軽量化が行われない場合のセキュリティの緩和

上記の手順でバケット内の画像ファイルが自動的に軽量化されるようになりますが、そうでない場合はバケットのセキュリティを緩和する必要があるかもしれません。

以下の手順でバケットのセキュリティ設定を確認し、必要に応じて緩和してください。

ブロックパブリックアクセスを解除

バケットのアクセス許可タブを開き、ブロックパブリックアクセス(バケット設定)編集ボタンクリックします。

続いてパブリックアクセスのブロックをすべてオフにしてください。

なお、パブリックアクセスが不要の場合は環境変数UPLOAD_ACLで設定を変更できます。詳しくは、LightFile Lambda関数 » 軽量化後のACLを設定するにはを参照ください。

オブジェクト所有者をオブジェクトライターに

同じくアクセス許可タブのオブジェクト所有者編集ボタンをクリックします。

続いてACL有効にチェックを付け、警告にもチェックを付けてください。オブジェクト所有者はオブジェクトライターに指定します。対象がS3バケット全体の場合は空欄のままとします。

以上の操作で、バケットのセキュリティはLightFile Lambda関数のデフォルト設定が前提とする状態まで緩和されます。