Amazon SageMaker Lakehouse で体験するシームレスなデータ分析ハンズオン

本記事は [**セゾンテクノロジー Advent Calendar 2024**](https://qiita.com/advent-calendar/2024/saison-tech) 19 日目の記事です。

## はじめに
Amazon SageMaker Lakehouse は AWS re:Invent 2024 で発表された新しいサービスです。Amazon S3 のデータレイクと、Amazon Redshift のデータウェアハウスを統合し、Apache Iceberg の API を使用してデータソースに横断的にアクセスできます。

次世代 SageMaker の概要や SageMaker Lakehouse が提供する機能については以下の記事で解説しています。

https://qiita.com/hayao_k/items/ec3e77c17a7de325a71c

本記事では SageMaker Lakehouse にデータソース (Redshift クラスター) を登録し、Unified Studio からデータ操作する方法をハンズオン形式で記載します。

## SageMaker Unified Studio 環境の構築
SageMaker Uniﬁed Studio は、データ、分析、AI 向けの統合開発環境 (IDE) です。Redshift による SQL 分析、Glue や Athena、EMR によるデータ処理、SageMakaer AI による AI/ML モデル開発、Bedrock Studio で提供されていた生成 AI アプリケーションの開発を単一の場所で実行することができます。

:::note info
Unified Studio は 2024/12/19 時点で Preview として提供されています。将来的に動作や仕様が変更される可能性があります。
:::

### ドメインの作成
Amazon SageMaker platform (旧 Amazon DataZone) コンソールに移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/b136b853-c1a0-9dc0-d19d-620a4f48cd82.png)

「Unified Studio ドメインを作成します」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/b13a4add-9ae0-ffe0-3028-640fa9d162b5.png)

ここでは「ドメインをどのように設定しますか?」 でクイックセットアップを選択します。

Amazon Bedrock を使用たことがない環境では「アクセス可能なモデルはありません」と表示されますが、今回は Bedrock IDE による開発は取り扱わないのでスキップします。

「Amazon SageMaker Unified Studio で使用するために特別にセットアップされた VPC はありません」と表示されるので、ここでは「VPC を作成」をクリックして新規の VPC を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/91353d5c-2f52-0d03-84f5-9b2dfd2ba090.png)

CloudFormation スタッククイック作成画面が立ち上がるので、デフォルト設定のままスタックを作成します。

:::note info
パラメータ `useVpcEndpoints` をデフォルトの `false` から `true` に変更すると、Unified Studio が連携する各種 AWS サービスの VPC エンドポイントが作成され、追加費用が発生します。要件に応じて変更を検討してください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/9491dcb6-0bbf-cec6-7e42-d27101910ed4.png)

useVpcEndpoints をデフォルトの `false` で作成した場合は以下のようなシンプルな構成の VPC が作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1fdb90f0-2976-cfa0-3152-51e22953031a.png)

「Amazon SageMaker Unified Studio で使用するために特別にセットアップされた VPC はありません」の更新ボタンをクリックすると警告が消えます。

Quick Setup 設定ではドメイン名および暗号化設定のカスタマイズができますが、今回は変更せずにドメインを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/ce7fcb0a-1a2f-65aa-8d88-eceae733b245.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/6e880e12-31cf-a05f-6408-89aa4cda6041.png)

以下の画面が表示されれば、Unified Studio の作成は完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/43a06c9f-d6d5-f8bd-9fac-6f53b9e41699.png)

### Unified Studio に対するアクセスの設定 (オプション)
Unified Studio は AWS IAM または SSO でアクセスできます。ドメインを作成した IAM プリンシパルに対し、デフォルトでアクセス権が追加されています。それ以外のユーザーにアクセスを許可する場合は個別に追加する必要があります。

ここでは SSO ユーザーの追加方法を紹介します。ドメインの詳細画面のユーザ登録タブで SSO ユーザーアクセス設定をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/3a49cc76-4427-813f-dbd3-d1aa224d24b5.png)

ステップ 1 で認証方法を設定します。ここでは IAM アイデンティティセンターを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/64f9f308-62b7-bb24-0fa0-314c8969e0da.png)

:::note warn
AWS IAM Identity Center でユーザー認証を行う場合、IAM Identity Center のリージョンと SageMaker ドメインのリージョンが一致している必要があります。
:::

ステップ 2 でユーザーとグループの割り当て方法を選択します。ここでは「割り当てを必須化する」を選択します。必須化しないを選択した場合は、すべての IAM アイデンティティセンターのユーザーとグループへアクセスが許可されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/37eccde6-706c-8d8f-e605-ad38481e81fe.png)

ステップ 3 確認画面に移動したら、ステップ 2 の編集をクリックします。2024/12/19 時点でコンソールの不具合か、IAM Identity Center のインスタンスが自動で入力されないためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/f6178f7f-25df-c215-3da4-731a755b0368.png)

今度は自動で接続が設定されるので次へをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/e93dbaeb-dc99-42e7-ece0-266414449cd2.png)

確認画面に戻ったら設定を保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/0f9d0c95-9b16-bdca-ed5b-53603e3b6a0f.png)

そのままユーザーとグループの追加画面に遷移します。任意のユーザーやグループを追加し、ステータスが割り当て済みになれば OK です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/dc1c6a53-42d6-8ad3-75e8-60a21ae50dbf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/fc921ff6-d0cd-d841-3225-02fdd9df4fc2.png)

## Unified Studio へのログインとプロジェクトの作成
Unified Studio の URL はドメインの詳細から確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/d2a5af12-432c-45b4-4bd8-f9ffea2ce8b2.png)

SSO ユーザー または IAM でサインインします。2024/12/19 時点では IAM でサインインした場合にコンソール上でエラー表示が頻発する (ただし操作自体は問題なくできる) ため、SSO ユーザーを使用するのが無難かもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/c56a5268-8031-320c-eb91-623435e68af6.png)

サインインしたら画面上部の「select a project」からプロジェクトを作成をクリックします。ユーザーは作成したプロジェクト内でデータ分析やモデル開発などの作業を行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/ba1050fb-37b2-127a-42e6-f8c7a9964af8.png)

プロジェクトを作成の Step 1 で任意のプロジェクト名を入力します。今回はデータ分析機能のみをハンズオンするため、プロジェクトのプロファイルで「SQL analytics」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/711b24b8-93ff-bebb-8716-47091f53c7c9.png)

:::note info
プロジェクト作成により、プロジェクトに紐づく Glue データベース、Athena ワークグループ、Redshift Servelress などのリソースが自動で作成されます。プロジェクト上で分析作業を行う場合にこれらのリソースが使用されます。
:::

Step 2 でプロジェクトに紐づいて作成されるリソースの名称などをオプションで変更できます。ここではデフォルト値のまま次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/8b58cafa-e581-4c04-9a13-529de86dbb28.png)

Step 3 で設定値を確認し、プロジェクトの作成をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1bd7b455-b599-0480-9ad4-befecaeef8a9.png)

プロジェクトの作成は 5 分程度かかるので気長に待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/42028113-904e-7782-8e54-f5eb561a4ae8.png)

プロジェクトの作成の作成が完了したら、プロジェクトの詳細に記載されているプロジェクトロールの名前を控えておきます。これは後続の手順 (プロジェクトからカタログへのアクセス許可) で必要になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/f4ae9b0a-1d3a-f2c3-2c52-d9a51acede71.png)

## データソース (Redshift Serverless) の準備
今回のハンズオンのデータソースとなる Reshift Serverless を個別に作成します。すでに既存の Redshift クラスターが存在する場合はそちらを使用することもできます。

### 名前空間/ワークグループの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1a84619a-683d-e020-316b-4353d0f95e20.png)

ステップ 1 で任意のワークグループ名を入力します。ベース容量を最小の `8` に設定しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/3365e09c-a1e6-d6bb-0607-a4eb7629d056.png)

画面下部のネットワークとセキュリティで Redshift Serverless を配置する VPC やサブネット、セキュリティグループを設定し次に進みます。SageMaker Unified Studio から直接 Redshift Serverless のエンドポイントに疎通できる必要はないため、そのあたりの設定は不要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/2a623cfd-dd6a-9e04-b80b-6aa6c431f8b4.png)

ステップ 2 で任意の名前空間の名前を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1d7d3396-57a3-0926-5196-32e9fd9e7baa.png)

許可の設定で IAM ロールを関連付けます。ここでは IAM ロールを作成から新規のデフォルトロールを作成しています。暗号化とセキュリティの設定はデフォルトのまま次へ進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/0419bd43-17d2-0dad-d1ff-a5e199d47616.png)

ステップ 3 で設定値を確認し、名前空間/ワークグループ を作成します。

### サンプルデータの挿入
作成された名前空間はデータが空っぽですので、サンプルデータを挿入しておきます。Redshift クエリエディタ v2 を開きます。

:::note info
アカウントでクエリエディタ v2 を初めて使用する場合、設定が表示されます。KMS による暗号化設定は後から変更できないため、設定時はご注意ください。
:::

先ほど作成したワークグループに Federated user で接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/c9106656-5347-1836-ab9c-30bed03cf128.png)

native databases (2) → sample_data_dev → tickit の Open sample notebooks をクリックするとサンプルデータベースの作成に関する確認画面が表示されるので、Create をクリックして作成を完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/f6046c5e-4493-4ad2-4250-2cb7f7b3d5e7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/6c2b3be2-7817-e531-4098-4a7be0e8378d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/be91fc07-b184-b58c-0442-66d03e427de5.png)

## Redshift Serverless を SageMaker Lakehouse へ登録する
先ほど作成した Redshift Serverless の名前空間を SageMaker Lakehouse に登録します。SageMaker Lakehouse は Glue Data Catalog と Lake Formation 上に構築されているため、Lake Formation でカタログの作成と権限設定をおこなうことで、Lakehouse から Redshift 上のデータを参照できるようになります。

### 名前空間の登録
Redshift コンソールで作成した名前空間の設定画面からアクション → Register with AWS Glue Data Catalog をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/22d519cc-1fd7-1883-fb6e-61077bb26ea1.png)

確認画面が表示されるので、Register をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/d9dd3dc4-de89-f32c-5287-6ecc38f4fee6.png)

### Lake Formation の設定
後述の手順 (Federated カタログの作成) の前提作業として Lake Formation の各種設定をおこないます。

Lake Formation のコンソールに移動し、Administration → Administrative roles and tasks から Data lake administrators を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1b8ffcba-408b-483b-949b-c208631fd173.png)

Read-only Administrator として `AWSServiceRoleForRedshift` を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/9372d391-f6af-89e8-bc2f-b61938616b90.png)

同様の手順で、Data lake administrator としてこのハンズオンで作業している IAM を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/42ffcbcf-9ef8-6c6f-1597-111d63f07262.png)

同じ IAM に対し、カタログを作成する権限を付与します。Catalog creators で Grant をクリックして Create catalog 権限を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/3524e5a6-8b73-d90c-5dc7-6a141f8616a8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/19827b92-fddb-b6c4-005a-57ecc0965294.png)

以上で Lake Formation の事前準備は完了です。

### Federated カタログの作成
SageMaker Lakehouse で利用できるテクニカルカタログには Managed カタログと Federated カタログの 2 種類があります。既存のリソースを Lakehouse から参照するには Federated カタログの作成が必要です。

Lake Formation コンソールに新しく作成されている Catalogs というメニューに移動すると、Pending catalog invitaions に先ほど登録をおこなった Redshift Serverless の名前空間が表示されています。これを選択し、Approve and ceate catalog をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/c173792b-f8ed-6b7b-e377-d91de03dd592.png)

Step 1 で任意のカタログ名を入力します。カタログタイプは自動で Federated が選択されています。

「Access this catalog from Apache Iceberg compatible engines.」にチェックを入れたままにしておくことで Athena や EMR 上の Apache Spark などの Iceberg 互換のクエリエンジンから Redshift 上のデータへアクセスできるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/33d26311-2ae8-7923-6b57-45d8cb464f00.png)

IAM role には Redshift と S3 との間でデータを転送するためのデータ転送ロールを設定する必要があります。以下の IAM ポリシーと信頼ポリシーを設定した IAM ロールを作成し、指定してください。

```json:IAM ポリシー
{
    "Version": "2012-10-17",
    "Id": "glue-enable-datalake-access",
    "Statement": [
        {
            "Sid": "DataTransferRolePolicy",
            "Effect": "Allow",
            "Action": [
                "glue:GetCatalog",
                "glue:GetDatabase",
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "*"
        }
    ]
}
```

```json:信頼ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "redshift.amazonaws.com",
                    "glue.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

ドキュメントの記載は以下を参照してください。

https://docs.aws.amazon.com/lake-formation/latest/dg/redshift-ns-prereqs.html

Step 2 の Grant permission で Unified Studio で作成したプロジェクトのプロジェクトロールに、Federated カタログに対する権限を設定します。Add permission をクリックします。

:::note info
この設定をおこなわないと、Unified Studio からデータを参照することはできないため、ご注意ください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/e8c0f4fa-5135-2ef2-9465-df38fdbafa5f.png)

IAM users and roles でプロジェクトロール (`datazone_usr_role_xxxxxxxxxxxxx_xxxxxxxxxxxxxx`) を選択します。Catalog permissions では Super user を選択して、権限を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/7a87206b-0541-27a8-15e7-8e4e7b05088e.png)

Step 3 で設定内容を確認し、カタログを作成します。以下のような画面が表示されれば作成完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/f76c2d52-f9f1-3215-d84e-67911903716f.png)

## Lakehouse 経由で Athena からクエリを実行
カタログの作成が完了し、Lakehouse 経由で Redshift 上のデータへ複数のコンピュートリソースからアクセスできるようになりました。ここでは先ほど作成したサンプルデータベースに対し、Athena からクエリを実行します。

Unified Studio のプロジェクト → データを選択すると先ほど Lakehouse に登録したカタログが参照できるようになっているはずです。サンプルデータベースの任意のテーブルをクリックして、Query with Athena を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/147fb77e-67ec-d9c6-1f0e-dbbbfa02c4f3.png)

select 文が自動的に発行され、結果が返ってきます。Lakehouse に登録した Redshift のデータを Athena からクエリ実行できました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/387b1fdf-b849-e033-7aa6-5000a8d621e6.png)

:::note info
クエリは Unified Studio プロジェクト作成時に自動作成された Athena Workgroup で実行されます
:::

Unified Studio は Amazon Q Developer ともネイティブに統合されているため、もちろん自然言語からクエリを生成し、実行することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/4073f89e-0ccd-08b7-62af-c407cf7d4d09.png)

また Lake Formation のカタログに登録されたことで、Redshift 上でも external databases として認識されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/c65de805-5f27-79ad-f148-911da152e684.png)

ハンズオン手順は以上です。SageMaker Lakehouse は、S3 や Redshift、フェデレーション先のリソース (BigQuery や Snowflake など) に、シームレスなアクセスを提供します。このハンズオンはその機能の一部分のみ体験するものですが、どなたかの参考になれば幸いです。