Amazon PersonalizeがCloudFormationに対応しました

2022.03.12

いわさです。

Amazon PersonalizeでCloudFormationが使えるようになりました。
必要な全リソースではないですが、事前定義の大部分をコード化出来るようになっています。

本日は、Personalizeのチュートリアル相当の構成を、CloudFormationで構築してみました。

Personalizeの概念と作成出来る範囲

Amazon Personalizeは以下の流れで利用することが出来ます。
そして、2~5の太字部分を今回CloudFormationで作成することが出来るようになりました。

  1. S3バケットへトレーニングデータをアップロードする
  2. データセットとデータセットグループを作成する
  3. スキーマを定義する
  4. データセットへデータをインポートする
  5. データグループからソリューションを作成する
  6. ソリューションバージョンを作成する
  7. ソリューションバージョンからキャンペーンを作成する
  8. キャンペーンからレコメンドを取得

テンプレート

この記事ではカスタムデータセットグループのGet Startedと同じ内容のものをCloudFormation化してみました。
おそらくこれが最小構成のテンプレートかなという感じです。

今回は使ってませんが、ドメインデータセットグループもCloudFormationで利用可能です。

Getting started with a Custom dataset group - Amazon Personalize

上記の事前準備に従って、前データの用意とS3バケットへの格納、バケットポリシーなどの設定は事前に済ませておきます。

WSTemplateFormatVersion: 2010-09-09
Description: ---
Parameters: 
  TrainingDataBucket:
    Type: String
    Description: ARN
  PersonalyzeRole:
    Type: String
    Description: ARN
Resources: 
  ##########################################################
  # ステップ1:トレーニングデータをインポートする
  ##########################################################
  # create-dataset-group
  HogeDatasetGroup:
    Type: AWS::Personalize::DatasetGroup
    Properties: 
      Name: iwasa-hoge-dataset-group
  
  # create-schema
  HogeSchema:
    Type: AWS::Personalize::Schema
    Properties: 
      Name: iwasa-hoge-schema
      Schema: |
        {
          "type": "record",
          "name": "Interactions",
          "namespace": "com.amazonaws.personalize.schema",
          "fields": [
              {
                  "name": "USER_ID",
                  "type": "string"
              },
              {
                  "name": "ITEM_ID",
                  "type": "string"
              },
              {
                  "name": "TIMESTAMP",
                  "type": "long"
              }
          ],
          "version": "1.0"
        }
  # create-dataset & create-dataset-import-job
  HogeDataSet:
    Type: AWS::Personalize::Dataset
    Properties: 
      Name: iwasa-hoge-dataset
      DatasetType: Interactions
      SchemaArn: !Ref HogeSchema
      DatasetGroupArn: !Ref HogeDatasetGroup
      DatasetImportJob: 
        JobName: iwasa-hoge-importjob
        DataSource:
          DataLocation: !Ref TrainingDataBucket
        RoleArn: !Ref PersonalyzeRole

  ##########################################################
  # ステップ2:ソリューションを作成する(モデルをトレーニングする)
  ##########################################################
  # ソリューションの作成: create-solution
  HogeSolution:
    Type: AWS::Personalize::Solution
    Properties: 
      Name: iwasa-hoge-solution
      DatasetGroupArn: !Ref HogeDatasetGroup
      RecipeArn: arn:aws:personalize:::recipe/aws-user-personalization

  # create-solution-version
  # CloudFormationに対応していない

  ##########################################################
  # ステップ3:キャンペーンを作成する(ソリューションを展開する)
  ##########################################################
  # create-campaign

Outputs:
  HogeSolution:
    Value: !Ref HogeSolution

上記のスタックを作成すると、諸々のPersonalizeリソースが作成されデータインポートジョブが開始されます。

チュートリアルの後半のトレーニングとデプロイを行う部分については引き続き手動で作成する必要があります。
スタックからソリューションのARNが取得出来ますので、バージョンを作成してキャンペーンを作成しましょう。

ソリューションバージョンを作成

ここでは以下の手順でソリューションバージョンを作成しています。
CLIから作成しているので、カスタムリソースでも対応出来そうですね。

作成処理に数十分かかります。

$ aws personalize create-solution-version --solution-arn arn:aws:personalize:ap-northeast-1:123456789012:solution/iwasa-hoge-solution
{
    "solutionVersionArn": "arn:aws:personalize:ap-northeast-1:123456789012:solution/iwasa-hoge-solution/cd636685"
}

$ aws personalize describe-solution-version --solution-version-arn arn:aws:personalize:ap-northeast-1:123456789012:solution/iwasa-hoge-solution/cd636685 | jq '.solutionVersion.status'
"CREATE IN_PROGRESS"

$ aws personalize describe-solution-version --solution-version-arn arn:aws:personalize:ap-northeast-1:123456789012:solution/iwasa-hoge-solution/cd636685 | jq '.solutionVersion.status'
"ACTIVE"

キャンペーンを作成

ソリューションバージョンが作成出来たら、そこからキャンペーンを作成します。
ここも数分〜数十分かかります。

$ aws personalize create-campaign \
  --name iwasa-hoge-campaign \
  --solution-version-arn arn:aws:personalize:ap-northeast-1:123456789012:solution/iwasa-hoge-solution/cd636685 \
  --min-provisioned-tps 1 
{
    "campaignArn": "arn:aws:personalize:ap-northeast-1:123456789012:campaign/iwasa-hoge-campaign"
}

$ aws personalize describe-campaign \
  --campaign-arn arn:aws:personalize:ap-northeast-1:123456789012:campaign/iwasa-hoge-campaign | jq '.campaign.status'
"CREATE IN_PROGRESS"

$ aws personalize describe-campaign \
  --campaign-arn arn:aws:personalize:ap-northeast-1:123456789012:campaign/iwasa-hoge-campaign | jq '.campaign.status'
"ACTIVE"

レコメンドを取得

キャンペーンが作成出来たら、あとはレコメンデーションを取得できるようになっています。

$ aws personalize-runtime get-recommendations \
  --campaign-arn arn:aws:personalize:ap-northeast-1:123456789012:campaign/iwasa-hoge-campaign \
  --user-id 123 
{
    "itemList": [
        {
            "itemId": "4776",
            "score": 0.0079922
        },
        {
            "itemId": "4025",
            "score": 0.0071286
        },
        {
            "itemId": "5299",
            "score": 0.0061172
        },
        {
            "itemId": "7090",
            "score": 0.0050712
        },
    ....

さいごに

AWS CLIやAPIと同じ操作感でCloudFormationは利用出来るので、AWS CLIでのPersonalizeチュートリアルに沿ってCloudFormationに落とし込むと、結構簡単にCloudFormation化することが出来ました。
この記事のテンプレートはいくつかパラメータを省略しておりまして、作成オプションが豊富にあります。
CloudFormationのドキュメントもよく確認してください。チュートリアルではKMSを利用していますが、私のテンプレートでは省略してます。