Amazon Neptuneに接続するAmazon SagemakerノートブックインスタンスをCloudFormationで作成する

Amazon Neptuneに接続するAmazon SagemakerノートブックインスタンスをCloudFormationで作成する

2025.11.26

データ事業本部のueharaです。

今回は、Amazon Neptuneに接続するAmazon SagemakerノートブックインスタンスをCloudFormationで作成してみたいと思います。

CloudFormationテンプレートの作成

以下の通り、CloudFormationテンプレートを作成します。

instance.yml
AWSTemplateFormatVersion: '2010-09-09'
Description: SageMaker Notebook Instance for Amazon Neptune connection

Parameters:
  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: VPC ID where Neptune cluster is deployed

  SubnetId:
    Type: AWS::EC2::Subnet::Id
    Description: Subnet ID where the SageMaker Notebook will be deployed

  NeptuneClusterEndpoint:
    Type: String
    Description: Neptune cluster endpoint (e.g., your-cluster.cluster-xxxxxxxxx.region.neptune.amazonaws.com)

  NeptuneClusterResourceId:
    Type: String
    Description: Neptune cluster resource ID (e.g., cluster-xxxxxxxxx)

  InstanceType:
    Type: String
    Default: ml.t3.medium
    Description: SageMaker Notebook instance type

  NotebookInstanceName:
    Type: String
    Default: neptune-notebook
    Description: Name for the SageMaker Notebook instance

Resources:
  # SageMaker Notebook Instance用のIAMロール
  SageMakerExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: sagemaker.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: NeptuneNotebookPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Sid: S3ListBucketAndGetObject
                Effect: Allow
                Action:
                  - s3:GetObject
                  - s3:ListBucket
                Resource:
                  - !Sub arn:aws:s3:::aws-neptune-notebook-${AWS::Region}
                  - !Sub arn:aws:s3:::aws-neptune-notebook-${AWS::Region}/*
              - Sid: DBAccess
                Effect: Allow
                Action: neptune-db:*
                Resource:
                  - !Sub arn:aws:neptune-db:${AWS::Region}:${AWS::AccountId}:${NeptuneClusterResourceId}/*
              - Sid: LogGroupAccess
                Effect: Allow
                Action:
                  - logs:CreateLogGroup
                  - logs:CreateLogStream
                  - logs:PutLogEvents
                Resource:
                  - !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/sagemaker/*
              - Sid: SageMakerNotebookAccess
                Effect: Allow
                Action: sagemaker:DescribeNotebookInstance
                Resource:
                  - !Sub arn:aws:sagemaker:${AWS::Region}:${AWS::AccountId}:notebook-instance/*

  # SageMaker Notebook Instance用のセキュリティグループ
  SageMakerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for SageMaker Notebook
      VpcId: !Ref VpcId
      SecurityGroupEgress:
        - IpProtocol: -1
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: !Sub ${NotebookInstanceName}-sg

  # ライフサイクル設定(Neptune接続用のセットアップ)
  NotebookLifecycleConfig:
    Type: AWS::SageMaker::NotebookInstanceLifecycleConfig
    Properties:
      NotebookInstanceLifecycleConfigName: !Sub ${NotebookInstanceName}-lifecycle
      OnStart:
        - Content:
            Fn::Base64: !Sub |
              #!/bin/bash

              sudo -u ec2-user -i <<'EOF'

              echo "export GRAPH_NOTEBOOK_AUTH_MODE=DEFAULT" >> ~/.bashrc
              echo "export GRAPH_NOTEBOOK_SSL=True" >> ~/.bashrc
              echo "export GRAPH_NOTEBOOK_SERVICE=neptune-db" >> ~/.bashrc
              echo "export GRAPH_NOTEBOOK_HOST=${NeptuneClusterEndpoint}" >> ~/.bashrc
              echo "export GRAPH_NOTEBOOK_PORT=8182" >> ~/.bashrc
              echo "export NEPTUNE_LOAD_FROM_S3_ROLE_ARN=" >> ~/.bashrc
              echo "export AWS_REGION=${AWS::Region}" >> ~/.bashrc

              aws s3 cp s3://aws-neptune-notebook-${AWS::Region}/graph_notebook.tar.gz /tmp/graph_notebook.tar.gz
              rm -rf /tmp/graph_notebook
              tar -zxvf /tmp/graph_notebook.tar.gz -C /tmp
              chmod +x /tmp/graph_notebook/install_jl4x.sh
              /tmp/graph_notebook/install_jl4x.sh

              EOF

  # SageMaker Notebook Instance
  SageMakerNotebookInstance:
    Type: AWS::SageMaker::NotebookInstance
    Properties:
      NotebookInstanceName: !Ref NotebookInstanceName
      InstanceType: !Ref InstanceType
      RoleArn: !GetAtt SageMakerExecutionRole.Arn
      SubnetId: !Ref SubnetId
      SecurityGroupIds:
        - !Ref SageMakerSecurityGroup
      DirectInternetAccess: Enabled
      LifecycleConfigName: !GetAtt NotebookLifecycleConfig.NotebookInstanceLifecycleConfigName
      Tags:
        - Key: Name
          Value: !Ref NotebookInstanceName

Outputs:
  NotebookInstanceArn:
    Description: ARN of the SageMaker Notebook instance
    Value: !Ref SageMakerNotebookInstance

  NotebookInstanceName:
    Description: Name of the SageMaker Notebook instance
    Value: !Ref NotebookInstanceName

  SageMakerSecurityGroupId:
    Description: Security Group ID of the SageMaker Notebook
    Value: !Ref SageMakerSecurityGroup

パラメーターについて

デプロイ時に設定するパラメーターは以下の通りです。

  • VpcId
    • NeptuneクラスターがデプロイされているVPCのIDを指定する。
  • SubnetId
    • SageMakerノートブックインスタンスを配置するサブネットのIDを指定する。
  • NeptuneClusterEndpoint
    • Neptuneクラスターのクラスターエンドポイントを指定する。
  • NeptuneClusterResourceId
    • NeptuneクラスターのリソースIDを指定する。
  • InstanceType
    • 作成されるSageMakerノートブックインスタンスのインスタンスタイプを指定する。
  • NotebookInstanceName
    • 作成されるSageMakerノートブックインスタンスの名前を指定する。

なお、 NeptuneClusterResourceId については、AWSマネジメントコンソール上でNeptuneクラスターの『設定』から確認できます。

20251126_nep_01

ノートブックのライフサイクル設定について

ノートブックのライフサイクル設定は以下のようにしています。

Fn::Base64: !Sub |
  #!/bin/bash

  sudo -u ec2-user -i <<'EOF'

  echo "export GRAPH_NOTEBOOK_AUTH_MODE=DEFAULT" >> ~/.bashrc
  echo "export GRAPH_NOTEBOOK_SSL=True" >> ~/.bashrc
  echo "export GRAPH_NOTEBOOK_SERVICE=neptune-db" >> ~/.bashrc
  echo "export GRAPH_NOTEBOOK_HOST=${NeptuneClusterEndpoint}" >> ~/.bashrc
  echo "export GRAPH_NOTEBOOK_PORT=8182" >> ~/.bashrc
  echo "export NEPTUNE_LOAD_FROM_S3_ROLE_ARN=" >> ~/.bashrc
  echo "export AWS_REGION=${AWS::Region}" >> ~/.bashrc

  aws s3 cp s3://aws-neptune-notebook-${AWS::Region}/graph_notebook.tar.gz /tmp/graph_notebook.tar.gz
  rm -rf /tmp/graph_notebook
  tar -zxvf /tmp/graph_notebook.tar.gz -C /tmp
  chmod +x /tmp/graph_notebook/install_jl4x.sh
  /tmp/graph_notebook/install_jl4x.sh

  EOF

上記でNeptuneに接続するための接続設定と、Jupyter NotebookでグラフDBを扱うためのPythonパッケージであるgraph-notebookを準備するようにしています。

なお、graph-notebookは以下ドキュメント記載の通りAWSがS3バケットに公開しているため、そちらから取得しています。

https://docs.aws.amazon.com/neptune/latest/userguide/graph-notebooks.html

デプロイ

CloudFormationのテンプレートファイルが用意できたら、デプロイを行います。

パラメータは先程記載した内容を埋めます。

20251126_nep_02

デプロイが完了すると、以下の4つのリソースが作成されているかと思います。

20251126_nep_03

【補足】接続先のAmazon Neptuneのセキュリティグループについては、別途当該インスタンスからのインバウンドアクセスを許可する設定がされている必要があります。

確認

デプロイができたらインスタンスのページにアクセスし、『Jupyterを開く』からJupyter Notebookを開きます。

20251126_nep_04

新規作成したノートブックで適当にクエリを実行し、結果が返ってくれば接続が成功しています。

20251126_nep_05

最後に

今回は、Amazon Neptuneに接続するAmazon SagemakerノートブックインスタンスをCloudFormationで作成してみました。

参考になりましたら幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事