この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
Amazon Personalizeから取得できる推薦情報を、AWS Lambdaを利用してCSVでS3にエクスポートする方法を紹介します。
CSV形式でファイルにデータを格納することで、既存のソリューションに組み込むことも可能になるかと思います。
Personalizeの推薦情報をCSVでS3にエクスポートしてみる
■構築の流れ
【目的】
- AWS Lambdaを利用して、Amazon Personalizeから推薦情報を取得し、CSV形式でAmazon S3に書き込む。
- ファイルには、[USER_ID]と[ITEM_ID]を書き込む
【前提条件】
今回紹介する方法の前提条件は以下の通りです。
- Amazon Personalizeキャンペーン作成済み
- エクスポート先のS3バケット作成済み
【構築の流れ】
- IAMポリシー・IAMロール作成
- AWS Lambda作成
- 動作確認
■IAMポリシー・ロール作成
まずは、AWS LambdaにアタッチするIAMロールとIAMポリシーを作成します。
構築図を確認すると、
- AWS LambdaはAmazon Personalizeに対しAPI操作を行い、
- Amazon S3に対し書き込み、
を行います。
上記の操作が行える権限を付与しましょう。
↓IAMポリシーを作成します。IAMポリシーは以下のjsonドキュメントを利用してください。※アルファベット大文字の部分を環境に合わせて修正しましょう。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"personalize:GetRecommendations"
],
"Resource": "arn:aws:personalize:REGION:ACCOUNT-ID:campaign/CAMPAIGN-NAME"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::YOUR-BUCKET-NAME/*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:REGION:ACCOUNT-ID:*"
}
]
}
↓[ポリシー名]と[説明]を入力し、[ポリシーの作成]をクリックします。
↓
↓つぎにIAMロールを作成します。[信頼されたエンティティタイプ]は[AWSのサービス]を選択し、[ユースケース]は[Lambda]を選択し、[次へ]をクリックします。
↓さきほど作成したIAMポリシーを選択し、[次へ]をクリックします。
↓[ロール名]と[説明]を入力し、[ロールを作成]をクリックしてください。
↓
↓
IAMポリシー・IAMロールの作成は以上です。
■AWS Lambda作成
今回紹介する方法の要のLambda関数を作成します。
↓サービス検索窓で[Lambda]と入力し、[Lambda]をクリックします。
↓左のナビゲーションペインから、[関数]をクリックし、[関数の作成]をクリックしてください。
↓[一から作成]を選択し、ほかの設定値は以下の通りです。入力が完了しましたら、[関数の作成]をクリックしてください。
項目 | 設定値 |
---|---|
関数名 | 任意 |
ランタイム | 3.10 |
アーキテクチャ | x86_64 |
実行ロール | 既存のロールを使用する |
既存のロール | 作成したもの |
↓[コードソース]の[lambda_function]タブに以下のコードを貼り付けてください。コード内に簡単な説明を入れてあります。キャンペーンARNとバケット名を環境に合わせて修正してください。
import boto3
import csv
from io import StringIO
def lambda_handler(event, context):
# PersonalizeとS3クライアントの初期化
personalizeRt = boto3.client('personalize-runtime')
personalize = boto3.client('personalize')
s3 = boto3.client('s3')
# ユーザー数の定義
num_user = 500
# ユーザーIDのリスト: 1からnum_userまでの整数
user_ids = [str(i) for i in range(1, num_user + 1)]
csv_file = StringIO()
csv_writer = csv.writer(csv_file)
csv_writer.writerow(["UserID", "ItemID"]) # ヘッダ行
for user_id in user_ids:
response = personalizeRt.get_recommendations(
campaignArn='arn:aws:personalize:ap-northeast-1:XXXXXXXXXXXX:campaign/XXXXXXXXXXXXXXXX',
userId=user_id,
numResults=10
)
# itemListの取得を10件に制限
for item in response['itemList'][:10]:
csv_writer.writerow([user_id, item['itemId']])
# CSVデータをS3にアップロード
s3.put_object(
Bucket='YOUR_BUCKET_NAME',
Key='output.csv',
Body=csv_file.getvalue()
)
return {
'statusCode': 200,
'body': "output.csv ファイルを作成しました。"
}
↓
↓貼り付けが完了しましたら、[Test]をクリックします。
↓[イベント名]を任意で入力し、デフォルトのまま[保存]します。
↓
↓つぎに、[設定]タブにあります[一般設定]から[[編集]をクリックし、[タイムアウト]の時間を[0分3秒]から任意の時間に設定してください。わたしは[1分0秒]に設定しました。
↓すべての設定が完了しましたら、[Deploy]をクリックします。
Lambda関数の作成は以上です。
■動作確認
それでは動作確認をしてみましょう。
↓Lambda関数の[コード]タブから、[Test]をクリックします。すこし時間がかかります。
↓Personalizeの設定でレスポンス速度を最低にしている場合、ユーザー数500×推薦情報各10件を取得し書き込むまでに40秒かかりました。
↓成功すると、以下のResponceが返ってきます。
↓S3バケットを確認してみましょう。[output.csv]というファイルが存在することが確認できます。
↓中身を確認してみると、
ユーザーIDひとつに対し、10件分のITEM_IDがCSV形式で書き込まれていますね。
今回の構築は以上です。
まとめ:AWS Lambdaを使ってAmazon Personalizeの推薦情報をCSVでS3にエクスポートする方法
Amazon Personalizeは機械学習の知識がそれほどなくても、機械学習の恩恵を受けることができる素晴らしいAWSサービスです。
推薦情報をAPI操作で取得し、Webアプリケーションで提供することもできますし、今回紹介した方法でCSV形式でファイルにデータを格納することで、既存のソリューションに組み込むことも可能になるかと思います。ぜひ試してみてください。
参考リンク:AWS公式ドキュメント
↓ほかの協栄情報メンバーも機械学習・AIに関する記事を公開しています。ぜひ参考にしてみてください。
■Amazon CodeWhispererを試してみた(dapeng)
https://cloud5.jp/amazon-codewhisperer/
■Amazon Personalizeの使い方や事例を紹介【ハンズオンあり】(齊藤弘樹)
https://cloud5.jp/saitou-amazonpersonalize-entry/
■Amazon Personalizeの使い方や事例を紹介【ハンズオンあり】 part2(齊藤弘樹)
https://cloud5.jp/saitou-amazonpersonalize-handson/
■Amazon Personalize学習用ダミーデータをPythonで作ってみた(齊藤弘樹)
https://cloud5.jp/saitou-personalize-create-dammydata/