Amazon SageMaker Studioの署名付きURLのランディングページを変更する
データ事業本部の鈴木です。
Amazon SageMaker StudioはSageMakerコンソールからのログインの場合、CreatePresignedDomainUrl APIで署名付きURLを発行してログインします。
ここでCreatePresignedDomainUrl APIをよく見ると、LandingUri
という引数があります。
説明によるとSageMaker Studioへのログイン時のランディングページを変更することができることが分かります。
ただ、この引数に関してはほとんど情報がないため、どのように使えるのか確認しました。
SageMaker Studioをユーザーに使ってもらう場合に、利用できる機能を詳細に制御したいとこれらの設定が気になります。ユーザーは権限さえあればCreatePresignedDomainUrl APIを実行し、任意のページにアクセスできる可能性があるためです。
LandingUri引数を使った署名付きURL作成について
ツールについて
使用するツールによって引数が指定できる場合とできない場合があります。
例えばAWS CLIは、記事執筆時点(v2.0.33)ではこの引数に対応していませんでした。
一方boto3(v1.38.6)では対応していました。
今回はboto3でランディングページを指定して検証をしました。
指定できるページについて
冒頭のAPIガイドによると、以下のページおよびアプリに対応していることが分かりました。
- studio::relative/path: Directs users to the relative path in Studio.
- app:JupyterServer:relative/path: Directs users to the relative path in the Studio Classic application.
- app:JupyterLab:relative/path: Directs users to the relative path in the JupyterLab application.
- app:RStudioServerPro:relative/path: Directs users to the relative path in the RStudio application.
- app:CodeEditor:relative/path: Directs users to the relative path in the Code Editor, based on Code-OSS, Visual Studio Code Open Source application.
- app:Canvas:relative/path: Directs users to the relative path in the Canvas application.
やってみた
デフォルトのとき
署名付きURLからのログインを試したことがない方も多いと思うので、まずはデフォルトの場合を確認しました。
以下のCloud ShellでPythonスクリプトを実行して署名付きURLを作成し、アクセスしました。
import boto3
def main():
client = boto3.client('sagemaker')
response = client.create_presigned_domain_url(
DomainId='ドメインID',
UserProfileName='ユーザープロファイル名'
)
print(response)
if __name__ == "__main__":
main()
AuthorizedUrl
のバリューに署名付きURLが入っているため、ブラウザからアクセスしました。
SageMaker Studioのホーム画面にアクセスできました。
SageMaker Studio内の別のページにランディングページを指定をしたとき
Running Instancesのページにランディングページを変えた署名付きURLを発行してみました。
Running Instancesのページは/running-instances
のパスです。
以下のCloud ShellでPythonスクリプトを実行して署名付きURLを作成し、アクセスするとRunning Instancesのページにアクセスできました。
import boto3
def main():
client = boto3.client('sagemaker')
response = client.create_presigned_domain_url(
DomainId='ドメインID',
UserProfileName='ユーザープロファイル名',
LandingUri='studio::running-instances'
)
print(response)
if __name__ == "__main__":
main()
studio::
がホームで、別のパスにする場合はそのパスを後ろにつけることが分かりました。
非表示にしているStudioのページにランディングページを指定をしたとき
HyperPod clustersのページをドメインの設定からStudio UIをカスタマイズして非表示にした上で、ランディングページに指定してアクセスしてみました。HyperPod clustersのページはhyperPod/clusters
のパスです。
import boto3
def main():
client = boto3.client('sagemaker')
response = client.create_presigned_domain_url(
DomainId='ドメインID',
UserProfileName='ユーザープロファイル名',
LandingUri='studio::hyperPod/clusters'
)
print(response)
if __name__ == "__main__":
main()
以下のようにアクセスできないことが分かりました。
アプリへランディングページ指定したとき
アプリは複数あるため、JupyterLabで試してみました。
今回はテスト用のスペースを作成し、起動しておきました。
署名付きURLの作成のためのコードは以下のようにしました。
SpaceName
でスペースを指定し、LandingUri
でJupyterLabアプリのパスを指定しました。
def main():
client = boto3.client('sagemaker')
response = client.create_presigned_domain_url(
DomainId='ドメインID',
UserProfileName='ユーザープロファイル名',
SpaceName='test-space',
LandingUri='app:JupyterLab:lab'
)
print(response)
if __name__ == "__main__":
main()
作成された署名付きURLを踏むと、JupyterLabのホームにアクセスできました。
なお、スペースを起動していないと以下のようなページになりました。
スペースが起動しているとアクセスできてしまうようです。なにかしらの理由で絶対にアクセスさせたくない場合は、アプリを作成できないように権限を制御しておくと安心と思います。
以下のガイドで制御方法が紹介されていました。
最後に
CreatePresignedDomainUrl APIによるランディングページを変更したAmazon SageMaker Studioの署名付きURLの払い出しについて紹介しました。参考になりましたら幸いです。