

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 附錄
<a name="appendix"></a>

## 多租戶比較
<a name="multi-tenancy-comparison"></a>

*表 2 — 多租戶比較*


|  多網域  |  多帳戶  |  單一網域內的屬性型存取控制 (ABAC)  | 
| --- | --- | --- | 
|  使用標籤來達成資源隔離。 SageMaker AI Studio 會自動使用網域ARN和使用者設定檔/空間 標記所有資源ARN。  |  每個租戶都在自己的帳戶中，因此有絕對的資源隔離。  |  使用標籤來達成資源隔離。使用者必須管理 建立的資源標記ABAC。  | 
|  清單APIs不能受到標籤的限制。資源的 UI 篩選是在共用空間上完成，不過，列出透過 AWS CLI 或 Boto3 進行的API呼叫SDK會列出整個區域的資源。  |  也可以APIs隔離清單，因為租戶位於其專用帳戶中。  |  清單APIs不能受到標籤的限制。列出透過 AWS CLI 或 Boto3 進行的API呼叫，SDK會列出整個區域的資源。  | 
|  SageMaker AI Studio 運算和每個租用戶的儲存成本，可以透過使用網域ARN做為成本分配標籤來輕鬆監控。  |  SageMaker 每個租戶的 AI Studio 運算和儲存成本易於使用專用帳戶進行監控。  |  SageMaker 每個租用戶的 AI Studio 運算成本必須使用自訂標籤計算。  SageMaker AI Studio 儲存成本無法監控每個網域，因為所有租戶共用相同的EFS磁碟區。  | 
|  服務配額是在帳戶層級設定，因此單一租戶仍然可以使用所有資源。  |  服務配額可以在每個租戶的帳戶層級設定。  |  服務配額是在帳戶層級設定，因此單一租戶仍然可以使用所有資源。  | 
|  擴展到多個租戶可以透過基礎設施做為程式碼 (IaC) 或服務目錄來實現。  |  擴展到多個租戶涉及組織和販賣多個帳戶。  |  擴展需要每個新租用戶的租用戶特定角色，且使用者設定檔需要手動標記租用戶名稱。  | 
|  租用戶內使用者之間的協作可以透過共用空間進行。  |  租用戶內使用者之間的協作可以透過共用空間進行。  |  所有租戶將可存取相同的共用空間以進行協作。  | 

## SageMaker AI Studio 網域備份和復原
<a name="sagemaker-studio-domain-backup-and-recovery"></a>

如果意外EFS刪除，或由於聯網或身分驗證的變更而需要重新建立網域，請遵循這些指示。

### 選項 1：使用 從現有的 備份 EFS EC2
<a name="option-1"></a>

#### SageMaker Studio 網域備份
<a name="sagemaker-studio-domain-backup"></a>

1. 列出 SageMaker Studio ([CLI](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/list-user-profiles.html)、) 中的使用者設定檔和空格[SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.list_user_profiles)。

1. 在 UIDs上將使用者設定檔/空間映射至 EFS。

   1. 對於 users/spaces, describe the user profile/space([CLI](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/describe-user-profile.html)、) 清單中的每個使用者[SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.describe_user_profile)。

   1. 將使用者設定檔/空間映射至 `HomeEfsFileSystemUid`。

   1. `UserSettings['ExecutionRole']` 如果使用者具有不同的執行角色，請將使用者設定檔映射至 。

   1. 識別預設空間執行角色。

1. 建立新的網域並指定預設空間執行角色。

1. 建立使用者設定檔和空格。
   + 對於使用者清單中的每個使用者，使用執行角色映射建立使用者設定檔 ([CLI](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/create-user-profile.html)、[SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.create_user_profile))。

1. 為新的 EFS和 建立映射UIDs。

   1. 對於使用者清單中的每個使用者，描述使用者設定檔 ([CLI](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/describe-user-profile.html)、[SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.describe_user_profile))。

   1. 將使用者設定檔映射至 `HomeEfsFileSystemUid`。

1. 或者，刪除所有應用程式、使用者設定檔、空格，然後刪除網域。

#### EFS 備份
<a name="efs-backup"></a>

若要備份 EFS，請使用下列指示：

1. 啟動EC2執行個體，並將舊 SageMaker Studio 網域的傳入/傳出安全群組連接到新EC2執行個體 （允許連接埠 2049 TCP上的NFS流量通過。請參閱 [中的將 SageMaker Studio 筆記本VPC連接至外部資源](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-notebooks-and-internet-access.html#:~:text=NFS%20traffic%20over%20TCP%20on%20port%202049%20between%20the%20domain%20and%20the%20Amazon%20EFS%20volume.)。

1. 將 SageMaker Studio EFS磁碟區掛載至新的EC2執行個體。請參閱[掛載EFS檔案系統](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs.html)。

1. 將檔案複製到EBS本機儲存體： `>sudo cp -rp /efs /studio-backup:`

   1. 將新的網域安全群組連接至EC2執行個體。

   1. 將新EFS磁碟區掛載至EC2執行個體。

   1. 將檔案複製到新EFS磁碟區。

   1. 對於使用者集合中的每個使用者：

      1. 建立目錄：`mkdir new_uid`。

      1. 將檔案從舊UID目錄複製到新UID目錄。

      1. 變更所有檔案的擁有權：`chown <new_UID>`針對所有檔案。

### 選項 2：EFS使用 S3 和生命週期組態從現有備份
<a name="option-2"></a>

1. 請參閱[使用 Amazon Linux 2 將工作遷移至 Amazon SageMaker 筆記本執行個體](https://aws.amazon.com/blogs/machine-learning/migrate-your-work-to-amazon-sagemaker-notebook-instance-with-amazon-linux-2/)。

1. 建立 S3 儲存貯體以進行備份 （例如 `>studio-backup`。

1. 列出具有執行角色的所有使用者設定檔。

1. 在目前的 SageMaker Studio 網域中，在網域層級設定預設LCC指令碼。
   + 在 中LCC，`/home/sagemaker-user`將 中的所有內容複製到 S3 中的使用者設定檔字首 （例如，`s3://studio-backup/studio-user1`)。

1. 重新啟動所有預設的 Jupyter Server 應用程式 （以便LCC執行 )。

1. 刪除所有應用程式、使用者設定檔和網域。

1. 建立新的 SageMaker Studio 網域。

1. 從使用者設定檔和執行角色清單中建立新的使用者設定檔。

1. LCC 在網域層級設定 ：
   + 在 中LCC，將 S3 中使用者設定檔字首中的所有內容複製到 `/home/sagemaker-user`

1. 為具有[LCC組態](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateApp.html#:~:text=%22ResourceSpec%22%3A%20%7B%20%0A%20%20%20%20%20%20%22InstanceType%22%3A%20%22string%22%2C%0A%20%20%20%20%20%20%22LifecycleConfigArn%22%3A%20%22string%22%2C)的所有使用者建立預設 Jupyter Server 應用程式 ([CLI](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/create-app.html)、[SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.create_app))。

## SageMaker 使用SAML聲明的 Studio 存取
<a name="sagemaker-studio-access-using-saml"></a>

解決方案設定：

1. 在外部 IdP 中建立SAML應用程式。

1. 在 中將外部 IdP 設定為身分提供者IAM。

1. 建立可由 IdP 存取的 `SAMLValidator` Lambda 函數 （透過函數URL或API閘道）。

1. 建立 `GeneratePresignedUrl` Lambda 函數和API閘道以存取函數。

1. 建立IAM使用者可以擔任的角色來叫用API閘道。此角色應以宣告SAML形式以下列格式做為屬性傳遞：
   + 屬性名稱： https://aws.amazon.com/SAML/Attributes/Role
   + 屬性值：`<IdentityProviderARN>`、 `<RoleARN>`

1. 將 SAML Assertion Consumer Service (ACS) 端點更新為`SAMLValidator`叫用 URL。

SAML 驗證器範例程式碼：

```
import requests
import os
import boto3
from urllib.parse import urlparse, parse_qs
import base64
import requests
from aws_requests_auth.aws_auth import AWSRequestsAuth
import json


# Config for calling AssumeRoleWithSAML
idp_arn = "arn:aws:iam::0123456789:saml-provider/MyIdentityProvider"
api_gw_role_arn = 'arn:aws:iam:: 0123456789:role/APIGWAccessRole'
studio_api_url = "abcdef.execute-api.us-east-1.amazonaws.com"
studio_api_gw_path = "https://" + studio_api_url + "/Prod "

# Every customer will need to get SAML Response from the POST call
def get_saml_response(event):
    saml_response_uri = base64.b64decode(event['body']).decode('ascii')
    request_body = parse_qs(saml_response_uri)
    print(f"b64 saml response: {request_body['SAMLResponse'][0]}")
    return request_body['SAMLResponse'][0]


def lambda_handler(event, context):
    sts = boto3.client('sts')
    
    # get temporary credentials 
    response = sts.assume_role_with_saml(
                    RoleArn=api_gw_role_arn,
                    PrincipalArn=durga_idp_arn,
                    SAMLAssertion=get_saml_response(event)
                )    
    auth = AWSRequestsAuth(aws_access_key=response['Credentials']['AccessKeyId'],
                      aws_secret_access_key=response['Credentials']['SecretAccessKey'],
                      aws_host=studio_api_url,
                      aws_region='us-west-2',
                      aws_service='execute-api',
                      aws_token=response['Credentials']['SessionToken'])
                      
    presigned_response = requests.post(
        studio_api_gw_path,
        data=saml_response_data,
        auth=auth)
        
    return presigned_response
```