6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【AWS Lambda】S3に保存された画像をリサイズして別S3に保存(Ruby利用)

Last updated at Posted at 2020-08-14

##目標
S3に保存された画像データをLambda関数を利用してリサイズし、別S3に保存する。
プログラミング言語はRubyを利用しています。

##前提
事前に2つのS3バケットを作成していること。

##作業の流れ

項番 タイトル
1 Lambda関数の作成とアップロード
2 Lambda環境変数の設定
3 ハンドラーと実行ロールの設定
4 イベントトリガーの定義
5 実行ロールの設定
6 動作検証

##手順
###1.Lambda関数の作成とアップロード
任意の関数名とLambda関数で利用するプログラミング言語を選択します。
今回はRuby2.5で記述します。
image.png

配備するLambda関数本体と外部ライブラリ(mini_magick)をzip化したものを作成します。
作業ディレクトリ上で以下操作を行います。

まずはGemfileの作成

Gemfile

source 'https://rubygems.org'
gem "mini_magick"

bundle install --path vendor/bundleを利用して作業ディレクトリ配下にgemをインストールします。


bundle install --path vendor/bundle

更にLambda関数本体となるhandler.rbを作成します。

handler.rb

require 'aws-sdk-s3'
require 'base64'
require 'mini_magick'

def resize_image(event:, context:)
  s3_client = Aws::S3::Client.new(
                           :region => ENV['REGION'],
                           :access_key_id => ENV['ACCESS_KEY'],
                           :secret_access_key => ENV['SECRET_ACCESS_KEY']
                          )
                          
  # イベントソースとして指定したS3から保存された画像を取り込む
  key = event['Records'][0]['s3']['object']['key']
  image_file = s3_client.get_object(:bucket => ENV['BUCKET_BEFORE'], :key => key).body.read
  image = MiniMagick::Image.read(image_file)

  # リサイズした画像をLambda環境の/tmpに一時書き込み
  resized_tmp_file = "/tmp/#{key.delete("images/")}"
  image.resize("300x300").write(resized_tmp_file)

  # アップロード実行
  s3_resource = Aws::S3::Resource.new()
  object = s3_resource.bucket(ENV['BUCKET_AFTER']).object(key).upload_file(resized_tmp_file)
end

handler.rbvenderをzip化します。

image.png

作成したzipファイルのアップロードを行います。
Lambdaコンソール上の関数コード欄アクションから.zipファイルをアップロードをクリック
tempsnip.png

handler.zipを選択し、保存

tempsnip.png

###2.Lambda環境変数の設定
Lambdaコンソール上からLambda関数内で利用する環境変数を設定します。

tempsnip.png

###3.ハンドラーと実行ロールの設定
どのファイルのどの関数を呼び出すか…という設定は、ハンドラーというパラメータで指示しているとのことなので、
今回作成したLambda関数に合わせて内容を編集します。

Lambdaコンソール上の基本設定の編集をクリック
tempsnip.png

ハンドラ欄に実行ファイル名(拡張子除く).関数名の形式で値を入力し保存します。
tempsnip.png

###4.イベントトリガーの定義
Lambdaコンソール上からトリガーを追加をクリック
tempsnip.png

今回イベントトリガーとするAWSサービスはS3
tempsnip.png

トリガーの詳細設定を行います。
今回はimagesディレクトリ内にオブジェクトが作成されたタイミングでのイベント起動とします。
tempsnip.png

トリガーの有効化をいれることでS3がこのLambda関数に処理をキックすることが可能となります(Lambda関数ポリシーの設定)。
最後に追加をクリック

tempsnip.png

###5.実行ロールの設定
更に今回はリサイズした画像を保存する際にLambdaからS3にアクセスをかける必要があるため、
S3へのアクセス権限付きの実行ロールを付与します。

Lambdaコンソール上部にあるアクセス権限をクリック後、実行ロール名をクリック

tempsnip.png

ポリシーをアタッチしますをクリック
tempsnip.png

AmazonS3FullAccessを選択後、ポリシーのアタッチ
tempsnip.png

###6.動作検証
イベントソースとして指定したS3のimagesディレクトリ内に任意の画像をアップロードします。
image.png

ちなみにアップロードした画像はこちら
image.png

リサイズ後の画像保存先として指定したS3を確認したところ、画像が保存されていたのでOKです。
image.png

中身もリサイズされていました。
image.png

LambdaのログはCloudwatch Logsから確認可能です。
image.png

##参考にさせて頂いた記事
AWS Lambda Ruby を利用して 1時間で作る画像のリサイズ API

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?