

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

# 使用角色管理器 (AWS CDK)
<a name="role-manager-tutorial-cdk"></a>

使用 wit AWS Cloud Development Kit (AWS CDK) h Amazon SageMaker 角色管理器以编程方式创建角色和设置权限。您可以使用 AWS CDK 来完成使用可以执行的任何任务 AWS 管理控制台。通过 CDK 的编程访问权限，可以更轻松地为用户提供访问特定资源的权限。有关的更多信息 AWS CDK，请参阅[什么是 AWS CDK？](https://docs.aws.amazon.com/cdk/v2/guide/home.html)

**重要**  
必须使用 SageMaker AI 计算角色角色来创建 A SageMaker I 计算角色。有关计算角色的更多信息，请参阅 [SageMaker AI 计算角色](role-manager-personas.md#role-manager-personas-compute)。有关可用于在中创建计算角色的代码 AWS CDK，请参阅[向计算角色授予权限](#role-manager-cdk-compute-persona)。

以下是可在 AWS CDK中执行的任务示例：
+ 为机器学习 (ML) 角色（例如数据科学家和 MLOps 工程师）创建具有精细权限的 IAM 角色。
+ 为来自机器学习角色或机器学习活动的 CDK 构造授予权限。
+ 设置机器学习活动条件参数。
+ 启用全球 Amazon VPC 和 AWS Key Management Service 条件并为其设置值。
+ 为用户提供各种版本的机器学习活动供选择，而不会导致他们的访问中断。

有一些与使用 A SageMaker I 的机器学习 (ML) 相关的常见 AWS 任务需要特定的 IAM 权限。在 Amazon SageMaker 角色管理器中，执行任务的权限定义为机器学习活动。机器学习活动指定了一组与 IAM 角色关联的权限。例如，Amazon SageMaker Studio Classic 的机器学习活动拥有用户访问 Studio Classic 所需的所有权限。有关机器学习活动的更多信息，请参阅 [机器学习活动参考](role-manager-ml-activities.md)。

创建角色时，首先要定义机器学习角色或机器学习活动的构造。构造是 AWS CDK 堆栈中的资源。例如，构造可以是 Amazon S3 存储桶、Amazon VPC 子网或 IAM 角色。

创建角色或活动时，您可以将与该角色或活动关联的权限限制为特定资源。例如，您可以将活动自定义为仅提供对 Amazon VPC 内特定子网的权限。

定义权限后，您可以创建角色，然后将这些角色传递给其他资源，例如 SageMaker 笔记本实例。



以下是 TypeScript 中可以使用 CDK 完成的任务的代码示例。创建活动时，需要为活动的构造指定 ID 和选项。这些选项是指定活动所需参数（如 Amazon S3）的字典。您可以为没有必需参数的活动传递一个空字典。

## 向计算角色授予权限
<a name="role-manager-cdk-compute-persona"></a>

以下代码创建了一个数据科学家机器学习角色，其中包含一组特定于该角色的机器学习活动。来自机器学习活动的权限仅适用于 Amazon VPC 和角色结构中指定的 AWS KMS 配置。以下代码为数据科学家角色创建了一个类。活动列表中定义了机器学习活动。VPC 权限和 KMS 权限定义为活动列表之外的可选参数。

定义类后，可以在 AWS CDK 堆栈中创建角色作为构造。您也可以创建笔记本实例。使用您在以下代码中创建的 IAM 角色的用户可以在登录自己的 AWS 账户时访问笔记本实例。

```
export class myCDKStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const persona = new Persona(this, 'example-persona-id', {
        activities: [
            Activity.accessAwsServices(this, '{{example-id1}}', {})
        ]
    });

    const role = persona.createRole(this, '{{example-IAM-role-id}}', '{{example-IAM-role-name}}');
    
    }
}
```

## 向数据科学家角色授予权限
<a name="role-manager-cdk-data-scientist"></a>

以下代码创建了一个数据科学家机器学习角色，其中包含一组特定于该角色的机器学习活动。机器学习活动的权限仅适用于角色构造中指定的 VPC 和 KMS 配置。以下代码为数据科学家角色创建了一个类。活动列表中定义了机器学习活动。Amazon VPC AWS KMS 权限和权限定义为活动列表之外的可选参数。

定义类后，可以在 AWS CDK 堆栈中创建角色作为构造。您也可以创建笔记本实例。使用您在以下代码中创建的 IAM 角色的用户可以在登录自己的 AWS 账户时访问笔记本实例。

```
export class myCDKStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const persona = new Persona(this, '{{example-persona-id}}', {
        activities: [
            Activity.runStudioAppsV2(this, '{{example-id1}}', {}),
            Activity.manageJobs(this, '{{example-id2}}', {rolesToPass: [iam.Role.fromRoleName('{{example-IAM-role-name}}')]}),
            Activity.manageModels(this, '{{example-id3}}', {rolesToPass: [iam.Role.fromRoleName('{{example-IAM-role-name}}')]}),
            Activity.manageExperiments(this, '{{example-id4}}', {}),
            Activity.visualizeExperiments(this, '{{example-id5}}', {}),
            Activity.accessS3Buckets(this, '{{example-id6}}', {s3buckets: [s3.S3Bucket.fromBucketName('{{amzn-s3-demo-bucket}}')]})
        ],
        // optional: to configure VPC permissions
        subnets: [ec2.Subnet.fromSubnetId('{{example-VPC-subnet-id}}')],
        securityGroups: [ec2.SecurityGroup.fromSecurityGroupId('{{example-VPC-security-group-id}}')],
        // optional: to configure KMS permissions
        dataKeys: [kms.Key.fromKeyArn('{{example-KMS-key-ARN}}')],
        volumeKeys: [kms.Key.fromKeyArn('{{example-KMS-key-ARN}}')],
    });

    const role = persona.createRole(this, '{{example-IAM-role-id}}', '{{example-IAM-role-name}}');
    
    const notebookInstance = new CfnNotebookInstance(this, '{{example-notebook-instance-name}}', { RoleArn: role.RoleArn, ...});
    }
}
```

## 向机器学习 Ops 角色授予权限
<a name="role-manager-cdk-ml-ops-persona"></a>

以下代码创建了一个机器学习 Ops 角色，其中包含一组特定于该角色的机器学习活动。来自机器学习活动的权限仅适用于 Amazon VPC 和角色结构中指定的 AWS KMS 配置。以下代码为机器学习 Ops 角色创建了一个类。活动列表中定义了机器学习活动。VPC 权限和 KMS 权限定义为活动列表之外的可选参数。

定义类后，可以在 AWS CDK 堆栈中创建角色作为构造。您也可以创建 Amazon SageMaker Studio 经典版用户个人资料。使用您在以下代码中创建的 IAM 角色的用户可以在登录自己的 AWS 账户时打开 SageMaker Studio Classic。

```
export class myCDKStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const persona = new Persona(this, '{{example-persona-id}}', {
        activities: [
            Activity.runStudioAppsV2(this, '{{example-id1}}', {}),
            Activity.manageModels(this, '{{example-id2}}', {rolesToPass: [iam.Role.fromRoleName('{{example-IAM-role-name}}')]}),
            Activity.manageEndpoints(this, '{{example-id3}}',{rolesToPass: [iam.Role.fromRoleName('{{example-IAM-role-name}}')]}),
            Activity.managePipelines(this, '{{example-id4}}', {rolesToPass: [iam.Role.fromRoleName('{{example-IAM-role-name}}')]}),
            Activity.visualizeExperiments(this, '{{example-id5}}', {})
        ],
        subnets: [ec2.Subnet.fromSubnetId('{{example-VPC-subnet-id}}')],
        securityGroups: [ec2.SecurityGroup.fromSecurityGroupId('{{example-VPC-security-group-id}}')],
        dataKeys: [kms.Key.fromKeyArn('{{example-KMS-key-ARN}}')],
        volumeKeys: [kms.Key.fromKeyArn('{{example-KMS-key-ARN}}')],
    });

    const role = persona.createRole(this, '{{example-IAM-role-id}}', '{{example-IAM-role-name}}');
    
    let userProfile = new CfnNUserProfile(this, '{{example-Studio Classic-profile-name}}', { RoleName: role.RoleName, ... });  
    }
}
```

## 向构造授予权限
<a name="role-manager-cdk-ml-ops"></a>

以下代码创建了一个机器学习 Ops 角色，其中包含一组特定于该角色的机器学习活动。以下代码为机器学习 Ops 角色创建了一个类。活动列表中定义了机器学习活动。

定义类后，可以在 AWS CDK 堆栈中创建角色作为构造。您也可以创建笔记本实例。该代码向 Lambda 函数的 IAM 角色授予机器学习活动的权限。

```
export class myCDKStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const persona = new Persona(this, '{{example-persona-id}}', {
        activities: [
            Activity.runStudioAppsV2(this, '{{example-id1}}', {}),
            Activity.manageModels(this, '{{example-id2}}', {rolesToPass: [iam.Role.fromRoleName('{{example-IAM-role-name}}')]}),
            Activity.manageEndpoints(this, '{{example-id3}}',{rolesToPass: [iam.Role.fromRoleName('{{example-IAM-role-name}}')]}),
            Activity.managePipelines(this, '{{example-id4}}', {rolesToPass: [iam.Role.fromRoleName('{{example-IAM-role-name}}')]}),
            Activity.visualizeExperiments(this, '{{example-id5}}', {})
        ],
    });

    const lambdaFn = lambda.Function.fromFunctionName('{{example-lambda-function-name}}');
    persona.grantPermissionsTo(lambdaFn);
    }
}
```

## 为单个机器学习活动授予权限
<a name="role-manager-cdk-single-ml-activity"></a>

以下代码创建了一个机器学习活动，并从该活动中创建了一个角色。该活动的权限仅适用于您为用户指定的 VPC 和 KMS 配置。

```
export class myCDKStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const activity = Activity.manageJobs(this, '{{example-activity-id}}', {
        rolesToPass: [iam.Role.fromRoleName('{{example-IAM-role-name}}')],
        subnets: [ec2.Subnet.fromSubnetId('{{example-VPC-subnet-id}}')],
        securityGroups: [ec2.SecurityGroup.fromSecurityGroupId('{{example-VPC-security-group-id}}')],
        dataKeys: [kms.Key.fromKeyArn('{{example-KMS-key-ARN}}')],
        volumeKeys: [kms.Key.fromKeyArn('{{example-KMS-key-ARN}}')],
    });

    const role = activity.createRole(this, '{{example-IAM-role-id}}', '{{example-IAM-role-name}}');
    }
}
```

## 创建角色并为其授予单个活动的权限
<a name="role-manager-cdk-permissions"></a>

以下代码为单个机器学习活动创建了 IAM 角色。

```
export class myCDKStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const activity = Activity.manageJobs(this, '{{example-activity-id}}', {
        rolesToPass: [iam.Role.fromRoleName('{{example-IAM-role-name}}')],
    });
        

    activity.create_role(this, '{{example-IAM-role-id}}', '{{example-IAM-role-name}}') 
    }
}
```