Amazon EC2にFlaskアプリを構築し、Personalizeから推薦情報を受け取ってみるPart2

Amazon Personalizeはフルマネージド型の機械学習サービスで、用意したデータをもとにユーザーへのおすすめ商品・情報を生成します。

 

おすすめ情報が利用される状況は、Eコマース・コンテンツ配信・メディア・広告など、多岐にわたりますよね。

 

今回の記事ではAmazon Prsonalizeが生成する推薦情報をWebアプリケーションでユーザーごとに表示してみるハンズオンを紹介します。

 

Webアプリケーションに関しては、初心者の方でも扱いやすいFlaskを利用しますのでご安心ください。

 

↓ボリュームが多いため、Part1とPart2に分けてあります。

 

 

 

FlaskアプリでPersonalizeのおすすめ情報を表示

saitou-flaskapp-personalize2構築図

「Amazon EC2にFlaskアプリを構築し、Personalizeから推薦情報を受け取ってみるPart2」は前回の続きからです。

 

前回はユーザーへのおすすめを生成するAmazo Personalizeソリューションやキャンペーンを作成しました。

 

今回のPart2では、Personalizeで生成された推薦情報をユーザーに表示するWebアプリケーションを作成します。WebアプリケーションはAWS クラウド環境にパブリックサブネットを作成し、EC2インスタンスを起動、Flaskアプリをデプロイし稼働させます。

 

 

■必要な前提知識と流れ

今回のハンズオンは以下の前提知識が必要です。できるだけ初心者の方でも迷わずにできるように書きましたが、エラーがおきたときの対処など含めて前提知識があったほうがスムーズにハンズオンができるかと思います。

 

【前提知識】

  • AWSアカウントのセットアップ
  • VPC,SecurityGroups,EC2の基本知識
  • Amazon Personalizeについての基本知識
  • 必要なツールとライブラリ(Flask, Boto3など)

 

【構築流れ】
saitou-flaskapp-personalize2構築図3

構築図の中の左側を作成します。

 

  • IAMロール作成

  • VPC作成

  • セキュリティグループ作成

  • EC2インスタンス作成

  • Flaskアプリデプロイ

 

 

■IAMロール作成

まずはIAMロールを作成します。EC2インスタンスにセッションマネージャーで接続するためのポリシーと、Personalizeから推薦情報を取得するための権限を付与します。

 

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

 

saitou-flaskapp-personalize2IAMロール作成

 

↓左のナビゲーションペインから[ロール]をクリックし、[ロールを作成]を押します。

 

saitou-flaskapp-personalize2IAMロール作成

 

↓[信頼されたエンティティタイプ]は[AWS のサービス]を選択します。

 

saitou-flaskapp-personalize2IAMロール作成

 

↓[サービスまたはユースケース]は[EC2]を選択し、[ユースケース]は[EC2]を選択します。選択できたら、[次へ]をクリックします。

 

saitou-flaskapp-personalize2IAMロール作成

 

↓[許可ポリシー]は次の二つを検索し、チェックボックスにチェックをし、[次へ]をクリックします。
AmazonSSMManagedInstanceCore
AmazonPersonalizeFullAccess

 

saitou-flaskapp-personalize2IAMロール作成

saitou-flaskapp-personalize2IAMロール作成

 

↓[ロール名]は任意の名前を入力します。
saitou-personalize-handson-iamrole

 

saitou-flaskapp-personalize2IAMロール作成

 

↓[許可ポリシー]で2つのポリシーがアタッチされていることを確認し、[ロールを作成]をクリックします。

 

saitou-flaskapp-personalize2IAMロール作成

 

IAMロールの作成は以上です。

 

 

■VPC作成

つぎにEC2インスタンスを起動するための場所であるVPCを作成します。ハンズオンなので、EC2インスタンスをプライベートサブネットにおき、パブリックサブネットにALBを~というアーキテクチャではなく、VPC内にはパブリックサブネット一つだけ作成します。

 

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

 

saitou-flaskapp-personalize2VPC作成

 

↓ダッシュボード画面で[VPCを作成]をクリックします。

 

saitou-flaskapp-personalize2VPC作成

 

↓[作成するリソース]は[VPCなど]を選択します。[名前タグの自動生成]は任意の名前を入力します。[IPv4 CIDR ブロック]は[10.0.0.0/16]にします。
saitou-personalize-handson

 

saitou-flaskapp-personalize2VPC作成

 

↓以下の設定値を選択・入力してください。以下にない項目はデフォルトのままで大丈夫です。

 

項目 設定値
アベイラビリティゾーン (AZ) の数 1
パブリックサブネットの数 1
プライベートサブネットの数 0
ap-southeast-1a のパブリックサブネット CIDR ブロック 10.0.1.0/24

 

saitou-flaskapp-personalize2VPC作成

 

↓入力が完了しましたら、[VPCを作成]をクリックします。

 

saitou-flaskapp-personalize2VPC作成

 

↓[成功]と表示が出ましたら、完了です。

 

saitou-flaskapp-personalize2VPC作成

 

VPCの作成は以上です。

 

 

■セキュリティグループ作成

つづいてセキュリティグループを作成します。構築が完了したら、Webブラウザでテストしますので、自身の環境のIPアドレスだけ許可するセキュリティグループを作成します。

 

↓[VPC]のダッシュボード画面で、左のナビゲーションペインから[セキュリティグループ]をクリックし、[セキュリティグループを作成]を押します。

 

saitou-flaskapp-personalize2セキュリティグループ作成

 

↓[セキュリティグループ名]は任意の名前を入力し、[VPC]はさきほど作成したVPCを選択します・
saitou-personalize-handson-sg

 

saitou-flaskapp-personalize2セキュリティグループ作成

 

↓[インバウンドルール]で[ルールを追加]をクリックします。[タイプ]は[すべてのトラフィック]を選択し、[ソース]は[MyIP]を選択します。[MyIP]を選択すると、自身の環境のIPアドレスが自動で入力されます。アウトバウンドルールはそのままで。

 

saitou-flaskapp-personalize2セキュリティグループ作成

 

↓入力が完了しましたら、[セキュリティグループを作成]をクリックします。

 

saitou-flaskapp-personalize2セキュリティグループ作成

 

セキュリティグループの作成は以上です。

 

 

■EC2インスタンスのセットアップ

FlaskアプリをデプロイするEC2インスタンスを作成します。起動完了後、いくつかコマンドをうち、Flaskアプリも動かします。このパートが一番つまづくかもしれません。できるだけ詳細に書きましたので、手順通り実施していただければ大丈夫かと思います。

 

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

 

saitou-flaskapp-personalize2EC2作成

 

↓EC2ダッシュボード画面から[インスタンスを起動]をクリックします。

 

saitou-flaskapp-personalize2EC2作成

 

↓[名前]は任意の名前を入力します。
saitou-personalize-handson-EC2

 

saitou-flaskapp-personalize2EC2作成

 

↓[Application and OS Images (Amazon Machine Image)]は以下の設定値で選択します。

 

項目 設定値
Amazon マシンイメージ Amazon Linux 2023 AMI 最新バージョン
アーキテクチャ 64ビット(x86)
インスタンスタイプ m5.large
キーペア 自身で用意したもの

 

saitou-flaskapp-personalize2EC2作成

saitou-flaskapp-personalize2EC2作成

 

↓[ネットワーク]設定では、次の設定値を選択してください。

 

項目 設定値
VPC 作成したもの
サブネット 作成したもの
パブリック IP の自動割り当て 有効化
ファイアウォール (セキュリティグループ) 既存のセキュリティグループを選択する
共通のセキュリティグループ 作成したセキュリティグループ

 

saitou-flaskapp-personalize2EC2作成

 

↓[高度な詳細]では[IAM インスタンスプロフィール]で作成したIAMロールを選択します。
saitou-personalize-handson-iamrole

 

saitou-flaskapp-personalize2EC2作成

 

↓上記で示した各設定値以外の項目はデフォルトで問題ありません。入力が完了しましたら、[インスタンスを起動]をクリックします。

 

saitou-flaskapp-personalize2EC2作成

 

↓[成功]と表示されましたら、[インスタンス]画面に移動します。

 

saitou-flaskapp-personalize2EC2作成

 

↓[ステータスチェック]が[初期化しています]から[2/2のチェックに合格しました]に変わるまで待ちましょう。

 

saitou-flaskapp-personalize2EC2作成

 

↓[ステータスチェック]が[2/2のチェックに合格しました]に変わりましたら、EC2インスタンスの作成は以上です。

 

saitou-flaskapp-personalize2EC2作成

 

 

■Flaskアプリケーションのデプロイ

さいごにFlaskアプリケーションをデプロイします。

 

Flaskアプリケーションの役割は、ユーザーが入力したユーザーIDに基づいて、Personalizeから推薦情報を取得し、ユーザーにおすすめのアイテムを提供することです。GitHubにコードを置きましたので、それを利用してください。

 

↓作成したEC2インスタンスにチェックを入れ、画面上部にある[接続]をクリックします。

 

saitou-flaskapp-personalize2Flaskデプロイ

 

↓[セッションマネージャー]タブをクリックし、[接続]を押します。もし、[セッションマネージャー]タブをクリックし、[接続]が表示されていない場合、IAMロールでポリシーがアタッチされているかや、EC2インスタンスがパブリックサブネットに配置されているか、AMIがAmazon Linux2023か確認してください。

 

saitou-flaskapp-personalize2Flaskデプロイ

 

↓コマンドラインが表示されましたら、次のコマンドを打ちます。
sudo su ec2-user
cd

 

saitou-flaskapp-personalize2Flaskデプロイ

saitou-flaskapp-personalize2Flaskデプロイ

 

つづいて、必要なパッケージをインストールします。

sudo dnf install -y git
sudo dnf install -y sqlite
sudo dnf install -y python3-pip python3-devel

 

↓インストールが完了しましたら、GitHubにFlaskアプリのリポジトリをクローンします。
git clone https://github.com/saitou-cpi/flaskapp-personalize.git

 

[ec2-user@ip-10-0-1-146 ~]$ git clone https://github.com/saitou-cpi/flaskapp-personalize.git
Cloning into 'flaskapp-personalize'...
remote: Enumerating objects: 48, done.
remote: Counting objects: 100% (48/48), done.
remote: Compressing objects: 100% (35/35), done.
remote: Total 48 (delta 15), reused 40 (delta 10), pack-reused 0
Receiving objects: 100% (48/48), 8.13 KiB | 8.13 MiB/s, done.
Resolving deltas: 100% (15/15), done.

 

↓クローンできたか確認します。
ll

 

[ec2-user@ip-10-0-1-146 ~]$ ll
total 0
drwxrwxr-x. 5 ec2-user ec2-user 121 Nov 25 06:07 flaskapp-personalize

 

↓つぎに仮想環境を作成します。※env名を長くしすぎました、、、すいません
python3 -m venv flaskapp-personalize/env/flaskapp-personalize-env
source flaskapp-personalize/env/flaskapp-personalize-env/bin/activate

 

saitou-flaskapp-personalize2Flaskデプロイ

 

仮想環境が有効化されたら、ユーザー名の左側にenv名が表示されます。
(flaskapp-personalize-env) [ec2-user@ip-10-0-1-146 ~]$

 

↓ディレクトリを移動します。
cd flaskapp-personalize/

 

↓つづいてFlaskやその他必要なパッケージをインストールします。
pip install -r flaskapp-personalize/requirements.txt

 

saitou-flaskapp-personalize2Flaskデプロイ

 

Flaskアプリを動かすためのパッケージはすべてインストールできました。さいごにFlaskアプリのコードを一部修正します。

 

つぎのコマンドの[YOUR-REGION][YOUR-ACCOUNT-ID][YOUR-CAMPAIGN-NAME]部分を自身の環境に合わせて修正してください。
sed -i 's/YOUR_PERSONALIZE_CAMPAIGN_ARN/arn:aws:personalize:YOUR-REGION:YOUR-ACCOUNT-ID:campaign\/YOUR-CAMPAIGN-NAME/' app.py

 

わたしの場合は、こんな感じです。アカウントIDはマスク目的で適当な数字です。
sed -i 's/YOUR_PERSONALIZE_CAMPAIGN_ARN/arn:aws:personalize:ap-southeast-1:123456789012:campaign\/saitou-personalize-handson-campaign/' app.py

 

↓キャンペーンARNはPesonalzeの画面から確認できます。

 

saitou-flaskapp-personalize2Flaskデプロイ

 

↓修正できましたら、コマンドを実行しましょう。

 

(flaskapp-personalize-env) [ec2-user@ip-10-0-1-146 flaskapp-personalize]$ sed -i 's/YOUR_PERSONALIZE_CAMPAIGN_ARN/arn:aws:personalize:ap-southheast-1:123456789012:campaign\/saitou-personalize-handson-campaign/' flaskapp-personalize/app.py

 

↓修正できたか確認してみましょう。つぎのコマンドを実行します。
cat app.py

 

saitou-flaskapp-personalize2Flaskデプロイ

 

11行目の"CAMPAIGN_ARN"部分が自身のキャンペーンARNに修正されていましたでしょうか。

 

↓それでは、Flaskを実行します。つぎのコマンドを実行します。
python app.py
 

saitou-flaskapp-personalize2Flaskデプロイ

 

↓コマンドラインはそのままで、WebブラウザからつぎのURLにアクセスしてみましょう。IPアドレスは作成したEC2インスタンスのパブリックIPアドレスを入れてください。
http://EC2インスタンスパブリックIPアドレス:5000

 

saitou-flaskapp-personalize2Flaskデプロイ

 

「ようこそ」と表示されたら、構築完了です。

 

Flaskアプリケーションのデプロイは以上です。

 

 

■動作確認

さいごに動作確認してみましょう。

 

↓入力フォームに適当な数字を入力し、[送信]をクリックしてみてください。

 

saitou-flaskapp-personalize2動作確認

 

↓おすすめのフルーツが二つ表示されたかと思います。

 

saitou-flaskapp-personalize2動作確認

 

↓Amazon Personalizeのキャンペーン画面で、同じユーザーIDを入力してみましょう。

 

saitou-flaskapp-personalize2動作確認

 

生成された推薦情報の上位2つのアイテムIDは[ 27 ]と[ 1 ]です。Flaskアプリで利用しているフルーツのデータベースをみると、

 

1|Apple
2|Banana
3|Orange
4|Strawberry
5|Blueberry
6|Mango
7|Pineapple
8|Watermelon
9|Grapefruit
10|Lemon
11|Lime
12|Cherry
13|Grape
14|Melon
15|Kiwi
16|Peach
17|Nectarine
18|Papaya
19|Guava
20|Lingonberry
21|Raspberry
22|Blackberry
23|Apricot
24|Plum
25|Passion Fruit
26|Avocado
27|Persimmon
28|Pomegranate
29|Dragon Fruit
30|Fig

 

[27: Persimmon],[1: Apple]ですね。

 

もういちどブラウザ画面に戻ってみると、

 

saitou-flaskapp-personalize2動作確認

 

同じ結果が表示されていることがわかりますね。

 

ユーザーが入力したIDをもとに、Pesonalizeに対し推薦情報を生成するAPIを実行し、返ってきたアイテムIDをデータベースと照合し、該当のフルーツを表示しています。

 

今回のハンズオンは以上です。

 

 

まとめ:

Amazon Personalizeはインポートしたデータセットからレシピに基づき学習し、パーソナライズされたアイテムIDやアクションIDを生成します。

 

Amazon Personalizeはサービス単体では力を発揮しないため、ハンズオンや学習においても"Amazon Personalize×何か"を意識する必要があります。Personalizeの代表的なユースケースはEコマースですので、"Amazon Personalize×Flask"でハンズオンを実施してみました。

 

また、Amazon Personalizeがどうユーザーに届くのかも重要な気がします。

 

今回Webアプリで推薦情報を提供してみて、強く感じました。つぎはAPI GatewayとLamdbaを利用して、サーバレスアーキテクチャで推薦情報を提供する仕組みを作ってみます。

 

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
 
AIや機械学習のレコメンデーションサービスについて知りたい方は、ぜひ協栄情報にお問い合わせください。
https://www.cp-info.co.jp/contact/
 
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

 

 

参考リンク: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/

 

■Amazon Personalizeのエラーを解決!各カラムのデータ型を調べる方法(齊藤弘樹)
https://cloud5.jp/saitou-check-data-type/

 

■AWS Lambdaを使ってAmazon Personalizeの推薦情報をCSVでS3にエクスポートする方法(齊藤弘樹)
https://cloud5.jp/saitou-personalize-attribute-recommendation/

 

Last modified: 2023-12-02

Author