

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 추가 기능 사용자 지정
<a name="customization"></a>

## 템플릿
<a name="customization-template"></a>

템플릿은 워크스페이스 생성을 위한 관리자 제어 블루프린트 역할을 하는 재사용 가능한 워크스페이스 구성입니다. 워크스페이스 구성 값에 대한 기본값과 데이터 과학자가 수행할 수 있는 작업을 제어하는 가드레일을 제공합니다. 템플릿은 클러스터 수준에서 존재하며 네임스페이스 전체에서 재사용할 수 있습니다.

SageMaker Spaces는 데이터 과학자의 출발점으로 두 개의 시스템 템플릿을 생성합니다. 하나는 코드 편집기용이고 다른 하나는 JupyterLab용입니다. 이러한 시스템 템플릿은 추가 기능으로 관리되며 직접 편집할 수 없습니다. 대신 관리자는 새 템플릿을 생성하고 기본값으로 설정할 수 있습니다.

## 작업 거버넌스
<a name="customization-governabce"></a>

```
apiVersion: workspace.jupyter.org/v1alpha1
kind: WorkspaceTemplate
metadata:
  name: my-jupyter-template
  namespace: my-namespace
  labels:
    kueue.x-k8s.io/priority-class: <user-input>-priority
spec:
  displayName: "My Custom Jupyter Lab"
  description: "Custom Jupyter Lab with specific configurations"
  defaultImage: "public.ecr.aws/sagemaker/sagemaker-distribution:latest-cpu"
  allowedImages:
    - "public.ecr.aws/sagemaker/sagemaker-distribution:latest-cpu"
    - "public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu"
  defaultResources:
    requests:
      cpu: "1"
      memory: "4Gi"
    limits:
      cpu: "4"
      memory: "16Gi"
  primaryStorage:
    defaultSize: "10Gi"
    minSize: "5Gi"
    maxSize: "50Gi"
    defaultStorageClassName: "sagemaker-spaces-default-storage-class"
    defaultMountPath: "/home/sagemaker-user"
  defaultContainerConfig:
    command: ["/opt/amazon/sagemaker/workspace/bin/entrypoint-workspace-jupyterlab"]
  defaultPodSecurityContext:
    fsGroup: 1000
  defaultOwnershipType: "Public"
  defaultAccessStrategy:
    name: "hyperpod-access-strategy"
  allowSecondaryStorages: true
  appType: "jupyterlab"
```

## SMD/사용자 지정 이미지
<a name="customization-image"></a>

고객은 기본 이미지와 허용된 이미지 목록을 제공하여 템플릿을 통해 이미지 정책을 구성할 수 있습니다. 또한 관리자는 데이터 과학자가 자신의 사용자 지정 이미지를 가져오도록 허용할지 여부를 선택할 수 있습니다. 시스템은 기본적으로 최신 SageMaker 배포를 사용하지만 특정 버전에 고정하려는 경우 템플릿에 사용할 정확한 SMD 버전을 지정할 수 있습니다.

사용자 지정 이미지 요구 사항:
+ `curl` 유휴 종료를 사용하려는 경우
+ 포트 8888
+ 원격 액세스

## 원격 IDE 요구 사항
<a name="remote-ide-requirement"></a>

### VS 코드 버전 요구 사항
<a name="remote-ide-requirement-vscode"></a>

VS Code 버전 [v1.90](https://code.visualstudio.com/updates/v1_90) 이상이 필요합니다. [최신 안정화 버전의 VS Code](https://code.visualstudio.com/updates)를 사용하는 것이 좋습니다.

### 운영 체제 요구 사항
<a name="remote-ide-requirement-operate"></a>

Studio 스페이스에 원격으로 연결하려면 다음 운영 체제 중 하나가 필요합니다.
+ macOS 13\$1
+ Windows 10
  + [Windows 10 지원은 2025년 10월 14일에 종료됨](https://support.microsoft.com/en-us/windows/windows-10-support-ends-on-october-14-2025-2ca8b313-1946-43d3-b55c-2b95b107f281)
+ Windows 11
+ Linux
+ [Linux용 공식 Microsoft VS Code](https://code.visualstudio.com/docs/setup/linux) 설치
  + 오픈 소스 버전이 아님

### 로컬 시스템 사전 조건
<a name="remote-ide-requirement-machine"></a>

로컬 Visual Studio 코드를 Studio 스페이스에 연결하기 전에 로컬 시스템에 필요한 종속성과 네트워크 액세스 권한이 있는지 확인합니다.

**참고**  
소프트웨어 설치 제한이 있는 환경에서는 사용자가 필수 종속성을 설치하지 못할 수 있습니다. AWS Toolkit for Visual Studio 코드는 원격 연결을 시작할 때 이러한 종속성을 자동으로 검색하고 누락된 항목이 있으면 설치를 요청합니다. IT 부서와 협력하여 이러한 구성 요소를 사용할 수 있는지 확인합니다.

**필수 로컬 종속성**

로컬 시스템에는 다음 구성 요소가 설치되어 있어야 합니다.
+ **[https://code.visualstudio.com/docs/remote/ssh](https://code.visualstudio.com/docs/remote/ssh)**
+ - 원격 개발을 위한 표준 VS Code Marketplace 확장
+ **[세션 관리자 플러그인](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)** - 보안 세션 관리에 필요합니다.
+ **SSH 클라이언트** - 대부분의 시스템에서 표준 구성 요소([Windows의 경우 OpenSSH 권장](https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse))
+ **[https://code.visualstudio.com/docs/configure/command-line](https://code.visualstudio.com/docs/configure/command-line)**
+  일반적으로 VS Code 설치에 포함됨

**플랫폼별 요구 사항**
+ **Windows 사용자** - SSH 터미널 연결에는 PowerShell 5.1 이상이 필요합니다.

**네트워크 연결 요구 사항**

로컬 시스템에 [Session Manager 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/ssm.html)에 대한 네트워크 액세스 권한이 있어야 합니다. 예를 들어 미국 동부(버지니아 북부)(us-east-1)에서는 다음과 같을 수 있습니다.
+ `[ssm.us-east-1.amazonaws.com](http://ssm.us-east-1.amazonaws.com)`
+ `ssm.us-east-1.api.aws`
+ `[ssmmessages.us-east-1.amazonaws.com](http://ssmmessages.us-east-1.amazonaws.com)`
+ `[ec2messages.us-east-1.amazonaws.com](http://ec2messages.us-east-1.amazonaws.com)`

### 이미지 요구 사항
<a name="remote-ide-requirement-image"></a>

**SageMaker 배포 이미지**

원격 액세스와 함께 SageMaker Distribution을 사용하는 경우 [SageMaker Distribution](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-distribution.html) 버전 2.7 이상을 사용합니다.

**사용자 지정 이미지**

원격 액세스로 [자체 이미지 가져오기(BYOI)](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-byoi.html)를 수행할 때는 [사용자 지정 이미지 사양을](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-byoi-specs.html) 따르고 다음 종속성이 설치되어 있는지 확인합니다.
+ `curl` 또는 `wget` - AWS CLI 구성 요소를 다운로드하는 데 필요합니다.
+ `unzip` - AWS CLI 설치 파일을 추출하는 데 필요합니다.
+ `tar` - 아카이브 추출에 필요합니다.
+ `gzip` - 압축 파일 처리에 필요합니다.

### 인스턴스 요구 사항
<a name="remote-ide-requirement-instance"></a>
+ **메모리** - 8GB 이상
+ 메모리가 8GB 이상인 인스턴스를 사용합니다. 메모리 부족(8GB 미만)으로 인해 `ml.t3.medium`, `ml.c7i.large`, `ml.c6i.large`, `ml.c6id.large`, `ml.c5.large` 인스턴스 유형은 지원되지 *않습니다*. 인스턴스 유형의 전체 목록은 [Amazon EC2 온디맨드 요금 페이지를](https://aws.amazon.com/ec2/pricing/on-demand/) 참조하세요.

## 컨테이너 이미지 사전 워밍을 통한 Kubernetes 시작 시간 최적화
<a name="remote-ide-optimize-image"></a>

컨테이너 이미지 가져오기 성능은 특히 AI/ML 워크로드가 점점 더 큰 컨테이너 이미지에 의존함에 따라 많은 EKS 고객에게 상당한 병목 현상이 되었습니다. 이러한 큰 이미지를 가져오고 압축을 풀려면 일반적으로 각 EKS 노드에서 처음 사용할 때 몇 분 정도 걸립니다. 이 지연은 SageMaker Spaces를 시작할 때 상당한 지연 시간을 추가하고 특히 노트북, 대화형 개발 작업과 같이 빠른 시작이 필요한 환경에서 사용자 경험에 직접적인 영향을 미칩니다.

이미지 사전 워밍은 특정 컨테이너 이미지가 필요하기 전에 EKS/HyperPod 클러스터의 모든 노드에 미리 로드하는 데 사용되는 기법입니다. 포드가 큰 이미지의 첫 번째 풀을 트리거할 때까지 기다리는 대신 클러스터는 모든 노드에서 이미지를 사전에 다운로드하고 캐싱합니다. 이렇게 하면 워크로드가 시작될 때 필요한 이미지를 로컬에서 이미 사용할 수 있으므로 콜드 스타트 지연이 길어지지 않습니다. 이미지 사전 워밍은 SageMaker Spaces 시작 속도를 개선하고 최종 사용자에게 보다 예측 가능하고 응답성이 뛰어난 환경을 제공합니다.

### DaemonSet를 통한 사전 워밍
<a name="remote-ide-optimize-image-dae"></a>

DaemonSet를 사용하여 이미지를 미리 로드하는 것이 좋습니다. DaemonSet는 클러스터의 모든 노드에서 하나의 포드가 실행되도록 합니다. DaemonSet 포드 내의 각 컨테이너는 캐시하려는 이미지를 참조합니다. Kubernetes가 포드를 시작하면 자동으로 이미지를 가져와 각 노드에서 캐시를 워밍합니다.

다음 예제에서는 두 개의 GPU 이미지를 미리 로드하는 DaemonSet를 생성하는 방법을 보여줍니다. 각 컨테이너는 오버헤드를 최소화하면서 포드를 활성 상태로 유지하기 위해 경량 `sleep infinity` 명령을 실행합니다.

```
cat <<EOF | kubectl apply -n "namespace_1" -f -
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: image-preload-ds
spec:
  selector:
    matchLabels:
      app: image-preloader
  template:
    metadata:
      labels:
        app: image-preloader
    spec:
      containers:
      - name: preloader-3-4-2
        image: public.ecr.aws/sagemaker/sagemaker-distribution:3.4.2-gpu
        command: ["sleep"]
        args: ["infinity"]
        resources:
          requests:
            cpu: 1m
            memory: 16Mi
          limits:
            cpu: 5m
            memory: 32Mi
      - name: preloader-3-3-2
        image: public.ecr.aws/sagemaker/sagemaker-distribution:3.3.2-gpu
        command: ["sleep"]
        args: ["infinity"]
        resources:
          requests:
            cpu: 1m
            memory: 16Mi
          limits:
            cpu: 5m
            memory: 32Mi
EOF
```

### 작동 방식
<a name="remote-ide-optimize-image-how"></a>
+ 각 컨테이너는 하나의 이미지를 참조합니다.
+ Kubernetes는 컨테이너를 시작하기 전에 각 이미지를 다운로드해야 합니다.
+ 모든 노드에서 포드가 실행되면 이미지가 로컬로 캐시됩니다.
+ 이제 이러한 이미지를 사용하는 모든 워크로드가 훨씬 더 빠르게 시작됩니다.

## 스페이스 기본 스토리지(EBS)
<a name="space-storage"></a>

시스템은 기본적으로 EBS CSI 드라이버를 사용하여 각 워크스페이스에 EBS 스토리지 볼륨을 프로비저닝합니다. SageMaker는 워크스페이스에 사용할 EBS 스토리지 클래스를 생성하며, 관리자는 템플릿 설정을 사용하여 이러한 볼륨의 기본 및 최대 크기를 사용자 지정할 수 있습니다. CLI 도구로 작업하는 고급 사용자의 경우 사용자가 EBS 볼륨에 대한 고객 관리형 KMS 키 구성을 포함하여 다른 스토리지 클래스를 활용할 수 있도록 워크스페이스의 스토리지 클래스를 사용자 지정할 수도 있습니다.

EBS 볼륨은 특정 AZ에 바인딩됩니다. 즉, 워크스페이스는 스토리지 볼륨과 동일한 AZ의 노드에서만 예약할 수 있습니다. 이로 인해 클러스터 용량이 존재하지만 올바른 AZ에 없는 경우 예약 실패가 발생할 수 있습니다.

## 추가 스토리지
<a name="space-additional-storage"></a>

SageMaker Spaces는 Amazon EFS, FSx for Lustre 또는 S3 Mountpoint와 같은 추가 스토리지 볼륨을 개발 공간에 연결할 수 있도록 지원합니다. 이를 통해 공유 데이터 세트에 액세스하거나, 프로젝트에서 협업하거나, 워크로드에 고성능 스토리지를 사용할 수 있습니다.

### 사전 조건
<a name="space-additional-storage-prereq"></a>

스페이스에 추가 스토리지를 연결하기 전에 다음을 수행해야 합니다.

1. [EKS](https://docs.aws.amazon.com/eks/latest/userguide/workloads-add-ons-available-eks.html) **추가 기능(Amazon EFS CSI 드라이버, Amazon FSx for Lustre CSI 드라이버 또는 Mountpoint for Amazon S3 CSI 드라이버)을 통해 적절한 CSI 드라이버 추가 기능 설치** EFS FSx Amazon S3 

1. 특정 **스토리지 유형에 대한 CSI 드라이버 설명서에 따라 스토리지 리소스 및 PersistentVolumeClaims 설정** 

1. 스페이스를 생성하려는 것과 동일한 네임스페이스에서 **PVC를 사용할** 수 있는지 확인합니다.

### 스페이스에 스토리지 연결
<a name="space-additional-storage-attach"></a>

PersistentVolumeClaim을 구성한 후에는 HyperPod CLI 또는 kubectl을 사용하여 스페이스에 연결할 수 있습니다.

**HyperPod CLI**

```
hyp create hyp-space \
    --name my-space \
    --display-name "My Space with FSx" \
    --memory 8Gi \
    --volume name=shared-fsx,mountPath=/shared,persistentVolumeClaimName=my-fsx-pvc
```

**kubectl**

```
apiVersion: workspace.jupyter.org/v1alpha1
kind: Workspace
metadata:
  name: my-space
spec:
  displayName: "My Space with FSx"
  desiredStatus: Running
  volumes:
  - name: shared-fsx
    mountPath: /shared
    persistentVolumeClaimName: my-fsx-pvc
```

### 여러 볼륨
<a name="space-additional-storage-multiple"></a>

CLI를 사용하여 여러 `--volume` 플래그를 지정하거나 kubectl을 사용하여 `volumes` 배열에 여러 항목을 지정하여 여러 추가 스토리지 볼륨을 단일 공간에 연결할 수 있습니다.

**HyperPod CLI**

```
hyp create hyp-space \
    --name my-space \
    --display-name "My Space with Multiple Storage" \
    --memory 8Gi \
    --volume name=shared-efs,mountPath=/shared,persistentVolumeClaimName=my-efs-pvc \
    --volume name=datasets,mountPath=/datasets,persistentVolumeClaimName=my-s3-pvc
```

**kubectl**

```
apiVersion: workspace.jupyter.org/v1alpha1
kind: Workspace
metadata:
  name: my-space
spec:
  displayName: "My Space with Multiple Storage"
  desiredStatus: Running
  volumes:
  - name: shared-efs
    mountPath: /shared
    persistentVolumeClaimName: my-efs-pvc
  - name: datasets
    mountPath: /datasets
    persistentVolumeClaimName: my-s3-pvc
```

## 리소스 구성
<a name="space-resource-configuration"></a>

SageMaker Spaces를 사용하면 워크로드 요구 사항에 맞게 CPU, 메모리 및 GPU 리소스를 포함하여 개발 환경에 맞게 컴퓨팅 리소스를 구성할 수 있습니다.

### GPU 구성
<a name="space-gpu-configuration"></a>

SageMaker Spaces는 NVIDIA 다중 인스턴스 GPU(MIG) 기술을 사용하여 전체 GPU 할당 및 GPU 파티셔닝을 모두 지원합니다. 이를 통해 다양한 유형의 기계 학습 워크로드에 대한 GPU 사용률을 최적화할 수 있습니다.

#### 전체 GPU 할당
<a name="space-gpu-whole"></a>

**HyperPod CLI**

```
hyp create hyp-space \
    --name gpu-space \
    --display-name "GPU Development Space" \
    --image public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu \
    --memory 16Gi \
    --gpu 1 \
    --gpu-limit 1
```

**kubectl**

```
apiVersion: workspace.jupyter.org/v1alpha1
kind: Workspace
metadata:
  name: gpu-space
spec:
  displayName: "GPU Development Space"
  image: "public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu"
  desiredStatus: Running
  resources:
    requests:
      memory: "16Gi"
      nvidia.com/gpu: "1"
    limits:
      memory: "16Gi"
      nvidia.com/gpu: "1"
```

#### GPU 파티셔닝(MIG)
<a name="space-gpu-mig"></a>

NVIDIA 다중 인스턴스 GPU(MIG) 기술을 사용한 GPU 파티셔닝을 사용하면 단일 GPU를 더 작고 격리된 인스턴스로 파티셔닝할 수 있습니다. HyperPod 클러스터에는 MIG를 지원하는 GPU 노드와 MIG 프로파일이 구성되어 있어야 합니다. HyperPod 클러스터에서 MIG를 설정하는 방법에 대한 자세한 내용은 [NVIDIA MIG를 사용한 GPU 파티셔닝](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-eks-gpu-partitioning-setup.html)을 참조하세요.

**HyperPod CLI**

```
hyp create hyp-space \
    --name mig-space \
    --display-name "MIG GPU Space" \
    --image public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu \
    --memory 8Gi \
    --accelerator-partition-type mig-3g.20gb \
    --accelerator-partition-count 1
```

**kubectl**

```
apiVersion: workspace.jupyter.org/v1alpha1
kind: Workspace
metadata:
  name: mig-space
spec:
  displayName: "MIG GPU Space"
  image: "public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu"
  desiredStatus: Running
  resources:
    requests:
      memory: "8Gi"
      nvidia.com/mig-3g.20gb: "1"
    limits:
      memory: "8Gi"
      nvidia.com/mig-3g.20gb: "1"
```

## 수명 주기
<a name="space-lifecycle"></a>

수명 주기 구성은 워크스페이스가 생성되거나 시작될 때 실행되는 시작 스크립트를 제공합니다. 이러한 스크립트를 통해 관리자는 시작 중에 워크스페이스 환경을 사용자 지정할 수 있습니다. 최대 크기가 1KB인 bash 스크립트입니다. 더 큰 설정 구성이 필요한 경우 컨테이너 이미지에 스크립트를 추가하고 수명 주기 구성에서 스크립트를 트리거하는 것이 좋습니다.

Kubernetes 컨테이너 수명 주기 후크를 활용하여 [https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/)이 기능을 제공합니다. Kubernetes는 컨테이너의 진입점과 관련하여 시작 스크립트가 실행되는 시기에 대한 보장을 제공하지 않습니다.

## 유휴 종료
<a name="space-idle-shutdown"></a>

유휴 워크스페이스의 자동 종료를 구성하여 리소스 사용을 최적화합니다.

### 유휴 종료
<a name="space-idle-shutdown-spec"></a>

```
idleShutdown:
  enabled: true
  idleShutdownTimeoutMinutes: 30
  detection:
    httpGet:
      path: /api/idle
      port: 8888
      scheme: HTTP
```

### 파라미터
<a name="space-idle-shutdown-parameter"></a>

**enabled**(부울, 필수) - 워크스페이스에 대한 유휴 종료를 활성화하거나 비활성화합니다.

**idleShutdownTimeoutMinutes**(정수, 필수) - 워크스페이스가 종료되기 전 비활성 시간입니다. 최소값은 1입니다.

**감지**(객체, 필수) - 워크스페이스 유휴 상태를 감지하는 방법을 정의합니다.

**detection.httpGet**(객체, 선택 사항) - 유휴 감지를 위한 HTTP 엔드포인트 구성입니다. Kubernetes HTTPGetAction 사양을 사용합니다.
+ **path** - 요청할 HTTP 경로
+ **포트** - 포트 번호 또는 이름
+ **체계** - HTTP 또는 HTTPS(기본값: HTTP)

### 구성 위치
<a name="space-idle-shutdown-configure"></a>

**Workspace 구성**

워크스페이스 사양에서 유휴 종료를 직접 정의합니다.

```
apiVersion: workspace.jupyter.org/v1alpha1
kind: Workspace
metadata:

      name: my-workspace
spec:
  displayName: "Development Workspace"
  image:
      jupyter/scipy-notebook:latest
  idleShutdown:
    enabled: true

      idleShutdownTimeoutMinutes: 30
    detection:
      httpGet:
        path:
      /api/idle
        port: 8888
```

**템플릿 구성**

WorkspaceTemplate에서 기본 유휴 종료 동작을 정의합니다.

```
apiVersion: workspace.jupyter.org/v1alpha1
kind: WorkspaceTemplate
metadata:
  name: jupyter-template
spec:
  displayName: "Jupyter Template"
  defaultImage: jupyter/scipy-notebook:latest
  defaultIdleShutdown:
    enabled: true
    idleShutdownTimeoutMinutes: 30
    detection:
      httpGet:
        path: /api/idle
        port: 8888
  idleShutdownOverrides:
    allow: true
    minTimeoutMinutes: 60
    maxTimeoutMinutes: 240
```

### 템플릿 상속 및 재정의
<a name="space-idle-shutdown-inherit"></a>

템플릿을 사용하는 Workspace는 템플릿의 `defaultIdleShutdown` 구성을 자동으로 상속합니다. 템플릿에서 허용하는 경우 Workspace가이 구성을 재정의할 수 있습니다.

**정책 재정의**

템플릿은 `idleShutdownOverrides`를 통해 재정의 동작을 제어합니다.

**allow**(부울, 기본값: true) - 워크스페이스가 기본 유휴 종료 구성을 재정의할 수 있는지 여부입니다.

**minTimeoutMinutes**(정수, 선택 사항) - 워크스페이스 재정의에 허용되는 최소 제한 시간 값입니다.

**maxTimeoutMinutes**(정수, 선택 사항) - 워크스페이스 재정의에 허용되는 최대 제한 시간 값입니다.

**상속 예제**

Workspace는 템플릿 기본값을 상속합니다.

```
apiVersion: workspace.jupyter.org/v1alpha1
kind: Workspace
metadata:
  name: my-workspace
spec:
  displayName: "My Workspace"
  templateRef:
    name: jupyter-template
  # Inherits defaultIdleShutdown from template
```

**재정의 예제**

Workspace는 템플릿 기본값을 재정의합니다.

```
apiVersion: workspace.jupyter.org/v1alpha1
kind: Workspace
metadata:
  name: my-workspace
spec:
  displayName: "My Workspace"
  templateRef:
    name: jupyter-template
  idleShutdown:
    enabled: true
    idleShutdownTimeoutMinutes: 60  # Must be within template bounds
    detection:
      httpGet:
        path: /api/idle
        port: 8888
```

**잠긴 구성**

워크스페이스 재정의 방지:

```
apiVersion: workspace.jupyter.org/v1alpha1
kind: WorkspaceTemplate
metadata:
  name: locked-template
spec:
  displayName: "Locked Template"
  defaultImage: jupyter/scipy-notebook:latest
  defaultIdleShutdown:
    enabled: true
    idleShutdownTimeoutMinutes: 30
    detection:
      httpGet:
        path: /api/idle
        port: 8888
  idleShutdownOverrides:
    allow: false  # Workspaces cannot override
```

### 동작
<a name="space-idle-shutdown-behavior"></a>

유휴 종료가 활성화되면 시스템은 구성된 HTTP 엔드포인트를 사용하여 워크스페이스에 활동이 있는지 주기적으로 확인합니다. 엔드포인트에 워크스페이스가 지정된 제한 시간 동안 유휴 상태라고 표시되면 워크스페이스가 자동으로 중지됩니다. 필요한 경우 워크스페이스를 수동으로 다시 시작할 수 있습니다.

## 템플릿 업데이트
<a name="customization-template-updates"></a>

Kubectl 또는 Hyperpod CLI 및 SDK와 같은 클라이언트 도구를 사용하여 EKS 클러스터 내의 스페이스를 관리할 수 있습니다. 관리자는 기본 스페이스 구성을 위해 스페이스 템플릿을 프로비저닝할 수 있으며, 데이터 사이언티스트는 기본 Kubernetes 복잡성을 이해하지 않고도 통합 개발 환경을 사용자 지정할 수 있습니다. 자세한 사용 지침은 [https://sagemaker-hyperpod-cli.readthedocs.io/en/latest/index.html](https://sagemaker-hyperpod-cli.readthedocs.io/en/latest/index.html) CLI 및 SDK 설명서를 참조하세요.

관리자는 스페이스를 생성할 때 기본 구성 역할을 하는 스페이스 템플릿에서 CRUD 작업을 수행할 수 있습니다. 데이터 사이언티스트는 스페이스에서 CRUD 작업을 수행하고 특정 컴퓨팅 노드에 대한 다중 인스턴스 GPU 프로파일을 비롯한 다양한 파라미터를 재정의할 수 있습니다. 원격 VSCode 액세스 및 웹 UI를 통해 스페이스를 시작, 중지 및 연결할 수 있습니다. 스페이스 템플릿이 업데이트되면 이후에 생성된 스페이스는 업데이트된 템플릿의 설정으로 구성됩니다. 규정 준수 검사는 기존 스페이스가 업데이트되거나 시작될 때 수행됩니다. 설정이 범위를 벗어났거나 일치하지 않으면 스페이스가 업데이트되거나 시작되지 않습니다.

## hyp cli 및 kubectl 사용
<a name="customization-hyp-cli"></a>

사용자는 Hyperpod CLI를 사용하여 템플릿에서 CRUD를 수행할 수 있습니다.

```
### 1. Create a Space Template
hyp create hyp-space-template --file template.yaml

### 2. List Space Templates
hyp list hyp-space-template
hyp list hyp-space-template --output json

### 3. Describe a Space Template
hyp describe hyp-space-template --name my-template
hyp describe hyp-space-template --name my-template --output json

### 4. Update a Space Template
hyp update hyp-space-template --name my-template --file updated-template.yaml

### 5. Delete a Space Template
hyp delete hyp-space-template --name my-template
```

사용자 지정 템플릿을 생성하려면 시스템 템플릿을 시작점으로 사용할 수 있습니다. 이 템플릿은 SMD와 유사한 이미지에서 작동하지만 관리자가 사용하는 이미지를 기반으로 사용자 지정할 수 있습니다.

사용자 지정 JupyterLab 템플릿의 예:

```
apiVersion: workspace.jupyter.org/v1alpha1
kind: WorkspaceTemplate
metadata:
  name: my-jupyter-template
  namespace: my-namespace
spec:
  displayName: "My Custom Jupyter Lab"
  description: "Custom Jupyter Lab with specific configurations"
  defaultImage: "public.ecr.aws/sagemaker/sagemaker-distribution:latest-cpu"
  allowedImages:
    - "public.ecr.aws/sagemaker/sagemaker-distribution:latest-cpu"
    - "public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu"
  defaultResources:
    requests:
      cpu: "1"
      memory: "4Gi"
    limits:
      cpu: "4"
      memory: "16Gi"
  primaryStorage:
    defaultSize: "10Gi"
    minSize: "5Gi"
    maxSize: "50Gi"
    defaultStorageClassName: "sagemaker-spaces-default-storage-class"
    defaultMountPath: "/home/sagemaker-user"
  defaultContainerConfig:
    command: ["/opt/amazon/sagemaker/workspace/bin/entrypoint-workspace-jupyterlab"]
  defaultPodSecurityContext:
    fsGroup: 1000
  defaultOwnershipType: "Public"
  defaultAccessStrategy:
    name: "hyperpod-access-strategy"
  allowSecondaryStorages: true
  appType: "jupyterlab"
```

사용자 지정 코드 편집기 템플릿의 예:

```
apiVersion: workspace.jupyter.org/v1alpha1
kind: WorkspaceTemplate
metadata:
  name: my-code-editor-template
  namespace: my-namespace
spec:
  displayName: "My Custom Code Editor"
  description: "Custom Code Editor with specific configurations"
  defaultImage: "public.ecr.aws/sagemaker/sagemaker-distribution:latest-cpu"
  allowedImages:
    - "public.ecr.aws/sagemaker/sagemaker-distribution:latest-cpu"
    - "public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu"
  defaultResources:
    requests:
      cpu: "1"
      memory: "4Gi"
    limits:
      cpu: "4"
      memory: "16Gi"
  primaryStorage:
    defaultSize: "10Gi"
    minSize: "5Gi"
    maxSize: "50Gi"
    defaultStorageClassName: "sagemaker-spaces-default-storage-class"
    defaultMountPath: "/home/sagemaker-user"
  defaultContainerConfig:
    command: ["/opt/amazon/sagemaker/workspace/bin/entrypoint-workspace-code-editor"]
  defaultPodSecurityContext:
    fsGroup: 1000
  defaultOwnershipType: "Public"
  defaultAccessStrategy:
    name: "hyperpod-access-strategy"
  allowSecondaryStorages: true
  appType: "code-editor"
```