この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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経由でノートブックインスタンスにアクセスすることが可能です。こちらのアクセス方法についても別途試してみたいと思います。