第 3 阶段:迁移数据 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

第 3 阶段:迁移数据

Studio Classic 和 Studio 使用两种不同类型的存储卷。Studio Classic 使用单个亚马逊弹性文件系统(Amazon EFS)卷来存储域中所有用户和共享空间的数据。在 Studio 中,每个空间都有自己的亚马逊 Elastic Block Store (Amazon EBS) 存储量。当您更新现有域的默认体验时, SageMaker 不会自动在这两种类型的卷之间传输数据。因此,存储在 Amazon EBS 或 Amazon EFS 卷中的用户数据将保留在该卷中。如果在 Studio Classic 中拥有数据的用户在默认体验更改后访问 Studio,则根据 Code-OSS、Visual Studio Code-开源应用程序,他们不会自动在 JupyterLab 或代码编辑器中看到自己的数据。

如果用户需要在 Studio 应用程序中访问 Studio Classic 中的文件,则必须将文件从用户主目录传输到与这些空间关联的 Amazon EBS 卷。

将用户的数据、代码和构件从 Studio Classic 迁移到 Studio 时,我们建议采用以下方法之一:

  1. 使用自定义 Amazon EFS 卷

  2. 使用亚马逊简单存储服务 (Amazon S3) Simple Service

先决条件

在运行这些步骤之前,请完成中的先决条件先决条件。您还必须完成中的步骤第 1 阶段:将用户界面从 Studio Classic 迁移到

选择方法

在选择迁移数据的方法时,请考虑以下几点。

使用自定义 Amazon EFS 卷的优缺点

在这种方法中,您可以使用 Amazon EFS 到 Amazon Amazon DataSync EFS 任务(一次或节奏)来复制数据,然后将目标 Amazon EFS 卷挂载到用户的空间。这使用户可以在自己的 Studio 计算环境中访问来自 Studio Classic 的数据。

优点:

  • 只有用户的主目录数据在用户的空间中可见。没有数据异花授粉。

  • 从源 Amazon EFS 卷同步到目标 Amazon EFS 卷比直接 SageMaker 将由管理的源 Amazon EFS 卷安装到空间更安全。这样可以避免影响主目录用户文件的可能性。

  • 用户可以灵活地继续在 Studio Classic 和 Studio 应用程序中工作,同时如果按常规节奏进行设置, Amazon DataSync 则两个应用程序中的数据都可用。

  • 使用 Amazon S3 无需重复推拉。

缺点:

  • 没有对挂载到用户空间的目标 Amazon EFS 卷的写入权限。要获得对目标 Amazon EFS 卷的写入权限,客户需要将目标 Amazon EFS 卷挂载到亚马逊弹性计算云实例,并为用户提供写入 Amazon EFS 前缀的相应权限。

  • 需要修改由管理的安全组 SageMaker 以允许网络文件系统 (NFS) 的入站和出站流动。

  • 成本比使用亚马逊 S3 高。

使用 Amazon S3 的优缺点

在这种方法中,您可以使用 Amazon EFS 到 Amazon S3 Amazon DataSync 任务(一次或节奏)来复制数据,然后创建生命周期配置,将用户的数据从 Amazon S3 复制到其私有空间的 Amazon EBS 卷。

优点:

  • 如果 LCC 已连接到域,则用户可以选择使用 LCC 将数据复制到其空间,或者在不使用 LCC 脚本的情况下运行空间。这使用户可以选择仅将文件复制到他们需要的空间。

  • 如果按节奏设置 Amazon DataSync 任务,则用户可以重新启动他们的 Studio 应用程序以获取最新的文件。

  • 由于数据已复制到 Amazon EBS,因此用户对文件具有写入权限。

  • 亚马逊 S3 存储比亚马逊 EFS 便宜。

缺点:

  • 如果管理员需要防止异花授粉,他们必须在用户级别创建 Amazon Identity and Access Management 策略,确保用户只能访问包含其文件的 Amazon S3 前缀。

在这种方法中,您可以使用 Amazon EFS 到 Amazon E Amazon DataSync FS 将 Studio Classic Amazon EFS 卷的内容一次性复制到目标 Amazon EFS 卷,然后将目标 Amazon EFS 卷挂载到用户的空间。这使用户可以在自己的 Studio 计算环境中访问来自 Studio Classic 的数据。

  1. 创建目标 Amazon EFS 卷。您将数据传输到此 Amazon EFS 卷,并使用前缀级挂载将其挂载到相应的用户空间。

    export SOURCE_DOMAIN_ID="domain-id" export REGION="region" export TARGET_EFS=$(aws efs create-file-system --performance-mode generalPurpose --throughput-mode bursting --encrypted --region $REGION | jq -r '.FileSystemId') echo "Target EFS volume Created: $TARGET_EFS"
  2. 为当前连接到该域并供所有用户使用的源 Amazon EFS 卷添加变量。需要域名的 Amazon Virtual Private Cloud 信息才能确保目标 Amazon EFS 是在相同的 Amazon VPC 和子网中创建的,并且具有相同的安全组配置。

    export SOURCE_EFS=$(aws sagemaker describe-domain --domain-id $SOURCE_DOMAIN_ID | jq -r '.HomeEfsFileSystemId') export VPC_ID=$(aws sagemaker describe-domain --domain-id $SOURCE_DOMAIN_ID | jq -r '.VpcId') echo "EFS managed by SageMaker: $SOURCE_EFS | VPC: $VPC_ID"
  3. 使用相同的安全组配置,在与源 Amazon EFS 卷相同的 Amazon VPC 和子网中创建 Amazon EFS 挂载目标。挂载目标需要几分钟才可用。

    export EFS_VPC_ID=$(aws efs describe-mount-targets --file-system-id $SOURCE_EFS | jq -r ".MountTargets[0].VpcId") export EFS_AZ_NAME=$(aws efs describe-mount-targets --file-system-id $SOURCE_EFS | jq -r ".MountTargets[0].AvailabilityZoneName") export EFS_AZ_ID=$(aws efs describe-mount-targets --file-system-id $SOURCE_EFS | jq -r ".MountTargets[0].AvailabilityZoneId") export EFS_SUBNET_ID=$(aws efs describe-mount-targets --file-system-id $SOURCE_EFS | jq -r ".MountTargets[0].SubnetId") export EFS_MOUNT_TARG_ID=$(aws efs describe-mount-targets --file-system-id $SOURCE_EFS | jq -r ".MountTargets[0].MountTargetId") export EFS_SG_IDS=$(aws efs describe-mount-target-security-groups --mount-target-id $EFS_MOUNT_TARG_ID | jq -r '.SecurityGroups[]') aws efs create-mount-target \ --file-system-id $TARGET_EFS \ --subnet-id $EFS_SUBNET_ID \ --security-groups $EFS_SG_IDS
  4. 为 Amazon DataSync 任务创建 Amazon EFS 源位置和目标位置。

    export SOURCE_EFS_ARN=$(aws efs describe-file-systems --file-system-id $SOURCE_EFS | jq -r ".FileSystems[0].FileSystemArn") export TARGET_EFS_ARN=$(aws efs describe-file-systems --file-system-id $TARGET_EFS | jq -r ".FileSystems[0].FileSystemArn") export EFS_SUBNET_ID_ARN=$(aws ec2 describe-subnets --subnet-ids $EFS_SUBNET_ID | jq -r ".Subnets[0].SubnetArn") export ACCOUNT_ID=$(aws ec2 describe-security-groups --group-id $EFS_SG_IDS | jq -r ".SecurityGroups[0].OwnerId") export EFS_SG_ID_ARN=arn:aws:ec2:$REGION:$ACCOUNT_ID:security-group/$EFS_SG_IDS export SOURCE_LOCATION_ARN=$(aws datasync create-location-efs --subdirectory "/" --efs-filesystem-arn $SOURCE_EFS_ARN --ec2-config SubnetArn=$EFS_SUBNET_ID_ARN,SecurityGroupArns=$EFS_SG_ID_ARN --region $REGION | jq -r ".LocationArn") export DESTINATION_LOCATION_ARN=$(aws datasync create-location-efs --subdirectory "/" --efs-filesystem-arn $TARGET_EFS_ARN --ec2-config SubnetArn=$EFS_SUBNET_ID_ARN,SecurityGroupArns=$EFS_SG_ID_ARN --region $REGION | jq -r ".LocationArn")
  5. 允许源网络文件系统和目标网络文件系统 (NFS) 挂载之间的流量。创建新域时, SageMaker 会创建 2 个安全组。

    • 仅包含入站流量的 NFS 入站安全组。

    • 仅包含出站流量的 NFS 出站安全组。

    源和目标 NFS 位于同一个安全组中。您可以允许来自 Amazon Web Services Management Console 或 Amazon CLI的这些坐骑之间的流量。

    • 允许来自的流量 Amazon Web Services Management Console

      1. 登录 Amazon Web Services Management Console 并打开亚马逊 VPC 控制台,网址为 https://console.aws.amazon.com/vpc/

      2. 选择 Security Groups

      3. 在 “安全组” 页面上搜索现有域的 ID。

        d-xxxxxxx

        结果应返回两个名称中包含域 ID 的安全组。

        • security-group-for-inbound-nfs-domain-id

        • security-group-for-outbound-nfs-domain-id

      4. 选择入站安全组 ID。这将打开一个包含有关安全组详细信息的新页面。

      5. 选择 “出站规则” 选项卡。

      6. 选择编辑出站规则

      7. 更新现有出站规则或使用以下值添加新的出站规则:

        • Type (类型):NFS

        • 协议:TCP

        • 端口范围:2049

        • 目的地: security-group-for-outbound-nfs-域名 ID | security-group-id

      8. 选择保存规则

      9. 选择 “入站规则” 选项卡。

      10. 选择编辑入站规则

      11. 更新现有入站规则或使用以下值添加新的出站规则:

        • Type (类型):NFS

        • 协议:TCP

        • 端口范围:2049

        • 目的地: security-group-for-outbound-nfs-域名 ID | security-group-id

      12. 选择保存规则

    • 允许来自的流量 Amazon CLI

      1. 使用以下值更新安全组入站和出站规则:

        • 协议:TCP

        • 端口范围:2049

        • 组 ID:入站安全组 ID 或出站安全组 ID

        export INBOUND_SG_ID=$(aws ec2 describe-security-groups --filters "Name=group-name,Values=security-group-for-inbound-nfs-$SOURCE_DOMAIN_ID" | jq -r ".SecurityGroups[0].GroupId") export OUTBOUND_SG_ID=$(aws ec2 describe-security-groups --filters "Name=group-name,Values=security-group-for-outbound-nfs-$SOURCE_DOMAIN_ID" | jq -r ".SecurityGroups[0].GroupId") echo "Outbound SG ID: $OUTBOUND_SG_ID | Inbound SG ID: $INBOUND_SG_ID" aws ec2 authorize-security-group-egress \ --group-id $INBOUND_SG_ID \ --protocol tcp --port 2049 \ --source-group $OUTBOUND_SG_ID aws ec2 authorize-security-group-ingress \ --group-id $OUTBOUND_SG_ID \ --protocol tcp --port 2049 \ --source-group $INBOUND_SG_ID
      2. 将入站和出站安全组添加到源和目标 Amazon EFS 挂载目标。这允许在 2 个 Amazon EFS 挂载之间进行流量。

        export SOURCE_EFS_MOUNT_TARGET=$(aws efs describe-mount-targets --file-system-id $SOURCE_EFS | jq -r ".MountTargets[0].MountTargetId") export TARGET_EFS_MOUNT_TARGET=$(aws efs describe-mount-targets --file-system-id $TARGET_EFS | jq -r ".MountTargets[0].MountTargetId") aws efs modify-mount-target-security-groups \ --mount-target-id $SOURCE_EFS_MOUNT_TARGET \ --security-groups $INBOUND_SG_ID $OUTBOUND_SG_ID aws efs modify-mount-target-security-groups \ --mount-target-id $TARGET_EFS_MOUNT_TARGET \ --security-groups $INBOUND_SG_ID $OUTBOUND_SG_ID
  6. 创建 Amazon DataSync 任务。这将返回一个任务 ARN,该任务可用于按需运行任务或作为常规节奏的一部分运行。

    export EXTRA_XFER_OPTIONS='VerifyMode=ONLY_FILES_TRANSFERRED,OverwriteMode=ALWAYS,Atime=NONE,Mtime=NONE,Uid=NONE,Gid=NONE,PreserveDeletedFiles=REMOVE,PreserveDevices=NONE,PosixPermissions=NONE,TaskQueueing=ENABLED,TransferMode=CHANGED,SecurityDescriptorCopyFlags=NONE,ObjectTags=NONE' export DATASYNC_TASK_ARN=$(aws datasync create-task --source-location-arn $SOURCE_LOCATION_ARN --destination-location-arn $DESTINATION_LOCATION_ARN --name "SMEFS_to_CustomEFS_Sync" --region $REGION --options $EXTRA_XFER_OPTIONS | jq -r ".TaskArn")
  7. 启动一项 Amazon DataSync 任务,自动将数据从源 Amazon EFS 复制到目标 Amazon EFS 挂载。这不会保留文件的 POSIX 权限,这允许用户从目标 Amazon EFS 挂载中读取数据,但不能写入该挂载。

    aws datasync start-task-execution --task-arn $DATASYNC_TASK_ARN
  8. 在根级别将目标 Amazon EFS 卷挂载到域上。

    aws sagemaker update-domain --domain-id $SOURCE_DOMAIN_ID \ --default-user-settings '{"CustomFileSystemConfigs": [{"EFSFileSystemConfig": {"FileSystemId": "'"$TARGET_EFS"'", "FileSystemPath": "/"}}]}'
  9. 使用FileSystemPath前缀覆盖每个用户配置文件。前缀包括用户的 UID,该用户由创建。 SageMaker这样可以确保用户只能访问其数据,并防止异花授粉。在域中创建空间并将目标 Amazon EFS 卷挂载到应用程序时,用户的前缀会覆盖域前缀。因此, SageMaker 只能将/user-id目录挂载到用户的应用程序上。

    aws sagemaker list-user-profiles --domain-id $SOURCE_DOMAIN_ID | jq -r '.UserProfiles[] | "\(.UserProfileName)"' | while read user; do export uid=$(aws sagemaker describe-user-profile --domain-id $SOURCE_DOMAIN_ID --user-profile-name $user | jq -r ".HomeEfsFileSystemUid") echo "$user $uid" aws sagemaker update-user-profile --domain-id $SOURCE_DOMAIN_ID --user-profile-name $user --user-settings '{"CustomFileSystemConfigs": [{"EFSFileSystemConfig":{"FileSystemId": "'"$TARGET_EFS"'", "FileSystemPath": "'"/$uid/"'"}}]}' done
  10. 然后,用户可以在启动应用程序时选择自定义 Amazon EFS 文件系统。有关更多信息,请参阅JupyterLab 用户指南在 Studio 中启动代码编辑器应用程序

在这种方法中,您可以使用 Amazon EFS 到 Amazon S3 Amazon DataSync 任务,将 Studio Classic Amazon EFS 卷的内容一次性或定期复制到 Amazon S3 存储桶,然后创建生命周期配置,将用户的数据从 Amazon S3 复制到其私有空间的 Amazon EBS 卷中。

注意

这种方法仅适用于可以访问互联网的域名。

  1. 从包含您要迁移的数据的域中设置源 Amazon EFS 卷 ID。

    timestamp=$(date +%Y%m%d%H%M%S) export SOURCE_DOMAIN_ID="domain-id" export REGION="region" export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) export EFS_ID=$(aws sagemaker describe-domain --domain-id $SOURCE_DOMAIN_ID | jq -r '.HomeEfsFileSystemId')
  2. 设置目标 Amazon S3 存储桶名称。有关创建 Amazon S3 存储桶的信息,请参阅创建存储桶。使用的存储桶必须具有 CORS 策略,如中所述。更新您的 CORS 政策以访问亚马逊 S3 存储桶该域中的用户还必须拥有访问 Amazon S3 存储桶的权限。

    在此示例中,我们将文件复制到名为的前缀studio-new。如果您使用单个 Amazon S3 存储桶迁移多个域,请使用studio-new/<domain-id>前缀通过 IAM 限制对文件的权限。

    export BUCKET_NAME=s3-bucket-name export S3_DESTINATION_PATH=studio-new
  3. 创建信任策略, Amazon DataSync 授予担任账户执行角色的权限。

    export TRUST_POLICY=$(cat <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "datasync.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "$ACCOUNT_ID" }, "ArnLike": { "aws:SourceArn": "arn:aws:datasync:$REGION:$ACCOUNT_ID:*" } } } ] } EOF )
  4. 创建 IAM 角色并附加信任策略。

    export timestamp=$(date +%Y%m%d%H%M%S) export ROLE_NAME="DataSyncS3Role-$timestamp" aws iam create-role --role-name $ROLE_NAME --assume-role-policy-document "$TRUST_POLICY" aws iam attach-role-policy --role-name $ROLE_NAME --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess echo "Attached IAM Policy AmazonS3FullAccess" aws iam attach-role-policy --role-name $ROLE_NAME --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess echo "Attached IAM Policy AmazonSageMakerFullAccess" export ROLE_ARN=$(aws iam get-role --role-name $ROLE_NAME --query 'Role.Arn' --output text) echo "Created IAM Role $ROLE_ARN"
  5. 创建一个安全组以授予对 Amazon EFS 位置的访问权限。

    export EFS_ARN=$(aws efs describe-file-systems --file-system-id $EFS_ID | jq -r '.FileSystems[0].FileSystemArn' ) export EFS_SUBNET_ID=$(aws efs describe-mount-targets --file-system-id $EFS_ID | jq -r '.MountTargets[0].SubnetId') export EFS_VPC_ID=$(aws efs describe-mount-targets --file-system-id $EFS_ID | jq -r '.MountTargets[0].VpcId') export MOUNT_TARGET_ID=$(aws efs describe-mount-targets --file-system-id $EFS_ID | jq -r '.MountTargets[0].MountTargetId ') export EFS_SECURITY_GROUP_ID=$(aws efs describe-mount-target-security-groups --mount-target-id $MOUNT_TARGET_ID | jq -r '.SecurityGroups[0]') export EFS_SUBNET_ARN=$(aws ec2 describe-subnets --subnet-ids $EFS_SUBNET_ID | jq -r '.Subnets[0].SubnetArn') echo "Subnet ID: $EFS_SUBNET_ID" echo "Security Group ID: $EFS_SECURITY_GROUP_ID" echo "Subnet ARN: $EFS_SUBNET_ARN" timestamp=$(date +%Y%m%d%H%M%S) sg_name="datasync-sg-$timestamp" export DATASYNC_SG_ID=$(aws ec2 create-security-group --vpc-id $EFS_VPC_ID --group-name $sg_name --description "DataSync SG" --output text --query 'GroupId') aws ec2 authorize-security-group-egress --group-id $DATASYNC_SG_ID --protocol tcp --port 2049 --source-group $EFS_SECURITY_GROUP_ID aws ec2 authorize-security-group-ingress --group-id $EFS_SECURITY_GROUP_ID --protocol tcp --port 2049 --source-group $DATASYNC_SG_ID export DATASYNC_SG_ARN="arn:aws:ec2:$REGION:$ACCOUNT_ID:security-group/$DATASYNC_SG_ID" echo "Security Group ARN: $DATASYNC_SG_ARN"
  6. 为 Amazon DataSync 任务创建源 Amazon EFS 位置。

    export SOURCE_ARN=$(aws datasync create-location-efs --efs-filesystem-arn $EFS_ARN --ec2-config "{\"SubnetArn\": \"$EFS_SUBNET_ARN\", \"SecurityGroupArns\": [\"$DATASYNC_SG_ARN\"]}" | jq -r '.LocationArn') echo "Source Location ARN: $SOURCE_ARN"
  7. 为 Amazon DataSync 任务创建目标 Amazon S3 地点。

    export BUCKET_ARN="arn:aws:s3:::$BUCKET_NAME" export DESTINATION_ARN=$(aws datasync create-location-s3 --s3-bucket-arn $BUCKET_ARN --s3-config "{\"BucketAccessRoleArn\": \"$ROLE_ARN\"}" --subdirectory $S3_DESTINATION_PATH | jq -r '.LocationArn') echo "Destination Location ARN: $DESTINATION_ARN"
  8. 创建 Amazon DataSync 任务。

    export TASK_ARN=$(aws datasync create-task --source-location-arn $SOURCE_ARN --destination-location-arn $DESTINATION_ARN | jq -r '.TaskArn') echo "DataSync Task: $TASK_ARN"
  9. 启动 Amazon DataSync 任务。此任务会自动将数据从源 Amazon EFS 卷复制到目标 Amazon S3 存储桶。等待任务完成。

    aws datasync start-task-execution --task-arn $TASK_ARN
  10. 检查 Amazon DataSync 任务的状态以验证其是否已完成。传递上一步返回的 ARN。

    export TASK_EXEC_ARN=datasync-task-arn echo "Task execution ARN: $TASK_EXEC_ARN" export STATUS=$(aws datasync describe-task-execution --task-execution-arn $TASK_EXEC_ARN | jq -r '.Status') echo "Execution status: $STATUS" while [ "$STATUS" = "QUEUED" ] || [ "$STATUS" = "LAUNCHING" ] || [ "$STATUS" = "PREPARING" ] || [ "$STATUS" = "TRANSFERRING" ] || [ "$STATUS" = "VERIFYING" ]; do STATUS=$(aws datasync describe-task-execution --task-execution-arn $TASK_EXEC_ARN | jq -r '.Status') if [ $? -ne 0 ]; then echo "Error Running DataSync Task" exit 1 fi echo "Execution status: $STATUS" sleep 30 done
  11. Amazon DataSync 任务完成后,清理先前创建的资源。

    aws datasync delete-task --task-arn $TASK_ARN echo "Deleted task $TASK_ARN" aws datasync delete-location --location-arn $SOURCE_ARN echo "Deleted location source $SOURCE_ARN" aws datasync delete-location --location-arn $DESTINATION_ARN echo "Deleted location source $DESTINATION_ARN" aws iam detach-role-policy --role-name $ROLE_NAME --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess aws iam detach-role-policy --role-name $ROLE_NAME --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess aws iam delete-role --role-name $ROLE_NAME echo "Deleted IAM Role $ROLE_NAME" echo "Wait 5 minutes for the elastic network interface to detach..." start_time=$(date +%s) while [[ $(($(date +%s) - start_time)) -lt 300 ]]; do sleep 1 done aws ec2 revoke-security-group-ingress --group-id $EFS_SECURITY_GROUP_ID --protocol tcp --port 2049 --source-group $DATASYNC_SG_ID echo "Revoked Ingress from $EFS_SECURITY_GROUP_ID" aws ec2 revoke-security-group-egress --group-id $DATASYNC_SG_ID --protocol tcp --port 2049 --source-group $EFS_SECURITY_GROUP_ID echo "Revoked Egress from $DATASYNC_SG_ID" aws ec2 delete-security-group --group-id $DATASYNC_SG_ID echo "Deleted DataSync SG $DATASYNC_SG_ID"
  12. 在本地计算机上,创建一个名为 on-start.sh 的文件,内容如下。此脚本将用户在 Amazon S3 中的 Amazon EFS 主目录复制到 Studio 中用户的 Amazon EBS 卷,并为每个用户配置文件创建一个前缀。

    #!/bin/bash set -eo pipefail sudo apt-get install -y jq # Studio Variables DOMAIN_ID=$(cat /opt/ml/metadata/resource-metadata.json | jq -r '.DomainId') SPACE_NAME=$(cat /opt/ml/metadata/resource-metadata.json | jq -r '.SpaceName') USER_PROFILE_NAME=$(aws sagemaker describe-space --domain-id=$DOMAIN_ID --space-name=$SPACE_NAME | jq -r '.OwnershipSettings.OwnerUserProfileName') # S3 bucket to copy from BUCKET=s3-bucket-name # Subfolder in bucket to copy PREFIX=studio-new # Getting HomeEfsFileSystemUid for the current user-profile EFS_FOLDER_ID=$(aws sagemaker describe-user-profile --domain-id $DOMAIN_ID --user-profile-name $USER_PROFILE_NAME | jq -r '.HomeEfsFileSystemUid') # Local destination directory DEST=./studio-classic-efs-backup mkdir -p $DEST echo "Bucket: s3://$BUCKET/$PREFIX/$EFS_FOLDER_ID/" echo "Destination $DEST/" echo "Excluding .*" echo "Excluding .*/*" aws s3 cp s3://$BUCKET/$PREFIX/$EFS_FOLDER_ID/ $DEST/ \ --exclude ".*" \ --exclude "**/.*" \ --recursive
  13. 将您的脚本转换为 base64 格式。此要求可防止因空格和换行编码而出现错误。脚本类型可以是JupyterLabCodeEditor

    export LCC_SCRIPT_NAME='studio-classic-sync' export SCRIPT_FILE_NAME='on-start.sh' export SCRIPT_TYPE='JupyterLab-or-CodeEditor' LCC_CONTENT=`openssl base64 -A -in ${SCRIPT_FILE_NAME}`
  14. 在使用脚本之前,请验证以下内容:

    • Amazon EBS 的容量足够大,足以存储您要导出的对象。

    • 如果您不打算迁移隐藏的文件和文件夹,.condarc则不会迁移隐藏文件.bashrc和文件夹。

    • 与 Studio 用户配置文件关联的 Amazon Identity and Access Management (IAM) 执行角色的策略配置为仅访问 Amazon S3 中相应的主目录。

  15. 使用您的脚本创建生命周期配置。

    aws sagemaker create-studio-lifecycle-config \ --studio-lifecycle-config-name $LCC_SCRIPT_NAME \ --studio-lifecycle-config-content $LCC_CONTENT \ --studio-lifecycle-config-app-type $SCRIPT_TYPE
  16. 将 LCC 附加到您的域中。

    aws sagemaker update-domain \ --domain-id $SOURCE_DOMAIN_ID \ --default-user-settings ' {"JupyterLabAppSettings": {"LifecycleConfigArns": [ "lifecycle-config-arn" ] } }'
  17. 然后,用户可以在启动应用程序时选择 LCC 脚本。有关更多信息,请参阅JupyterLab 用户指南在 Studio 中启动代码编辑器应用程序。这会自动将文件从 Amazon S3 同步到 Amazon EBS 存储空间以供用户使用。