どこにでもいる30代SEの学習ブログ

主にプログラミング関連の学習内容。読んだ本の感想や株式投資についても書いてます。

【AWS】LambdaをS3トリガーで起動しサムネイル画像を作成するチュートリアルをやってみた

以前、AWS Lambda関数をS3トリガーで起動する方法を確認しました。

https://predora005.hatenablog.com/entry/2021/05/23/190000predora005.hatenablog.com

今回もAWS公式のチュートリアルに沿って、S3トリガーでのLambda関数の使い方を紹介します。チュートリアルではAWS CLIを用いていますが、ここではマネージメントコンソールを用いる方法を紹介します。

docs.aws.amazon.com

[1] S3バケットを作成

バケットを2つ作成します。1つ目は任意の名前のバケット、2つ目は「{1つ目のバケット名}-resized」にします。

f:id:predora005:20210418130847p:plain

f:id:predora005:20210418130851p:plain

1つ目のバケットに「HappyFace.jpg」をアップロードします。

f:id:predora005:20210418130857p:plain

[2] IAMポリシーとロールの作成

[2-1] IAMポリシーの作成

以下の権限を持つIAMポリシーを作成します。

  • 1つ目のS3バケットからオブジェクト取得
  • 2つ目(resized)のS3バケットにオブジェクト格納
  • CloudWatchへのログ書込

f:id:predora005:20210418131357p:plain

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」としていますが、変更しても問題ありません。

f:id:predora005:20210418131730p:plain

[2-2] IAMロールの作成

続いて、IAMロールを作成します。

f:id:predora005:20210418132326p:plain

先程作成したポリシーをアタッチします。テキストボックスにポリシーの名称を入力すると表示されます。チェックを付けて次に進めます。

f:id:predora005:20210418132330p:plain

ロール名はチュートリアル通り「lambda-s3-role」としていますが、変更しても問題ありません。

f:id:predora005:20210418132334p:plain

[3] Lambda関数の作成

[3-1] 関数の作成

ランタイムは「Python3.8」としていますが、3.7でも構いません。後述のPillowインストール問題があるため、各々の都合や環境に合わせて変更しましょう。

f:id:predora005:20210418134257p:plain

アクセス権限欄から先程作成したIAMロールを選択します。

f:id:predora005:20210418134302p:plain

ソースはチュートリアルに記載のコードを貼り付けます。

f:id:predora005:20210418134306p:plain

チュートリアル: 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"
        }
      }
    }
  ]
}

変更を保存して、テストを実行します。

f:id:predora005:20210418145639p:plain

実行後「〜-rezied」のバケットを確認すると、1つ目のバケットと同名のファイルが作成されています。

f:id:predora005:20210418145935p:plain

一見ファイルがコピーされただけのように見えますが、ファイルの詳細を確認すると縦横が1/2のサイズになっています。

[5] S3トリガーでLambda関数起動

[5-1] S3にLambda関数のアクセス権限追加

S3からLambda関数にアクセスする権限を追加します。Lambda関数の[設定][アクセス権限]から追加します。

f:id:predora005:20210418151931p:plain

設定は以下の通りです。ソースアカウントにはアカウントID、ソースARNはS3のリソース名(arn:aws:s3:::{バケット名}を入力します。

f:id:predora005:20210418151936p:plain

アクションは「Lambda:InvokeFunction」を選択します。ステートメントIDは任意の名称で問題ありません。

f:id:predora005:20210418151942p:plain

[5-2] S3バケットからLambdaへの通知設定

S3バケットにファイルが登録された際、Lambda関数に通知する設定を追加します。S3の[プロパティ]から追加します。

f:id:predora005:20210418153001p:plain

イベント名は任意の名称で問題ありません。

f:id:predora005:20210418153006p:plain

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

f:id:predora005:20210418153010p:plain

送信先は先程作成したLambda関数を設定します。

f:id:predora005:20210418153015p:plain

[5-3] S3バケットに画像ファイルをアップロード

準備が整ったので、S3バケットに画像ファイルをアップロードします。

f:id:predora005:20210418154027p:plain

「〜-rezied」のバケットを確認すると、リサイズされた画像ファイルが作成されています。

f:id:predora005:20210418154033p:plain

[6] リソースの削除

以下のリソースを削除します。

  • Lambda関数
  • Lambdaレイヤー
  • CloudWatchのロググループ
  • IAMロールとIAMポリシー
  • S3バケット

終わりに

Pillowのインストールに躓きましたが、それ以外はチュートリアルに沿って順調に進めることができました。

リソースの数が多いため、CloudFormationやSAMで作成するのがよいかもしれません。

機械学習では大量の画像を扱うことがありますが、画像をリサイズして統一することが多いです。S3に画像をアップロードしたとき、機械学習用にリサイズするようにしたら便利だなと思いました。

出典