【AWS】LambdaをS3トリガーで起動しサムネイル画像を作成するチュートリアルをやってみた
以前、AWS Lambda関数をS3トリガーで起動する方法を確認しました。
https://predora005.hatenablog.com/entry/2021/05/23/190000predora005.hatenablog.com
今回もAWS公式のチュートリアルに沿って、S3トリガーでのLambda関数の使い方を紹介します。チュートリアルではAWS CLIを用いていますが、ここではマネージメントコンソールを用いる方法を紹介します。
- [1] S3バケットを作成
- [2] IAMポリシーとロールの作成
- [3] Lambda関数の作成
- [4] Lambda関数のテスト
- [5] S3トリガーでLambda関数起動
- [6] リソースの削除
- 終わりに
- 出典
[1] S3バケットを作成
バケットを2つ作成します。1つ目は任意の名前のバケット、2つ目は「{1つ目のバケット名}-resized」にします。
1つ目のバケットに「HappyFace.jpg」をアップロードします。
[2] IAMポリシーとロールの作成
[2-1] IAMポリシーの作成
以下の権限を持つIAMポリシーを作成します。
JSON欄を以下の内容にします。{バケット名}は自身が作成したバケットの名称に置き換えます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:CreateLogGroup", "logs:CreateLogStream" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::{バケット名}/*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::{バケット名}-resized/*" } ] }
名前はチュートリアル通り「AWSLambdaS3Policy」としていますが、変更しても問題ありません。
[2-2] IAMロールの作成
続いて、IAMロールを作成します。
先程作成したポリシーをアタッチします。テキストボックスにポリシーの名称を入力すると表示されます。チェックを付けて次に進めます。
ロール名はチュートリアル通り「lambda-s3-role」としていますが、変更しても問題ありません。
[3] Lambda関数の作成
[3-1] 関数の作成
ランタイムは「Python3.8」としていますが、3.7でも構いません。後述のPillowインストール問題があるため、各々の都合や環境に合わせて変更しましょう。
アクセス権限欄から先程作成したIAMロールを選択します。
ソースはチュートリアルに記載のコードを貼り付けます。
チュートリアル: Amazon S3 トリガーを使用してサムネイル画像を作成する - AWS Lambda
[3-2] レイヤーの追加
Pillowを使用するためにレイヤーを追加します。PillowはLambda関数の環境にはインストールされていないため、自前でインストールが必要です。詳細は下記記事で紹介しています。
https://predora005.hatenablog.com/entry/2021/05/26/190000predora005.hatenablog.com
[4] Lambda関数のテスト
テストイベントを作成します。内容はチュートリアル通りです。{バケット名}を作成したS3バケット名、{リージョン名}をバケットを作成したリージョンに置き換えます。
{ "Records":[ { "eventVersion":"2.0", "eventSource":"aws:s3", "awsRegion":"{リージョン名}", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"AIDAJDPLRKLG7UEXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1" }, "responseElements":{ "x-amz-request-id":"C3D13FE58DE4C810", "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"{バケット名}", "ownerIdentity":{ "principalId":"A3NL1KOZZKExample" }, "arn":"arn:aws:s3:::{バケット名}" }, "object":{ "key":"HappyFace.jpg", "size":1024, "eTag":"d41d8cd98f00b204e9800998ecf8427e", "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko" } } } ] }
変更を保存して、テストを実行します。
実行後「〜-rezied」のバケットを確認すると、1つ目のバケットと同名のファイルが作成されています。
一見ファイルがコピーされただけのように見えますが、ファイルの詳細を確認すると縦横が1/2のサイズになっています。
[5] S3トリガーでLambda関数起動
[5-1] S3にLambda関数のアクセス権限追加
S3からLambda関数にアクセスする権限を追加します。Lambda関数の[設定][アクセス権限]から追加します。
設定は以下の通りです。ソースアカウントにはアカウントID、ソースARNはS3のリソース名(arn:aws:s3:::{バケット名}を入力します。
アクションは「Lambda:InvokeFunction」を選択します。ステートメントIDは任意の名称で問題ありません。
[5-2] S3バケットからLambdaへの通知設定
S3バケットにファイルが登録された際、Lambda関数に通知する設定を追加します。S3の[プロパティ]から追加します。
イベント名は任意の名称で問題ありません。
イベントタイプは「すべてのオブジェクト作成イベント」を選択します。
送信先は先程作成したLambda関数を設定します。
[5-3] S3バケットに画像ファイルをアップロード
準備が整ったので、S3バケットに画像ファイルをアップロードします。
「〜-rezied」のバケットを確認すると、リサイズされた画像ファイルが作成されています。
[6] リソースの削除
以下のリソースを削除します。
- Lambda関数
- Lambdaレイヤー
- CloudWatchのロググループ
- IAMロールとIAMポリシー
- S3バケット
終わりに
Pillowのインストールに躓きましたが、それ以外はチュートリアルに沿って順調に進めることができました。
リソースの数が多いため、CloudFormationやSAMで作成するのがよいかもしれません。
機械学習では大量の画像を扱うことがありますが、画像をリサイズして統一することが多いです。S3に画像をアップロードしたとき、機械学習用にリサイズするようにしたら便利だなと思いました。
出典
- アイキャッチはGerd AltmannによるPixabayからの画像
- PublicDomainPicturesによるPixabayからの画像をサムネイル作成に使用
- KM NEHAによるPixabayからの画像をサムネイル作成に使用