AWS Lambdaを使ってAmazon Personalizeの推薦情報をCSVでS3にエクスポートする方法

Amazon Personalizeから取得できる推薦情報を、AWS Lambdaを利用してCSVでS3にエクスポートする方法を紹介します。

 

CSV形式でファイルにデータを格納することで、既存のソリューションに組み込むことも可能になるかと思います。

 

 

Personalizeの推薦情報をCSVでS3にエクスポートしてみる

■構築の流れ

saitou-personalize-s3-export流れ

目的

  • AWS Lambdaを利用して、Amazon Personalizeから推薦情報を取得し、CSV形式でAmazon S3に書き込む。
  • ファイルには、[USER_ID]と[ITEM_ID]を書き込む

 

前提条件
今回紹介する方法の前提条件は以下の通りです。

  • Amazon Personalizeキャンペーン作成済み
  • エクスポート先のS3バケット作成済み

 

構築の流れ

  1. IAMポリシー・IAMロール作成
  2. AWS Lambda作成
  3. 動作確認

 

 

■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:*"
        }
    ]
}

 

saitou-personalize-s3-exportIAM作成

 

↓[ポリシー名]と[説明]を入力し、[ポリシーの作成]をクリックします。

 

saitou-personalize-s3-exportIAM作成

saitou-personalize-s3-exportIAM作成

 

↓つぎにIAMロールを作成します。[信頼されたエンティティタイプ]は[AWSのサービス]を選択し、[ユースケース]は[Lambda]を選択し、[次へ]をクリックします。

 

saitou-personalize-s3-exportIAM作成

 

↓さきほど作成したIAMポリシーを選択し、[次へ]をクリックします。

 

saitou-personalize-s3-exportIAM作成

 

↓[ロール名]と[説明]を入力し、[ロールを作成]をクリックしてください。

 

saitou-personalize-s3-exportIAM作成

saitou-personalize-s3-exportIAM作成

saitou-personalize-s3-exportIAM作成

 

IAMポリシー・IAMロールの作成は以上です。

 

 

■AWS Lambda作成

今回紹介する方法の要のLambda関数を作成します。

 

↓サービス検索窓で[Lambda]と入力し、[Lambda]をクリックします。

 

saitou-personalize-s3-exportLambda作成

 

↓左のナビゲーションペインから、[関数]をクリックし、[関数の作成]をクリックしてください。

 

saitou-personalize-s3-exportLambda作成

 

↓[一から作成]を選択し、ほかの設定値は以下の通りです。入力が完了しましたら、[関数の作成]をクリックしてください。

 

項目 設定値
関数名 任意
ランタイム 3.10
アーキテクチャ x86_64
実行ロール 既存のロールを使用する
既存のロール 作成したもの

 

saitou-personalize-s3-exportLambda作成

 

saitou-personalize-s3-exportLambda作成

 

↓[コードソース]の[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 ファイルを作成しました。"
    }

 

saitou-personalize-s3-exportLambda作成

saitou-personalize-s3-exportLambda作成

 

↓貼り付けが完了しましたら、[Test]をクリックします。

 

saitou-personalize-s3-exportLambda作成

 

↓[イベント名]を任意で入力し、デフォルトのまま[保存]します。

 

saitou-personalize-s3-exportLambda作成

saitou-personalize-s3-exportLambda作成

 

↓つぎに、[設定]タブにあります[一般設定]から[[編集]をクリックし、[タイムアウト]の時間を[0分3秒]から任意の時間に設定してください。わたしは[1分0秒]に設定しました。

 

saitou-personalize-s3-exportLambda作成

 

↓すべての設定が完了しましたら、[Deploy]をクリックします。

 

saitou-personalize-s3-exportLambda作成

 

Lambda関数の作成は以上です。

 

 

■動作確認

それでは動作確認をしてみましょう。

 

↓Lambda関数の[コード]タブから、[Test]をクリックします。すこし時間がかかります。

 

saitou-personalize-s3-export動作確認

 

↓Personalizeの設定でレスポンス速度を最低にしている場合、ユーザー数500×推薦情報各10件を取得し書き込むまでに40秒かかりました。

 

saitou-personalize-s3-export動作確認

 

↓成功すると、以下のResponceが返ってきます。

 

saitou-personalize-s3-export動作確認

 

↓S3バケットを確認してみましょう。[output.csv]というファイルが存在することが確認できます。

 

saitou-personalize-s3-export動作確認

 

↓中身を確認してみると、

 

saitou-personalize-s3-export動作確認

 

ユーザー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/

 

 

Last modified: 2023-10-21

Author