additional-databases/sagemaker/neptune-notebook-cloudformation/neptune-workbench-stack.yaml (255 lines of code) (raw):

AWSTemplateFormatVersion: '2010-09-09' Description: A template to deploy Neptune Notebooks using CloudFormation resources. Parameters: NotebookInstanceType: Description: The notebook instance type. Type: String Default: ml.t2.medium AllowedValues: - ml.t2.medium - ml.t2.large - ml.t2.xlarge - ml.t2.2xlarge - ml.t3.2xlarge - ml.t3.large - ml.t3.medium - ml.t3.xlarge - ml.m4.xlarge - ml.m4.2xlarge - ml.m4.4xlarge - ml.m4.10xlarge - ml.m4.16xlarge - ml.m5.12xlarge - ml.m5.24xlarge - ml.m5.2xlarge - ml.m5.4xlarge - ml.m5.xlarge - ml.p2.16xlarge - ml.p2.8xlarge - ml.p2.xlarge - ml.p3.16xlarge - ml.p3.2xlarge - ml.p3.8xlarge - ml.c4.2xlarge - ml.c4.4xlarge - ml.c4.8xlarge - ml.c4.xlarge - ml.c5.18xlarge - ml.c5.2xlarge - ml.c5.4xlarge - ml.c5.9xlarge - ml.c5.xlarge - ml.c5d.18xlarge - ml.c5d.2xlarge - ml.c5d.4xlarge - ml.c5d.9xlarge - ml.c5d.xlarge ConstraintDescription: Must be a valid SageMaker instance type. NeptuneClusterEndpoint: Description: The cluster endpoint of an existing Neptune cluster. Type: String NeptuneClusterResourceId: Description: The resource ID of the existing Neptune cluster. Type: String NeptuneClusterPort: Description: 'OPTIONAL: The Port of the existing Neptune cluster (default 8182).' Type: String Default: '8182' NeptuneClusterAuthMode: Description: The IAM authentication setting on the existing Neptune cluster. Type: String Default: 'DEFAULT' AllowedValues: - 'IAM' - 'DEFAULT' NeptuneClusterLoadFromS3Arn: Description: 'OPTIONAL: The ARN of the S3 bucket to load data from.' Type: String Default: '' NeptuneClusterSecurityGroups: Description: The VPC security group IDs. The security groups must be for the same VPC as specified in the subnet. Type: List<AWS::EC2::SecurityGroup::Id> NeptuneClusterSubnetId: Description: The ID of the subnet in a VPC to which you would like to have connectivity from your ML compute instance. Type: AWS::EC2::Subnet::Id SageMakerNotebookRoleArn: Description: 'OPTIONAL: The ARN for the IAM role that the notebook instance will assume. If not provided, a role will be automatically created, based on the cluster information.' Type: String Default: '' SageMakerNotebookName: Description: The name of the Neptune notebook. Type: String EncryptionKey: Description: 'OPTIONAL: The ARN of a KMS key to encrypt your notebook data with.' Type: String Default: '' Conditions: UseSageMakerNotebookAutoRole: Fn::Equals: - !Ref SageMakerNotebookRoleArn - "" UseEncryptionKey: Fn::Not: - Fn::Equals: - Ref: EncryptionKey - "" Mappings: RegionMap: cn-north-1: "bucket": "aws-neptune-notebook-cn-north-1" cn-northwest-1: "bucket": "aws-neptune-notebook-cn-northwest-1" us-east-2: "bucket": "aws-neptune-notebook-us-east-2" us-east-1: "bucket": "aws-neptune-notebook-us-east-1" us-west-1: "bucket": "aws-neptune-notebook-us-west-1" us-west-2: "bucket": "aws-neptune-notebook-us-west-2" ap-south-1: "bucket": "aws-neptune-notebook-ap-south-1" ap-northeast-2: "bucket": "aws-neptune-notebook-ap-northeast-2" ap-southeast-1: "bucket": "aws-neptune-notebook-ap-southeast-1" ap-southeast-2: "bucket": "aws-neptune-notebook-ap-southeast-2" ap-northeast-1: "bucket": "aws-neptune-notebook-ap-northeast-1" ca-central-1: "bucket": "aws-neptune-notebook-ca-central-1" eu-central-1: "bucket": "aws-neptune-notebook-eu-central-1" eu-west-1: "bucket": "aws-neptune-notebook-eu-west-1" eu-west-2: "bucket": "aws-neptune-notebook-eu-west-2" eu-west-3: "bucket": "aws-neptune-notebook-eu-west-3" eu-north-1: "bucket": "aws-neptune-notebook-eu-north-1" sa-east-1: "bucket": "aws-neptune-notebook-sa-east-1" af-south-1: "bucket": "aws-neptune-notebook-af-south-1" ap-east-1: "bucket": "aws-neptune-notebook-ap-east-1" me-south-1: "bucket": "aws-neptune-notebook-me-south-1" me-central-1: "bucket": "aws-neptune-notebook-me-central-1" ap-south-2: "bucket": "aws-neptune-notebook-ap-south-2" il-central-1: "bucket": "aws-neptune-notebook-il-central-1" us-gov-east-1: "bucket": "aws-neptune-notebook-us-gov-east-1" us-gov-west-1: "bucket": "aws-neptune-notebook-us-gov-west-1" Resources: NeptuneNotebookInstance: Type: AWS::SageMaker::NotebookInstance Properties: NotebookInstanceName: !Join - '' - - 'aws-neptune-' - !Ref SageMakerNotebookName InstanceType: Ref: NotebookInstanceType SubnetId: Ref: NeptuneClusterSubnetId SecurityGroupIds: Ref: NeptuneClusterSecurityGroups RoleArn: Fn::If: - UseSageMakerNotebookAutoRole - Fn::GetAtt: - SageMakerNotebookAutoRole - Arn - Ref: SageMakerNotebookRoleArn LifecycleConfigName: Fn::GetAtt: - NeptuneNotebookInstanceLifecycleConfig - NotebookInstanceLifecycleConfigName Tags: - Key: aws-neptune-cluster-id Value: !Select [ 0, !Split [ ".", !Ref NeptuneClusterEndpoint ] ] - Key: aws-neptune-resource-id Value: !Ref NeptuneClusterResourceId KmsKeyId: Fn::If: - UseEncryptionKey - Ref: EncryptionKey - Ref: AWS::NoValue NeptuneNotebookInstanceLifecycleConfig: Type: AWS::SageMaker::NotebookInstanceLifecycleConfig Properties: OnStart: - Content: Fn::Base64: !Sub - |+ #!/bin/bash sudo -u ec2-user -i << 'EOF' echo 'export GRAPH_NOTEBOOK_AUTH_MODE=${NeptuneClusterAuthMode}' >> ~/.bashrc echo 'export GRAPH_NOTEBOOK_SSL=True' >> ~/.bashrc echo 'export GRAPH_NOTEBOOK_HOST=${NeptuneClusterEndpoint}' >> ~/.bashrc echo 'export GRAPH_NOTEBOOK_PORT=${NeptuneClusterPort}' >> ~/.bashrc echo "export GRAPH_NOTEBOOK_SERVICE=neptune-db" >> ~/.bashrc echo 'export NEPTUNE_LOAD_FROM_S3_ROLE_ARN=${NeptuneClusterLoadFromS3Arn}' >> ~/.bashrc echo 'export AWS_REGION=${AWS::Region}' >> ~/.bashrc aws s3 cp s3://${S3Bucket}/graph_notebook.tar.gz /tmp/graph_notebook.tar.gz rm -rf /tmp/graph_notebook tar -zxvf /tmp/graph_notebook.tar.gz -C /tmp /tmp/graph_notebook/install.sh EOF - S3Bucket: Fn::FindInMap: - RegionMap - Ref: AWS::Region - bucket SageMakerNotebookAutoRole: Type: AWS::IAM::Role Condition: UseSageMakerNotebookAutoRole Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: sagemaker.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: SageMakerNotebookPolicy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - s3:GetObject - s3:ListBucket Resource: - Fn::Sub: - "arn:${AWS::Partition}:s3:::${S3Bucket}" - S3Bucket: Fn::FindInMap: - RegionMap - Ref: AWS::Region - bucket - Fn::Sub: - "arn:${AWS::Partition}:s3:::${S3Bucket}/*" - S3Bucket: Fn::FindInMap: - RegionMap - Ref: AWS::Region - bucket - Effect: Allow Action: neptune-db:* Resource: - Fn::Sub: "arn:${AWS::Partition}:neptune-db:${AWS::Region}:${AWS::AccountId}:${NeptuneClusterResourceId}/*" - Effect: Allow Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Resource: - Fn::Sub: "arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/sagemaker/*"