##目標
S3に保存された画像データをLambda関数を利用してリサイズし、別S3に保存する。
プログラミング言語はRubyを利用しています。
##前提
事前に2つのS3バケットを作成していること。
##作業の流れ
項番 | タイトル |
---|---|
1 | Lambda関数の作成とアップロード |
2 | Lambda環境変数の設定 |
3 | ハンドラーと実行ロールの設定 |
4 | イベントトリガーの定義 |
5 | 実行ロールの設定 |
6 | 動作検証 |
##手順
###1.Lambda関数の作成とアップロード
任意の関数名とLambda関数で利用するプログラミング言語を選択します。
今回はRuby2.5
で記述します。
配備するLambda関数本体と外部ライブラリ(mini_magick)をzip化したものを作成します。
作業ディレクトリ上で以下操作を行います。
まずはGemfile
の作成
source 'https://rubygems.org'
gem "mini_magick"
bundle install --path vendor/bundle
を利用して作業ディレクトリ配下にgemをインストールします。
bundle install --path vendor/bundle
更にLambda関数本体となる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.rb
とvender
をzip化します。
作成したzipファイルのアップロードを行います。
Lambdaコンソール上の関数コード欄アクションから.zipファイルをアップロード
をクリック
handler.zip
を選択し、保存
###2.Lambda環境変数の設定
Lambdaコンソール上からLambda関数内で利用する環境変数を設定します。
###3.ハンドラーと実行ロールの設定
どのファイルのどの関数を呼び出すか…という設定は、ハンドラーというパラメータで指示しているとのことなので、
今回作成したLambda関数に合わせて内容を編集します。
ハンドラ欄に実行ファイル名(拡張子除く).関数名
の形式で値を入力し保存します。
###4.イベントトリガーの定義
Lambdaコンソール上からトリガーを追加
をクリック
トリガーの詳細設定を行います。
今回はimagesディレクトリ内にオブジェクトが作成されたタイミングでのイベント起動とします。
トリガーの有効化
をいれることでS3がこのLambda関数に処理をキックすることが可能となります(Lambda関数ポリシーの設定)。
最後に追加
をクリック
###5.実行ロールの設定
更に今回はリサイズした画像を保存する際にLambdaからS3にアクセスをかける必要があるため、
S3へのアクセス権限付きの実行ロールを付与します。
Lambdaコンソール上部にあるアクセス権限
をクリック後、実行ロール名をクリック
AmazonS3FullAccess
を選択後、ポリシーのアタッチ
###6.動作検証
イベントソースとして指定したS3のimagesディレクトリ内に任意の画像をアップロードします。
リサイズ後の画像保存先として指定したS3を確認したところ、画像が保存されていたのでOKです。
LambdaのログはCloudwatch Logsから確認可能です。
##参考にさせて頂いた記事
AWS Lambda Ruby を利用して 1時間で作る画像のリサイズ API