[Amazon SageMaker] 署名付きURLを使ってIAMユーザーレスでノートブックインスタンスにアクセスする
Amazon SageMaker(以降SageMaker)のノートブックインスタンスにアクセスする場合、IAMユーザーでSageMakerのマネージメントコンソールにログインし、そこからノートブックインスタンスにアクセスする方法が一般的かと思います。この際、マネージメントコンソールからは「署名付きノートブックインスタンスURL( Presigned Notebook Instance URL)」を生成するAPI、「CreatePresignedNotebookInstanceUrl 」がコールされています。
署名付きURLはAmazon S3やAmazon CloudFrontでおなじみの機能ですが、この署名付きノートブックインスタンスURLもそれらと同等の機能です(ノートブックインスタンスにアクセスするための期限付きのURLを生成する、ユーザーはそのURLからノートブックインスタンスにアクセスする)。
この「CreatePresignedNotebookInstanceUrl 」はAWS CLIやAWS SDKから利用することも可能です。AWS CLIやAWS SDKから「署名付きノートブックインスタンスURL」を発行しそれをSageMakerの利用者に払い出すことで、IAMユーザーを持たない利用者もノートブックインスタンスにアクセスすることができます。(つまり、マネジメントコンソールにログインすることなくノートブックインスタンスが利用できる、ということです。)
この記事では、AWS CLIと、AWS SDK for Golangを使って、この「署名付きノートブックインスタンスURL」を生成する方法をご紹介します。
目次
検証環境
- macOS:Mojave(v10.14.3)
- AWS CLI:v1.16.90
- AWS SDK for Golang:v1.16.28
「MyNotebookInstance」という名前のノートブックインスタンスに対して署名付きノートブックインスタンスURLを生成する、という前提で話を進めます。
署名付きノートブックインスタンスURLの生成
やり方は非常に簡単です。
AWS CLIを使う場合
ノートブックインスタンス名を指定して、sagemaker
のcreate-presigned-notebook-instance-url
コマンドを実行します。
$ aws sagemaker create-presigned-notebook-instance-url \ --notebook-instance-name "MyNotebookInstance"
--session-expiration-duration-in-seconds
でセッションの有効期限を秒単位で設定することができます。デフォルトは「12時間」です。
$ aws sagemaker create-presigned-notebook-instance-url \ --notebook-instance-name "MyNotebookInstance" \ --session-expiration-duration-in-seconds 28800
AWS SDK for Golangを使う場合
こちらも特別な部分はありません。CreatePresignedNotebookInstanceUrl
を実行すればOKです。レスポンスのAuthorizedUrl
に署名付きURLが含まれています。
package main import ( "fmt" "log" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/sagemaker" ) func main() { region := "ap-northeast-1" notebookInstanceName := "MyNotebookInstance" sess := session.Must(session.NewSession()) svc := sagemaker.New(sess, aws.NewConfig().WithRegion(region)) params := &sagemaker.CreatePresignedNotebookInstanceUrlInput{ NotebookInstanceName: aws.String(notebookInstanceName), SessionExpirationDurationInSeconds: aws.Int64(28800), } resp, err := svc.CreatePresignedNotebookInstanceUrl(params) if err != nil { log.Fatal(err.Error()) } fmt.Println(*resp.AuthorizedUrl) }
IPアドレスでのノートブックインスタンスへのアクセス制限
署名付きノートブックインスタンスURLは、そのURLを知っていれば誰でもどこからでもアクセスできます。よりセキュリティを高めたいという場合は、IAMポリシーを使って接続元のIPアドレスでノートブックインスタンスへのアクセスを制限できます。
具体的には、以下のように「CreatePresignedNotebookInstanceUrl」に対してIPアドレス制限を設定したIAMポリシーを用意して、これを署名付きノートブックインスタンスURLを生成するIAMユーザーやIAMロールに割り当てます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "sagemaker:CreatePresignedNotebookInstanceUrl", "Resource": "*", "Condition": { "NotIpAddress": { "aws:SourceIp": [ "<接続を許可するIPアドレス、またはIPアドレスレンジ>" ] } } }, { "Effect": "Allow", "Action": "sagemaker:CreatePresignedNotebookInstanceUrl", "Resource": "*" } ] }
「CreatePresignedNotebookInstanceUrl」アクションに対するIP制限なので、一見「署名付きノートブックインスタンスURLの生成を制限するだけ」に見えますが、生成されたURLからのノートブックインスタンスへのアクセスも制限されます。
まとめ
SageMakerの署名付きノートブックインスタンスURLの基本的な使い方をご理解いただけたかと思います。より発展的な利用方法としては、SageMaker用のポータルサイトを用意して、認証済みユーザーに対して署名付きノートブックインスタンスURLを自動的に払い出す、といったやり方もできそうです(ポータルとURL生成:Amazon S3 + Amazon API Gateway + Lambda、認証:Amazon Cognito、なんかでできそうです)。
また、SageMakerのノートブックインスタンスはインターフェイスVPCエンドポイント(AWS PrivateLink)に対応しているので、これを利用することでVPC内から直接、あるいはVPNやAWS Direct Connect経由でノートブックインスタンスにアクセスすることが可能です。こちらのアクセス方法についても別途試してみたいと思います。