既存の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バケットについて追加してください。
かんたんインストールでMyResourcePrefix
をmy-company
とした場合、my-company-lightfile-role
というIAMロールが作成されています。
IAMの管理画面のロール一覧を開き、そのロールの設定画面を開きます。
![](/lightfile/lambda/images/iam-roles.png)
インラインポリシーmy-company-lightfile-s3-policy
のポリシーの編集
ボタンを押します。
![](/lightfile/lambda/images/iam-inline-policy.png)
S3
のリソース
を開き、ARNの追加
を選択します。
![](/lightfile/lambda/images/iam-policy-editor.png)
Bucket name
に対象のS3バケット名を入力し、Object name
はすべて
にチェックを入れます。追加
ボタンを押してダイアログを閉じます。
![](/lightfile/lambda/images/iam-policy-editor-s3.png)
Bucket name
もすべて
にすると、このロールですべてのS3バケットのすべてのオブジェクトに書き込みができるため、都度の権限設定が不要になります。セキュリティポリシーに応じて検討ください。
ポリシーの確認
ボタンを押し、変更の保存
ボタンを押すと設定完了です。
S3イベントのプレフィクスとサフィックスについて
S3オブジェクトの作成イベントには、プレフィックス
とサフィックス
を指定できます。わかりやすく言うとディレクトリパスの絞り込みと、拡張子の絞り込みです。
もしそのS3バケットには画像ファイルにしか格納されず、パスに限らずすべてのファイルを軽量化の対象とするなら、両方とも空欄で問題ありません。
また、LightFileは拡張子の判定を行うため、画像ファイル以外のファイルに対して起動されても影響を与えることはありません。
しかしLambda関数は起動時間に応じて課金されるため、できる限り無駄なファイルに起動しないように絞り込みを行うことをお勧めします。
絞り込み条件が複数ある場合はその数だけイベント設定が必要
S3イベントの条件となるプレフィックスとサフィックスは、カンマ区切りで複数指定したり、正規表現を指定することができません。
そのため複数の条件を設定する場合は、その数だけイベント設定を行う必要があります。
Lambda関数の起動イベントの追加設定
イベントの追加設定はS3の管理画面と、Lambdaの管理画面のどちらでも行うことができます。
どちらの方法でも動作の違いはありません。操作しやすい方法をお選びください。
S3の管理画面から行う場合
対象のS3バケットのプロパティ
タブのEvents
ウィジェットを開き、通知の追加
をクリックします。
![](/lightfile/lambda/images/s3-events.png)
名前
は管理しやすいように任意で指定します。
イベント
はすべてのオブジェクト作成イベント
を選択します。
送信先
はLambda関数
として、LightFile Lambda関数を選択します。
保存
ボタンを押すとイベントが設定されます。
![](/lightfile/lambda/images/s3-new-event.png)
Lambdaの管理画面から行う場合
Lambda関数のDesigner
ウィジェットでS3
トリガーをクリックします。
![](/lightfile/lambda/images/lambda-s3-trigger.png)
トリガーの設定で対象のバケット
を選択し、イベントタイプ
はすべてのオブジェクト作成イベント
を選択します。
特定のディレクトリパスのみ対象にする場合はプレフィックス
に指定します。対象がS3バケット全体の場合は空欄のままとします。
サフィックス
には.png
など、ピリオドから始まる画像の拡張子を指定します。
追加
ボタンをクリックするとイベントが設定されます。
![](/lightfile/lambda/images/lambda-s3-options.png)
軽量化が行われない場合のセキュリティの緩和
上記の手順でバケット内の画像ファイルが自動的に軽量化されるようになりますが、そうでない場合はバケットのセキュリティを緩和する必要があるかもしれません。
以下の手順でバケットのセキュリティ設定を確認し、必要に応じて緩和してください。
ブロックパブリックアクセスを解除
バケットのアクセス許可
タブを開き、ブロックパブリックアクセス(バケット設定)
の編集
ボタンクリックします。
![](/lightfile/lambda/images/block-public-access.png)
続いてパブリックアクセスのブロックをすべてオフにしてください。
![](/lightfile/lambda/images/unblock-public-access.png)
なお、パブリックアクセスが不要の場合は環境変数UPLOAD_ACL
で設定を変更できます。詳しくは、LightFile Lambda関数 » 軽量化後のACLを設定するにはを参照ください。
オブジェクト所有者をオブジェクトライターに
同じくアクセス許可
タブのオブジェクト所有者
の編集
ボタンをクリックします。
![](/lightfile/lambda/images/object-owner.png)
続いてACL有効
にチェックを付け、警告にもチェックを付けてください。オブジェクト所有者はオブジェクトライター
に指定します。対象がS3バケット全体の場合は空欄のままとします。
![](/lightfile/lambda/images/object-writer-ownership.png)
以上の操作で、バケットのセキュリティはLightFile Lambda関数のデフォルト設定が前提とする状態まで緩和されます。