Amazon Neptuneに接続するAmazon SagemakerノートブックインスタンスをCloudFormationで作成する
データ事業本部のueharaです。
今回は、Amazon Neptuneに接続するAmazon SagemakerノートブックインスタンスをCloudFormationで作成してみたいと思います。
CloudFormationテンプレートの作成
以下の通り、CloudFormationテンプレートを作成します。
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クラスターの『設定』から確認できます。

ノートブックのライフサイクル設定について
ノートブックのライフサイクル設定は以下のようにしています。
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バケットに公開しているため、そちらから取得しています。
デプロイ
CloudFormationのテンプレートファイルが用意できたら、デプロイを行います。
パラメータは先程記載した内容を埋めます。

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

【補足】接続先のAmazon Neptuneのセキュリティグループについては、別途当該インスタンスからのインバウンドアクセスを許可する設定がされている必要があります。
確認
デプロイができたらインスタンスのページにアクセスし、『Jupyterを開く』からJupyter Notebookを開きます。

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

最後に
今回は、Amazon Neptuneに接続するAmazon SagemakerノートブックインスタンスをCloudFormationで作成してみました。
参考になりましたら幸いです。







