

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

# 为 SageMaker 笔记本实例提供对另一个 AWS 账户中 CodeCommit 存储库的临时访问权限
<a name="give-sagemaker-notebook-instances-temporary-access-to-a-codecommit-repository-in-another-aws-account"></a>

*Helge Aufderheide，Amazon Web Services*

## Summary
<a name="give-sagemaker-notebook-instances-temporary-access-to-a-codecommit-repository-in-another-aws-account-summary"></a>

此模式演示如何授予 Amazon SageMaker 笔记本实例和用户临时访问其他 AWS 账户中的 AWS CodeCommit 存储库的权限。此模式还显示了如何为每个实体可以在每个存储库上执行的特定操作授予精细权限。

组织通常将存储 CodeCommit 库存储在与托管其开发环境的账户不同的 AWS 账户中。这种多账户设置有助于控制对存储库的访问权限并降低意外删除存储库的风险。要授予这些跨账户权限，最好做法是使用 AWS Identity and Acccess Management (IAM) 角色。然后，每个 Amazon Web Services account 中预定义的 IAM 身份可以临时代入这些角色，从而在各账户之间创建受控的信任链。

**注意**  
您可以应用类似的程序向其他 IAM 身份授予对 CodeCommit 存储库的跨账户访问权限。有关更多信息，请参阅 AWS * CodeCommit 用户指南*中的[使用角色配置对 AWS CodeCommit 存储库的跨账户访问权限](https://docs.aws.amazon.com/codecommit/latest/userguide/cross-account.html)。

## 先决条件和限制
<a name="give-sagemaker-notebook-instances-temporary-access-to-a-codecommit-repository-in-another-aws-account-prereqs"></a>

**先决条件**
+ 具有 CodeCommit 存储库的活跃 AWS 账户（*账户 A*）
+ 带有 SageMaker 笔记本实例的第二个活跃 AWS 账户（*账户 B*）
+ 一个具有在账户 A 中创建和修改 IAM 角色的足够权限的 AWS 用户
+ 第二个具有在账户 B 中创建和修改 IAM 角色的足够权限的 AWS 用户

## 架构
<a name="give-sagemaker-notebook-instances-temporary-access-to-a-codecommit-repository-in-another-aws-account-architecture"></a>

下图显示了向 SageMaker 笔记本实例和一个 AWS 账户中的用户授予跨账户访问 CodeCommit 存储库权限的示例工作流程：

![跨账户访问的工作流程 CodeCommit](https://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/54d0fdb3-6d25-4433-9f67-c87846633d61/images/97a799af-ce88-4495-a61c-d0cd22493ce2.png)


下图显示了如下工作流：

1. 账户 B 中的 AWS 用户角色和 SageMaker 笔记本实例角色采用已[命名的个人资料](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-using-profiles)。

1. 指定配置文件的权限策略在账户 A 中指定 CodeCommit 访问角色，然后该配置文件将担任该角色。

1. 账户 A 中的 CodeCommit 访问角色的信任策略允许账户 B 中的指定配置文件担任 CodeCommit 访问角色。

1. 账户 A 中 CodeCommit 存储库的 IAM 权限策略允许 CodeCommit 访问角色访问 CodeCommit 存储库。

**技术堆栈**
+ CodeCommit
+ Git
+ IAM
+ pip
+ SageMaker

## 工具
<a name="give-sagemaker-notebook-instances-temporary-access-to-a-codecommit-repository-in-another-aws-account-tools"></a>
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 是一项版本控制服务，可帮助您私下存储和管理 Git 存储库，而无需管理自己的源代码控制系统。
+ [AWS Identity and Access Management (AWS IAM) ](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)通过控制验证和授权使用您 AWS 资源的用户，帮助您安全地管理对您 AWS 资源的访问。
+ [Git](https://git-scm.com/) 是分布式版本控制系统，用于追踪软件开发期间源代码的更改。
+ [git-remote-codecommit](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-git-remote-codecommit.html)是一个通过扩展 Git 来帮助您从 CodeCommit 存储库中推送和提取代码的实用工具。
+ [pip](https://pypi.org/project/pip/) 是 Python 的软件包安装程序。您可以使用 pip 来安装来自 Python 软件包索引和其他索引中的软件包。

## 最佳实践
<a name="give-sagemaker-notebook-instances-temporary-access-to-a-codecommit-repository-in-another-aws-account-best-practices"></a>

在使用 IAM policy设置权限时，请仅授予执行任务所需许可。有关更多信息，请参阅 IAM 文档中的[应用最低权限许可](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。

在实施此模式时，请务必执行以下操作：
+ 确认 IAM 原则仅具有在每个存储库中执行特定必要操作所需权限。例如，建议允许经批准的 IAM 原则将更改推送和合并到特定的存储库分支，但只能请求合并到受保护的分支。
+ 确认根据每个项目各自的角色和职责，为 IAM 角色分配不同的 IAM 原则。例如，开发人员将拥有与发布管理员或 AWS 管理员不同的访问权限。

## 操作说明
<a name="give-sagemaker-notebook-instances-temporary-access-to-a-codecommit-repository-in-another-aws-account-epics"></a>

### 配置 IAM 角色
<a name="configure-the-iam-roles"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 配置 CodeCommit 访问角色和权限策略。 | 要自动执行本长篇故事中记录的手动设置过程，****您可以使用 A [WS CloudFormation 模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html)。在包含 CodeCommit 存储库的账户（*账户 A*）中，执行以下操作：1. [创建可由账户 B 中的 SageMaker 笔记本实例角色代入的 IAM](https://docs.aws.amazon.com/codecommit/latest/userguide/cross-account-administrator-a.html#cross-account-create-role-a) 角色。<br />2. [创建 IAM policy](https://docs.aws.amazon.com/codecommit/latest/userguide/cross-account-administrator-a.html#cross-account-create-policy-a)，该策略授予存储库访问权限；然后[将该策略附加到该角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console)。仅出于测试目的，请选择 [AWSCodeCommitPowerUser](https://docs.aws.amazon.com/codecommit/latest/userguide/security-iam-awsmanpol.html#managed-policies-poweruser)AWS 托管策略。此策略授予除删除资源之外的所有[CodeCommit 权限](https://docs.aws.amazon.com/codecommit/latest/userguide/auth-and-access-control-permissions-reference.html)。<br />3. [修改角色的信任策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-managingrole_edit-trust-policy)，将账户 B 列为受信任实体。在将此设置移至生产环境之前，最佳实践是自己编写应用[最低权限许可](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)的 IAM 策略。有关更多信息，请参阅此模式的**其他信息**部分。 | 常规 AWS、AWS DevOps | 
| 向账户 B 中的 SageMaker 笔记本实例角色授予在账户 A 中担任 CodeCommit 访问角色的权限。 | 在包含 SageMaker 笔记本实例的 IAM 角色的*账户（账户 B）中，*执行以下操作：1. 创建 IAM 策略，允许 IAM 角色或用户代入账户 A 中的 CodeCommit 访问角色。<br />**允许 IAM 角色或用户代入跨账户角色的 IAM 权限策略示例**<pre>{<br />  "Version": "2012-10-17",		 	 	 <br />  "Statement": [<br />      {<br />    "Sid": "VisualEditor0",<br />    "Effect": "Allow",<br />    "Action": "sts:AssumeRole",<br />    "Resource": "arn:aws:iam:::accountA_ID:role/accountArole_ID"<br />  }<br />}</pre><br />2. 将该策略附加到您的 SageMaker 笔记本实例在账户 B 中的角色。<br />3. 让账户 B 中 SageMaker 笔记本实例的角色代入账户 A 中的 CodeCommit 访问角色。要查看存储库的 Amazon 资源名称 (ARN)，请参阅 AW *S CodeCommit 用户*指南中的[查看 CodeCommit 存储库详情](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-view-repository-details.html)。 | 常规 AWS、AWS DevOps | 

### 在账户 B 中设置您的 SageMaker 笔记本实例
<a name="set-up-your-sagemaker-notebook-instance-in-account-b"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 AWS SageMaker 笔记本实例上设置用户配置文件以代入账户 A 中的角色。 | [请确认已安装最新版本的 AWS 命令行界面（AWS CLI）](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。在包含 SageMaker 笔记本实例的账户（*账户 B）中，*执行以下操作：1. 登录 AWS 管理控制台并打开[SageMaker 控制台](https://console.aws.amazon.com/sagemaker/)。<br />2. [访问您的 SageMaker 笔记本实例](https://docs.aws.amazon.com/sagemaker/latest/dg/howitworks-access-ws.html)。Jupyter 界面打开。<br />3. 选择**新建**，然后选择**终端**。[在 Jupyter 环境中会打开一个新的终端窗口](https://jupyterlab.readthedocs.io/en/stable/user/terminal.html)。<br />4. 导航到 SageMaker 笔记本实例的 **\~/.aws/config 文件。**然后，通过输入以下语句将用户配置文件添加到文件中：<pre>------.aws/config--------------<br />[profile remoterepouser]<br />role_arn = arn:aws:iam::<ID of Account A>:role/<rolename><br />role_session_name = remoteaccesssession<br />region = eu-west-1<br />credential_source  = Ec2InstanceMetadata<br />----------------------------------</pre> | 常规 AWS、AWS DevOps | 
| 安装 git-remote-codecommit 实用程序。 | 按照 *AWS CodeCommit 用户指南*中的[步骤 2：安装 git-remote-codecommit](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-git-remote-codecommit.html#setting-up-git-remote-codecommit-install)中的说明进行操作。 | 数据科学家 | 

### 访问存储库
<a name="access-the-repository"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用 Git 命令访问 CodeCommit 存储库或 SageMaker。 | **要使用 Git**，请执行以下操作<br />在账户 B 中扮演 SageMaker 笔记本实例角色的 IAM 委托人现在可以运行 Git 命令来访问账户 A 中的 CodeCommit 存储库。例如，用户可以运行`git clone``git pull`、和`git push`之类的命令。<br />有关说明，请参阅 [AWS * CodeCommit 用户指南中的 Connect 到 AWS CodeCommit * 存储库](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-connect.html)。<br />有关如何使用 Git 的信息 CodeCommit，请参阅 [AWS * CodeCommit 用户指南 CodeCommit中的 AWS* 入门](https://docs.aws.amazon.com/codecommit/latest/userguide/getting-started-cc.html)。<br />**要使用 SageMaker**<br />要从 SageMaker 控制台使用 Git，必须允许 Git 从 CodeCommit 仓库中检索证书。有关说明，请参阅 SageMaker 文档[中的将不同 AWS 账户中的 CodeCommit 存储库与笔记本实例关联](https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-git-cross.html)。 | Git，bash 控制台 | 

## 相关资源
<a name="give-sagemaker-notebook-instances-temporary-access-to-a-codecommit-repository-in-another-aws-account-resources"></a>
+ [使用角色配置对 AWS CodeCommit 存储库的跨账户访问权限](https://docs.aws.amazon.com/codecommit/latest/userguide/cross-account.html)（AWS CodeCommit 文档）
+ [IAM 教程：使用 IAM 角色委派跨 AWS 账户的访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)（IAM 文档）

## 附加信息
<a name="give-sagemaker-notebook-instances-temporary-access-to-a-codecommit-repository-in-another-aws-account-additional"></a>

**将 CodeCommit 权限限制为特定操作**

要限制 IAM 委托人可以在 CodeCommit 存储库中执行的操作，请修改 CodeCommit 访问策略中允许的操作。

有关 CodeCommit API 操作的更多信息，请参阅 *AWS CodeCommit 用户指南*中的[CodeCommit 权限参考](https://docs.aws.amazon.com/codecommit/latest/userguide/auth-and-access-control-permissions-reference.html)。

**注意**  
您还可以编辑 [AWSCodeCommitPowerUser](https://docs.aws.amazon.com/codecommit/latest/userguide/security-iam-awsmanpol.html#managed-policies-poweruser)AWS 托管策略以适应您的使用案例。

**限制对特定仓库的 CodeCommit 权限**

要创建只有特定用户才能访问多个代码存储库的多租户环境，请执行以下操作：

1. 在账户 A 中创建多个 CodeCommit 访问角色。然后，将每个访问角色的信任策略配置为允许账户 B 中的特定用户代入该角色。

1. 通过在每个 CodeCommit 访问角色的策略中添加 **“资源”** 条件，限制每个角色可以担任的代码存储库。

**限制 IAM 委托人访问特定 CodeCommit 存储库的 “资源” 条件示例**

```
"Resource" : [<REPOSITORY_ARN>,<REPOSITORY_ARN> ]
```

**注意**  
为了帮助识别和区分同一个 AWS 账户中的多个代码存储库，您可以为存储库的名称分配不同的前缀。例如，您可以使用与不同开发人员组对应的前缀来命名代码存储库，例如 **myproject-subproject1-repo1** 和 **myproject-subproject2-repo1**。然后，您可以根据为每个开发人员组分配的前缀为其创建一个 IAM 角色。例如，您可以创建一个名为 **myproject-subproject1-repoaccess** 的角色，并授予其访问包含前缀 **myproject-subproject1** 的所有代码存储库的权限。

**引用包含特定前缀的代码存储库 ARN 的“资源”条件示例**

```
"Resource" : arn:aws:codecommit:<region>:<account-id>:myproject-subproject1-*
```