

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

# 设置权限
<a name="permission-setup"></a>

## 插件及其依赖项所需的角色
<a name="permission-setup-addon"></a>

### 上的 SageMaker 空间需要 IAM 角色 SageMaker HyperPod
<a name="role-hyperpod"></a>

在 **(EKS) 集群上启用 SageMaker Spaces SageMaker HyperPod （又名 SageMaker ** **IDE /笔记本）**功能时，必须创建和分配多个 IAM 角色。这些角色支持安全访问、路由、远程 IDE 会话和 EBS 存储资源调配。下表汇总了这四个角色以及何时需要它们。

### 角色摘要表
<a name="role-table"></a>


| IAM 角色 | 必填？ | 用途 | 谁在使用它？ |  SageMaker 控制台允许自定义？ | 
| --- | --- | --- | --- | --- | 
|  Spaces 插件执行角色  |  始终是必需的  |  允许 Spaces 控制器管理空间、生成预签名 URLs、管理 SSM 会话  |  附加控制器 pod（特权）  |  ✔ 是的  | 
|  集群内路由器角色  |  要访问 WebUI 是必需的  |  允许路由器容器执行 KMS 操作进行 JWT 签名（WebUI 身份验证）  |  集群内路由器 Pod（特权）  |  ✔ 是的  | 
|  SSM 托管实例角色  |  需要进行远程 IDE 访问  |  由 SSM 代理边车用于 SSH-over-SSM远程 IDE 会话  |  Space IDE 容器中的 SSM 代理（不是附加窗格）  |  ✔ 是的  | 
|  EBS CSI 驱动程序插件的 IAM 角色  |  始终是必需的  |  允许 EBS CSI 驱动程序访问空间工作create/attach/modify负载的卷  |  EBS CSI 驱动程序附加组件  |  自动创建  | 
|  外部 DNS 附加组件的 IAM 角色  |  要访问 WebUI 是必需的  |  它确保可以在客户的 Route 53 托管区域中自动为空间端点和集群内组件分配 DNS 名称。  |  外部 DNS 插件  |  自动创建  | 

### 1. Spaces 插件执行角色（必填）
<a name="add-n-execution-role"></a>

Spaces 插件执行角色始终是必需的，因为它由 SageMaker Spaces 插件控制器 pod 使用，该容器是通过 EKS 插件安装的管理组件。此角色允许控制器管理空间、配置资源、与 SSM 交互以及 URLs 为远程 IDE 和 WebUI 访问生成预签名。它还支持用于请求签名的 KMS 访问，用于对 WebUI https 请求进行身份验证。通过 SageMaker 控制台安装 SageMaker Spaces 插件时，可以自动创建此角色。对于手动创建， AWS 提供`AmazonSageMakerSpacesControllerPolicy`托管策略。

**参考信任政策**

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "pods.eks.amazonaws.com"
      },
      "Action": [
          "sts:AssumeRole",
          "sts:TagSession"
      ],
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "{{accountId}}",
          "aws:SourceArn": "arn:aws:eks:{{region}}:{{accountId}}:cluster/{{eksClusterName}}"
        }
      }
    }
  ]
}
```

### 2. 集群内路由器角色（WebUI 身份验证所必需的）
<a name="in-cluster-role"></a>

集群内路由器角色由路由器 **pod 使用，这是对 Sp** aces WebUI 会话进行身份验证的特权组件。路由器使用 KMS 密钥创建和签署授权用户访问特定空间的 JWT 令牌。此角色允许路由器 pod 生成数据密钥并对其进行解密。与控制器角色类似，它使用基于标签和集群的范围限制来强制执行安全性。通过 AWS SageMaker 控制台安装 Spaces 插件时，可以自动生成此角色，但客户可以手动创建。

**参考信任政策**

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "pods.eks.amazonaws.com"
      },
      "Action": [
          "sts:AssumeRole",
          "sts:TagSession"
      ],
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "{{accountId}}",
          "aws:SourceArn": "arn:aws:eks:{{region}}:{{accountId}}:cluster/{{eksClusterName}}"
        }
      }
    }
  ]
}
```

**参考权限政策**

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "KMSDescribeKey",
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:{{region}}:{{accountId}}:key/{{kmsKeyId}}"
        },
        {
            "Sid": "KMSKeyOperations",
            "Effect": "Allow",
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:{{region}}:{{accountId}}:key/{{kmsKeyId}}",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:sagemaker:component": "amazon-sagemaker-spaces",
                    "kms:EncryptionContext:sagemaker:eks-cluster-arn": "${aws:PrincipalTag/eks-cluster-arn}"
                }
            }
        }
    ]
}
```

### 3. SSM 托管实例角色（远程 IDE 访问所必需的）
<a name="ssm-role"></a>

注册 SSM 托管实例以启用远程 IDE 访问权限时，将传递 SSM 托管实例角色。此角色允许 SSM 代理将 pod 注册为 SSM 托管实例，并使用 SSM 会话管理器通道进行远程 IDE (ssh-over-SSM) 连接。它可以在使用 AWS SageMaker 控制台时自动创建。对于手动部署，客户必须创建此角色并将其提供给 Spaces 插件。控制器 pod 本身并不扮演这个角色；它只在调用时才提供这个角色`ssm:CreateActivation`。

**参考信任政策**

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ssm.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "{{account}}"
                },
                "ArnEquals": {
                    "aws:SourceArn": "arn:aws:ssm:{{region}}:{{account}}:*"
                }
            }
        }
    ]
}
```

**参考权限政策**

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:DescribeAssociation"
      ],
      "Resource": [
        "arn:aws:ssm:{{region}}:{{account}}:association/*",
        "arn:aws:ssm:{{region}}:{{account}}:document/*",
        "arn:aws:ec2:{{region}}:{{account}}:instance/*",
        "arn:aws:ssm:{{region}}:{{account}}:managed-instance/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetDocument",
        "ssm:DescribeDocument"
      ],
      "Resource": "arn:aws:ssm:{{region}}:{{account}}:document/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameter",
        "ssm:GetParameters"
      ],
      "Resource": "arn:aws:ssm:{{region}}:{{account}}:parameter/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ssm:ListInstanceAssociations"
      ],
      "Resource": [
        "arn:aws:ec2:{{region}}:{{account}}:instance/*",
        "arn:aws:ssm:{{region}}:{{account}}:managed-instance/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "ssm:PutComplianceItems"
      ],
      "Resource": [
        "arn:aws:ec2:{{region}}:{{account}}:instance/*",
        "arn:aws:ssm:{{region}}:{{account}}:managed-instance/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "ssm:UpdateAssociationStatus"
      ],
      "Resource": [
        "arn:aws:ssm:{{region}}:{{account}}:document/*",
        "arn:aws:ec2:{{region}}:{{account}}:instance/*",
        "arn:aws:ssm:{{region}}:{{account}}:managed-instance/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "ssm:UpdateInstanceAssociationStatus"
      ],
      "Resource": [
        "arn:aws:ssm:{{region}}:{{account}}:association/*",
        "arn:aws:ec2:{{region}}:{{account}}:instance/*",
        "arn:aws:ssm:{{region}}:{{account}}:managed-instance/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "ssm:UpdateInstanceInformation"
      ],
      "Resource": [
        "arn:aws:ec2:{{region}}:{{account}}:instance/*",
        "arn:aws:ssm:{{region}}:{{account}}:managed-instance/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetDeployablePatchSnapshotForInstance",
        "ssm:GetManifest",
        "ssm:ListAssociations",
        "ssm:PutInventory",
        "ssm:PutConfigurePackageResult"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ssmmessages:CreateControlChannel",
        "ssmmessages:CreateDataChannel",
        "ssmmessages:OpenControlChannel",
        "ssmmessages:OpenDataChannel"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2messages:AcknowledgeMessage",
        "ec2messages:DeleteMessage",
        "ec2messages:FailMessage",
        "ec2messages:GetEndpoint"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2messages:GetMessages",
        "ec2messages:SendReply"
      ],
      "Resource": "*",
      "Condition": {
        "ArnLike": {
          "ssm:SourceInstanceARN": "arn:aws:ssm:{{region}}:{{account}}:managed-instance/*"
        }
      }
    }
  ]
}
```

### 4. EBS CSI 驱动程序插件的 IAM 角色
<a name="role-ebs-csi"></a>

EBS CSI 驱动程序的 IAM 角色是必需的，因为 EBS CSI 驱动程序会为 Spaces 工作负载配置永久卷。虽然 AWS托管的 [Amazon EBSCSIDriver 策略](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEBSCSIDriverPolicy.html)提供了基本权限，但 SageMaker HyperPod 集群需要[其他功能](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-eks-ebs.html#sagemaker-hyperpod-eks-ebs-setup)，例如创建快速快照恢复、标记集群拥有的卷以及 attaching/detaching 为托管节点创建卷。 HyperPod这些权限还包括 SageMaker特定权限， APIs 例如。`sagemaker:AttachClusterNodeVolume`如果未安装 EBS CSI 驱动程序，则 SageMaker 控制台现在将在 Spaces 插件安装期间自动创建此角色，**无需客户进行任何操作**。

### 5. 外部 DNS 附加组件的 IAM 角色
<a name="role-external-nds"></a>

外部 DNS 插件管理 HyperPod 集群上服务和入口资源的 DNS 记录。它确保可以在客户的 Route 53 托管区域中自动为空间端点和集群内组件分配 DNS 名称。如今，客户经常通过 EKS 控制台中的一键式选项手动安装外部 DNS。作为改善 SageMaker Spaces 体验的一部分，此角色现在将由 SageMaker 控制台在 Spaces 插件安装期间自动创建，**无需客户进行任何操作**。

## AWS Toolkit 访问 SageMaker 空间的权限设置
<a name="permission-for-toolkitl"></a>

要允许 AWS VS Code Toolkit 资源浏览器侧面板发现和连接 SageMaker 空间，需要以下 IAM 权限。这些权限允许 Toolkit 列出可用 SageMaker HyperPod 集群、检索集群详细信息以及获取关联的 Amazon EKS 集群的连接令牌。

**必需的 IAM 政策**

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SageMakerListClusters",
            "Effect": "Allow",
            "Action": "sagemaker:ListClusters",
            "Resource": "*"
        },
        {
            "Sid": "SageMakerDescribeCluster",
            "Effect": "Allow",
            "Action": "sagemaker:DescribeCluster",
            "Resource": "arn:aws:sagemaker:{{region}}:{{account}}:cluster/cluster-name"
        },
        {
            "Sid": "EksDescribeCluster",
            "Effect": "Allow",
            "Action": "eks:DescribeCluster",
            "Resource": "arn:aws:eks:{{region}}:{{account}}:cluster/cluster-name"
        },
        {
            "Sid": "EksGetToken",
            "Effect": "Allow",
            "Action": "eks:GetToken",
            "Resource": "*"
        }
    ]
}
```

**范围界定建议**
+ 将 cluster-name 替换为用户需要访问的特定 SageMaker HyperPod 集群。
+ eks: GetToken 操作目前不支持资源级限制，必须使用资源:“\$1”。这是一项 AWS 服务限制。客户端身份验证通过 [EKS 访问条目](https://docs.aws.amazon.com/eks/latest/userguide/access-entries.html)执行。