クラウドやAWSに詳しくない人向けSageMaker Studio導入ガイド

Amazon SageMakerを利用して機械学習モデルのトレーニングを行ってきたものの、実験管理ツールとして用いていたWandBの接続が不安定な点に若干不便を感じていました。

そんな中、SageMaker StudioのExperiments機能ならこの問題を解消できそうだと思い、まずはStudioを導入してみることにしました。

Studioを構築するにあたって、VPCやサブネットなどの基本的なネットワーク構成を設定する必要があるのですが、私のようなクラウド素人にはかなりの手間だったので、初心者向けに導入手順をまとめました。

間違った点がありましたら、コメントでご指摘いただけますと幸いです。

# 構成
以下の構成でSageMaker Studioを構築します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/006dd581-c877-7870-1987-6844c7bf994b.png" width="800">

# 導入手順
以下の順番でネットワーク構成とSageMaker Studioの設定を行います。

1. VPC
2. プライベートサブネット
3. VPCエンドポイント
4. ルートテーブル
5. セキュリティグループ
6. SageMaker Studio ドメイン
7. ユーザープロファイル

## VPC
アプリケーションを展開している他のVPCと将来的にVPCピアリングで接続することを考慮し、互いのVPCのCIDRブロックが重複しないようにCIDRブロックを設定します。

プライベートIPv4アドレス空間には以下の3つの範囲が定義されているのですが(RFC 1918)、既存のVPCで10.0.0.0/16が使用済なので、今回は同じ10.0.0.0/8範囲内の異なるサブネット(10.1.0.0/24)を使用します。

- 10.0.0.0 - 10.255.255.255 (10.0.0.0/8)
- 172.16.0.0 - 172.31.255.255 (172.16.0.0/12)
- 192.168.0.0 - 192.168.255.255 (192.168.0.0/16)

※同じ10.0.0.0/8範囲内の異なるサブネットであれば、10.2.0.0/16などでも大丈夫です。
※別のプライベートアドレス範囲(172.16.0.0/16や192.168.0.0/16など)を使用しても大丈夫です。

10.1.0.0/16でもCIDRブロックの重複を避けられるのですが、SageMaker Studioを配置するには範囲が広すぎるので、今回はより限定された範囲の10.1.0.0/24(利用可能なIPアドレスは251個)を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/da28d978-98e8-39c2-2351-fe42dc4cb442.png" width="600">

### プライベートDNSの有効化
後の手順でECR API用およびECR Docker Registry用にインターフェースVPCエンドポイントを作成するのですが、VPC内でプライベートDNSが有効になっていないと作成時にエラーが起こります。

VPC内でプライベートDNSを有効にするために、VPCの編集画面から以下のVPC属性を両方ともtrueに設定します。

- DNS解決を有効化(enableDnsSupport)
- DNSホスト名を有効化(enableDnsHostnames)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/eda57f5e-3e9b-1694-5be6-42441129e877.png" width="600">

## プライベートサブネット
VPCダッシュボードで、Studioを配置する新しいプライベートサブネットを作成します。
サブネットの範囲は10.1.0.0/25で指定します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/57179ab6-ea38-a4f4-331c-3b9363576095.png" width="600">

## VPCエンドポイント
学習データの取得先およびモデルのアップロード先であるS3や、Dockerイメージの取得先であるECRとの接続を考慮し、それぞれのVPCエンドポイントをVPCダッシュボードから作成し、新しいプライベートサブネットと関連付けます。

### S3用のゲートウェイVPCエンドポイント
VPCエンドポイント`sagemaker-studio-s3`を作成します。

S3へのアクセスをVPC内からプライベートアクセスに制限するために、ゲートウェイVPCエンドポイントを使用します。
ゲートウェイVPCエンドポイントは、S3エンドポイントサービス（今回はcom.amazonaws.ap-northeast-1.s3）と関連付けられます。

S3用のゲートウェイVPCエンドポイントは、インターフェースVPCエンドポイントとは異なり、VPCにアタッチされます。
そのため、サブネットやセキュリティグループを直接関連付けることはありません。
その代わりに、ゲートウェイVPCエンドポイントは、VPCのルートテーブルにエントリを追加することで機能します。

ルートテーブルは後ほど設定するため、初期設定のチェックは空で大丈夫です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/60f0bb1c-39bc-b380-f8e6-f472f37eb3bc.png" width="600">

また、同じ名前のサービス`com.amazonaws.ap-northeast-1.s3`が2つありますが、`タイプ: Gateway`を選択してください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/77210508-9b20-1cd3-7acc-19646a532efe.png" width="600">

### ECR用のインターフェースVPCエンドポイント
VPCエンドポイント`sagemaker-studio-ecr-api` `sagemaker-studio-ecr-dkr`を作成します。

ECRでは、インターフェースVPCエンドポイントを使用します(ゲートウェイVPCエンドポイントをつかうサービスはS3とDynamoDB)。

インターフェースVPCエンドポイントは、ECRの2つのエンドポイントサービスと関連付けられます。
- ECR API用（com.amazonaws.ap-northeast-1.ecr.api）
- ECR Docker Registry用（com.amazonaws.ap-northeast-1.ecr.dkr）

インターフェースVPCエンドポイントの実体はENI(Elastic Network Interface)であるため、サブネット内で構成されます。
そのため、ゲートウェイVPCエンドポイントと異なり、初期設定でサブネットの選択も行う必要があります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/e614da7d-73ca-d336-bfe6-f519244696d6.png" width="600">

## ルートテーブル
サブネットは一つのルートテーブルに関連付けられ、そのルートテーブルのルーティング設定に従ってトラフィックが転送されます。
今回、VPC内のサブネットは1つであるため、VPC外のネットワークへのトラフィックのルーティングを制御するための設定を行います。

インターフェースVPCエンドポイントの場合、ルートテーブルには、特別なルートを追加する必要はありません。
これは、インターフェースVPCエンドポイントがDNSを利用して対象のサービスとの通信を制御するためです。
AWSが提供するエンドポイントのサービス用に、プライベートDNSエントリが自動的に作成され、これを利用してサービスにアクセスします。

ゲートウェイVPCエンドポイントの場合、関連付けられたプライベートサブネットのルートテーブルには、エンドポイントサービスへのトラフィックがゲートウェイエンドポイントにルーティングされるように設定を追加します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/069bf3fd-b8c0-8c97-f5e4-e7529d7edf4f.png" width="800">

## セキュリティグループ
ECR用のインターフェースVPCエンドポイントのセキュリティグループを新しく作成します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/eeaebb87-201f-935b-dde1-c252acf3f582.png" width="600">

エンドポイントの画面で作成したセキュリティグループをアタッチします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/01120a58-413d-e7a1-d685-7041090b7baa.png" width="600">

## SageMaker Studio ドメイン
AWSSageMakerFullAccessを含むロールをアタッチし、VPCとサブネットはこれまでに作成したものを選択します。

## ユーザープロファイル
複数のユーザーがSageMaker Studioを使用する場合、それぞれのユーザーに対して個別のユーザープロファイルを作成することが推奨されます。
これにより、各ユーザーが独自のワークスペースとリソースにアクセスでき、他のユーザーとの競合が発生しにくくなります。

ユーザープロファイルを作成することで、以下の利点があります。

- 各ユーザーが独自の開発環境を持てる
- ユーザーごとにリソースの割り当てや使用制限を設定できる
- ユーザーごとにアクセス権限を管理できる

ユーザープロファイルを作成すると、Studioを開く際に選択できるようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/5157e0e3-cbca-c477-22c2-122c113019e6.png" width="600">