はじめに
今回は S3 へのデータアップロードをトリガーに、アップロードされたデータを推論し、結果を S3 に保存する関数を作成しました。
その内容を記載します。
前提
- SageMakerでデプロイできるモデルがある。
※今回作成した Lambda 関数を使う際には、事前にモデルをデプロイしておく必要があります。
※私は画像検出のモデルを使用します。
関数の作成/設定
-
選択したら、更に下にスクロールし各種設定を行います。
今回私が作成したプログラムは以下の通りです。
import json
import boto3
def lambda_handler(event, context):
s3 = boto3.client("s3")
sagemaker = boto3.client("sagemaker-runtime", region_name="ap-northeast-1")
#S3にアップロードされた画像データ情報を取得
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
input_data = s3.get_object(Bucket=bucket, Key=key)
#画像データをバイナリデータに変換
body = input_data['Body'].read()
b = bytearray(body)
#推論
endpoint_response = sagemaker.invoke_endpoint(
#エンドポイント名を設定
EndpointName='auto-endpoint',
Body=b,
ContentType='image/jpeg'
)
results = endpoint_response['Body'].read()
print(endpoint_response)
print(results)
split_s3_path = key.split('/')
for i in split_s3_path:
if 'jpg' in i:
full_file_name = i
file_name = i.split('.')[0]
#output_keyに推論結果の保存パスを設定
output_key = 'dog-face/lambda/推論結果/'+file_name+'.json'
#S3に推論結果をjsonファイルで保存
s3.put_object(Body=results,Bucket=bucket,Key=output_key)
#copy_keyに推論後画像を格納するパスを設定
copy_key = 'dog-face/lambda/推論済み画像/'+full_file_name
#S3のアップロードされたデータを別フォルダにコピーして元データは削除
s3.copy_object(Bucket=bucket,Key=copy_key,CopySource={'Bucket': bucket, 'Key': key})
s3.delete_object(Bucket=bucket,Key=key)
プログラムは下記の流れになっています。
1. S3にアップロードされたデータを推論。
2. 推論結果を保存。
3. アップロードされたデータを、別フォルダにコピーし、アップロードされたデータを削除。
実行ロール の設定
さきほど何もいじらずに作成した、実行ロールに、S3とSageMakerのフルアクセスをアタッチします。
※今回はテストのため、フルアクセスをアタッチしますが、本番で利用する際は適切なIAMロールを作成してください。
実際にS3にデータをアップロードし、Lambda 関数を起動してみる。
この手順に入る前に使用するモデルをデプロイしてください。
アップロードしたら、作成したLambda関数を開いて、モニタリングタブを選択し、CloudWatch のログ表示を選択します。
するとこのような形で、Lambda 関数の起動ごとにログが記録されています。
ログを開くと Lambda 関数が正常に動作しているか確認できます。
最後に
今回は、S3へのデータアップロードをトリガーに、推論を行いました。
トリガーを変更することで、他にもいろいろな処理ができますので、ぜひ試してみてください。