[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を使う場合

ノートブックインスタンス名を指定して、sagemakercreate-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経由でノートブックインスタンスにアクセスすることが可能です。こちらのアクセス方法についても別途試してみたいと思います。

参考