

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

# 使用中的存储库 CodeArtifact
<a name="repos"></a>

这些主题向您展示了如何使用 CodeArtifact 控制台， AWS CLI以及 CodeArtifact APIs 如何创建、列出、更新和删除存储库。

**Topics**
+ [创建 存储库](create-repo.md)
+ [连接存储库](connect-repo.md)
+ [删除存储库](delete-repo.md)
+ [列出存储库](list-repos.md)
+ [查看或修改存储库配置](config-repos.md)
+ [存储库策略](repo-policies.md)
+ [标记存储库](tag-repositories.md)

# 创建 存储库
<a name="create-repo"></a>

由于中的所有软件包 CodeArtifact 都存储在存储[库](codeartifact-concepts.md#welcome-concepts-repository)中，因此要使用 CodeArtifact，必须创建一个。您可以使用 CodeArtifact 控制台、 AWS Command Line Interface (AWS CLI) 或创建存储库 CloudFormation。每个存储库都与您在创建存储库时使用的 AWS 账户相关联。您可以有多个存储库，按[域](codeartifact-concepts.md#welcome-concepts-domain)来创建存储库并进行分组。创建存储库时，存储库中不包含任何程序包。存储库是多语言的，这意味着单个存储库可以包含任何受支持类型的程序包。

有关 CodeArtifact 服务限制的信息，例如单个域中允许的最大存储库数量，请参阅[中的配额 AWS CodeArtifact](service-limits.md)。如果达到了允许的最大存储库数量，则可以[删除存储库](delete-repo.md)来腾出空间，用于容纳更多存储库。

一个存储库可以有一个或多个与之关联的 CodeArtifact 仓库作为上游存储库。这样，程序包管理器客户端就可以使用单个 URL 端点访问多个存储库中包含的程序包。有关更多信息，请参阅 [在中使用上游存储库 CodeArtifact](repos-upstream.md)。

有关使用管理 CodeArtifact 仓库的更多信息 CloudFormation，请参阅[使用 AWS CloudFormation 创建 CodeArtifact 资源](cloudformation-codeartifact.md)。

**注意**  
创建存储库后，便无法更改其名称、关联的 AWS 账户或域。

**Topics**
+ [创建存储库（控制台）](#create-repo-console)
+ [创建存储库 (AWS CLI)](#create-repo-cli)
+ [创建具有上游存储库的存储库](#creating-a-repository-with-an-upstream)

## 创建存储库（控制台）
<a name="create-repo-console"></a>

1. 在 [https://console.aws.amazon.com/codesuite/codeartifact](https://console.aws.amazon.com/codesuite/codeartifact/home) /hom AWS CodeArtifact e 打开控制台。

1.  在导航窗格中，选择**存储库**，然后选择**创建存储库**。

1.  在**存储库名称**中，输入存储库的名称。

1.  （可选）在**存储库描述**中，输入存储库的可选描述。

1.  （可选）在**发布上游存储库**中，添加可用于将您的存储库与程序包发布机构（例如 Maven Central 或 npmjs.com）连接起来的中间存储库。

1.  选择**下一步**。

1.  在 **AWS 账户**中，如果您登录的是拥有该域的账户，请选择**此 AWS 账户**。如果另一个 AWS 账户拥有该域，请选择**不同 AWS 账户**。

1.  在**域**中，选择要在其中创建存储库的域。

    如果账户中没有域，则必须创建一个域。在**域名**中，输入新域的名称。

    展开**其他配置**。

    您必须使用 AWS KMS key （KMS 密钥）来加密您域中的所有资产。您可以使用自己管理的 AWS 托管式密钥 或 KMS 密钥：
**重要**  
CodeArtifact 仅支持[对称 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)。您不能使用[非对称 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html#asymmetric-cmks)来加密您的 CodeArtifact 域名。要获取确定 KMS 密钥是对称还是非对称的帮助，请参阅[识别对称密钥和非对称密钥](https://docs.aws.amazon.com/kms/latest/developerguide/find-symm-asymm.html)。
   +  如果您想使用默认 AWS 托管式密钥，请选择 **AWS 托管式密钥**。
   +  如果您想使用自己管理的 KMS 密钥，请选择**客户管理的密钥**。要使用自己管理的 KMS 密钥，请在**客户管理的密钥 ARN** 中搜索并选择 KMS 密钥。

    有关更多信息，请参阅**《AWS Key Management Service 开发人员指南》中的 [AWS 托管式密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 和[客户管理的密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

1.  选择**下一步**。

1.  在 “**查看并创建**” 中，查看 CodeArtifact 正在为您创建的内容。
   +  **程序包流**显示您的域和存储库如何连接。
   +  **步骤 1: 创建存储库**显示有关存储库以及将要创建的可选上游存储库的详细信息。
   +  **步骤 2: 选择域**显示有关 `my_domain` 的详细信息。

    当您准备好后，选择**创建存储库**。

## 创建存储库 (AWS CLI)
<a name="create-repo-cli"></a>

使用 `create-repository` 命令在您的域中创建存储库。

```
aws codeartifact create-repository --domain my_domain --domain-owner 111122223333 --repository my_repo --description "My new repository"
```

输出示例：

```
{
    "repository": {
        "name": "my_repo",
        "administratorAccount": "123456789012",
        "domainName": "my_domain",
        "domainOwner": "111122223333",
        "arn": "arn:aws:codeartifact:region-id:111122223333:repository/my_domain/my_repo",
        "description": "My new repository",
        "upstreams": "[]",
        "externalConnections"" "[]"
    }
}
```

新的存储库不包含任何程序包。每个存储库都与您在创建存储库时经过身份验证的 AWS 账户相关联。

### 创建带标签的存储库
<a name="create-repo-cli-tags"></a>

要创建带标签的存储库，请在 `create-domain` 命令中添加 `--tags` 参数。

```
aws codeartifact create-repository --domain my_domain --domain-owner 111122223333 --repository my_repo --tags key=k1,value=v1 key=k2,value=v2
```

## 创建具有上游存储库的存储库
<a name="creating-a-repository-with-an-upstream"></a>

在创建存储库时，可以指定一个或多个上游存储库。

```
aws codeartifact create-repository --domain my_domain --domain-owner 111122223333 --repository my_repo \
  --upstreams repositoryName=my-upstream-repo --repository-description "My new repository"
```

输出示例：

```
{
    "repository": {
        "name": "my_repo",
        "administratorAccount": "123456789012",
        "domainName": "my_domain",
        "domainOwner": "111122223333",
        "arn": "arn:aws:codeartifact:region-id:111122223333:repository/my_domain/my_repo",
        "description": "My new repository",
        "upstreams": [
            {
                "repositoryName": "my-upstream-repo"
            }
        ],
        "externalConnections"" "[]"
    }
}
```

**注意**  
要创建带有上游存储库的存储库，您必须拥有对上游存储库执行 `AssociateWithDownstreamRepository` 操作的权限。

要在创建后向存储库中添加上游存储库，请参阅[添加或删除上游存储库（控制台）](repo-upstream-add.md#repo-upstream-add-console)和[添加或删除上游存储库 (AWS CLI)](repo-upstream-add.md#repo-upstream-add-cli)。

# 连接存储库
<a name="connect-repo"></a>

将您的个人资料和凭据配置为对您的 AWS 账户进行身份验证后，请决定要在哪个存储库中使用 CodeArtifact。您有以下选项：
+ 创建存储库。有关更多信息，请参阅[创建存储库](create-repo.md)。
+ 使用账户中已存在的存储库。您可以使用 `list-repositories` 命令来查找在您的 AWS 账户中创建的存储库。有关更多信息，请参阅 [列出存储库](list-repos.md)。
+ 使用其他 AWS 账户中的存储库。有关更多信息，请参阅[存储库策略](repo-policies.md)。

## 使用程序包管理器客户端
<a name="using-a-package-manager-client"></a>

在知道要使用哪个存储库后，请参阅以下主题之一。
+ [ CodeArtifact 与 Maven 一起使用](using-maven.md)
+ [ CodeArtifact 与 npm 一起使用](using-npm.md)
+ [ CodeArtifact 与一起使用 NuGet](using-nuget.md)
+ [ CodeArtifact 与 Python 一起使用](using-python.md)

# 删除存储库
<a name="delete-repo"></a>

您可以使用 CodeArtifact 控制台或删除存储库 AWS CLI。删除存储库后，即不能再向存储库推送程序包或从中提取程序包。存储库中的所有程序包都变为永久不可用且无法还原。您可以创建一个同名的存储库，但其内容将为空。

**重要**  
删除存储库的操作无法撤销。删除存储库后，您无法再将其恢复，也无法进行还原。

**Topics**
+ [删除存储库（控制台）](#delete-repo-console)
+ [删除存储库 (AWS CLI)](#delete-repo-cli)
+ [保护存储库免遭删除](#delete-repo-protect)

## 删除存储库（控制台）
<a name="delete-repo-console"></a>

1. 在 [https://console.aws.amazon.com/codesuite/codeartifact](https://console.aws.amazon.com/codesuite/codeartifact/home) /hom AWS CodeArtifact e 打开控制台。

1.  在导航窗格上，选择**存储库**，然后选择要删除的存储库。

1.  选择**删除**，然后按照步骤删除域。

## 删除存储库 (AWS CLI)
<a name="delete-repo-cli"></a>

使用 `delete-repository` 命令来删除存储库。

```
aws codeartifact delete-repository --domain my_domain --domain-owner 111122223333 --repository my_repo
```

输出示例：

```
{
    "repository": {
        "name": "my_repo",
        "administratorAccount": "123456789012",
        "domainName": "my_domain",            
        "domainOwner": "123456789012",
        "arn": "arn:aws:codeartifact:region-id:123456789012:repository/my_domain/my_repo",
        "description": "My new repository",
        "upstreams": [],
        "externalConnections": []
    }
}
```

## 保护存储库免遭删除
<a name="delete-repo-protect"></a>

可以通过添加类似于以下内容的域策略，来防止存储库被意外删除：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DenyRepositoryDeletion",
            "Action": [
                "codeartifact:DeleteRepository"
            ],
            "Effect": "Deny",
            "Resource": "*",
            "Principal": "*"
        }
    ]
}
```

------

此策略阻止所有主体删除存储库，但如果您之后决定需要删除存储库，可按以下步骤进行操作：

1.  在域策略中，将策略更新为以下内容：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "DenyRepositoryDeletion",
               "Action": [
                   "codeartifact:DeleteRepository"
               ],
               "Effect": "Deny",
               "NotResource": "arn:aws:iam::*:role/Service*",
               "Principal": "*"
           }
       ]
   }
   ```

------

   *repository-arn*替换为您要删除的仓库的 ARN。

1.  在 AWS CodeArtifact 控制台中，选择**存储库**并删除您选择的存储库。

1.  删除存储库后，您可以更改回之前的策略以防止意外删除。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "DenyRepositoryDeletion",
               "Action": [
                   "codeartifact:DeleteRepository"
               ],
               "Effect": "Deny",
               "Resource": "*",
               "Principal": "*"
           }
       ]
   }
   ```

------

或者，也可以在存储库策略中包含相同的拒绝语句。这样便可以更灵活地保护高价值存储库免遭删除。

# 列出存储库
<a name="list-repos"></a>

使用本主题中的命令列出 AWS 账户或域中的存储库。

## 列出 AWS 账户中的仓库
<a name="listing-repositories-in-an-aws-account"></a>

使用此命令列出您 AWS 账户中的所有存储库。

```
aws codeartifact list-repositories
```

示例输出：

```
{
    "repositories": [
        {
            "name": "repo1",
            "administratorAccount": "123456789012",
            "domainName": "my_domain",
            "domainOwner": "123456789012",
            "arn": "arn:aws:codeartifact:region-id:123456789012:repository/my_domain/repo1",
            "description": "Description of repo1"
        },
        {
            "name": "repo2",
            "administratorAccount": "123456789012",
            "domainName": "my_domain",
            "domainOwner": "123456789012",
            "arn": "arn:aws:codeartifact:region-id:123456789012:repository/my_domain/repo2",
            "description": "Description of repo2"    
            
        },
        {
            "name": "repo3",
            "administratorAccount": "123456789012",
            "domainName": "my_domain2",
            "domainOwner": "123456789012",
            "arn": "arn:aws:codeartifact:region-id:123456789012:repository/my_domain2/repo3",
            "description": "Description of repo3"
        }
    ]
}
```

 您可以使用 `--max-results` 和 `--next-token` 参数对来自 `list-repositories` 的响应进行分页。对于 `--max-results`，指定一个 1 至 1000 之间的整数，用来指定在一页中返回的结果数。其默认值为 50。要返回后续页面，请再次运行 `list-repositories` 并将上一个命令输出中接收到的 `nextToken` 值传递给 `--next-token`。如果未使用 `--next-token` 选项，则始终返回结果的第一页。

## 列出域中的存储库
<a name="listing-repositories-in-the-domain"></a>

使用 `list-repositories-in-domain` 来获取域中所有存储库的列表。

```
aws codeartifact list-repositories-in-domain --domain my_domain --domain-owner 123456789012 --max-results 3
```

输出显示，有些存储库由不同的 AWS 账户管理。

```
{
    "repositories": [
        {
            "name": "repo1",
            "administratorAccount": "123456789012",
            "domainName": "my_domain",
            "domainOwner": "111122223333",  
            "arn": "arn:aws:codeartifact:region-id:111122223333:repository/my_domain/repo1",
            "description": "Description of repo1"
        },
        {
            "name": "repo2",
            "administratorAccount": "444455556666",
            "domainName": "my_domain",
            "domainOwner": "111122223333",
            "arn": "arn:aws:codeartifact:region-id:111122223333:repository/my_domain/repo2",
            "description": "Description of repo2"            
        },
        {
            "name": "repo3",
            "administratorAccount": "444455556666",
            "domainName": "my_domain",
            "domainOwner": "111122223333",
            "arn": "arn:aws:codeartifact:region-id:111122223333:repository/my_domain/repo3",
            "description": "Description of repo3"            
        }
    ]
}
```

 您可以使用 `--max-results` 和 `--next-token` 参数对来自 `list-repositories-in-domain` 的响应进行分页。对于 `--max-results`，指定一个 1 至 1000 之间的整数，用来指定在一页中返回的结果数。其默认值为 50。要返回后续页面，请再次运行 `list-repositories-in-domain` 并将上一个命令输出中接收到的 `nextToken` 值传递给 `--next-token`。如果未使用 `--next-token` 选项，则始终返回结果的第一页。

要以更精简的列表输出存储库名称，请尝试以下命令。

```
aws codeartifact list-repositories-in-domain --domain my_domain --domain-owner 111122223333 \
  --query 'repositories[*].[name]' --output text
```

示例输出：

```
repo1
repo2
repo3
```

以下示例除了输出存储库名称外，还输出账户 ID。

```
aws codeartifact list-repositories-in-domain --domain my_domain --domain-owner 111122223333  \
  --query 'repositories[*].[name,administratorAccount]' --output text
```

示例输出：

```
repo1 710221105108
repo2 710221105108
repo3 532996949307
```

有关`--query`参数的更多信息，请参阅 *CodeArtifact API 参考[ListRepositories](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListRepositories.html)*中的。

# 查看或修改存储库配置
<a name="config-repos"></a>

 您可以使用 CodeArtifact 控制台或 AWS Command Line Interface (AWS CLI) 查看和更新有关存储库的详细信息。

**注意**  
创建存储库后，便无法更改其名称、关联的 AWS 账户或域。

**Topics**
+ [查看或修改存储库配置（控制台）](#config-repos-console)
+ [查看或修改存储库配置 (AWS CLI)](#config-repos-cli)

## 查看或修改存储库配置（控制台）
<a name="config-repos-console"></a>

 您可以使用 CodeArtifact 控制台查看有关存储库的详细信息并对其进行更新。

1. 在 [https://console.aws.amazon.com/codesuite/codeartifact](https://console.aws.amazon.com/codesuite/codeartifact/home) /hom AWS CodeArtifact e 打开控制台。

1.  在导航窗格中，选择**存储库**，然后选择要查看或修改的存储库名称。

1.  展开**详细信息**，查看以下信息：
   +  存储库的域。选择域名来了解有关域的更多信息。
   +  存储库的资源策略。选择**应用存储库策略**来添加存储库策略。
   +  存储库的 Amazon 资源名称 (ARN)。
   +  如果您的存储库有外部连接，则可以选择该连接来了解更多信息。存储库只能有一个外部连接。有关更多信息，请参阅 [将 CodeArtifact 仓库连接到公共仓库](external-connection.md)。
   +  如果您的存储库有上游存储库，则可以选择一个存储库来查看其详细信息。存储库最多可以有 10 个直接上游存储库。有关更多信息，请参阅 [在中使用上游存储库 CodeArtifact](repos-upstream.md)。
**注意**  
 存储库可以有外部连接或上游存储库，但不能两者兼而有之。

1.  在**程序包**中，您可以看到此存储库可用的所有程序包。选择程序包来了解有关程序包的更多信息。

1.  选择 “**查看连接说明**”，然后选择软件包管理器以了解如何对其进行配置 CodeArtifact。

1.  选择**应用存储库策略**来更新策略或向存储库添加资源策略。有关更多信息，请参阅 [存储库策略](repo-policies.md)。

1.  选择**编辑**来添加或更新以下项。
   +  存储库说明。
   +  与存储库关联的标签。
   +  如果您的存储库有外部连接，则可以更改它连接到哪个公有存储库。另外，您可以将一个或多个现有存储库添加为上游存储库。按照您希望在申请包裹 CodeArtifact 时按优先顺序排列它们。有关更多信息，请参阅 [上游存储库优先顺序](repo-upstream-search-order.md)。

## 查看或修改存储库配置 (AWS CLI)
<a name="config-repos-cli"></a>

要在中查看存储库的当前配置 CodeArtifact，请使用`describe-repository`命令。

```
aws codeartifact describe-repository --domain my_domain --domain-owner 111122223333 --repository my_repo
```

输出示例：

```
{
    "repository": {
        "name": "my_repo",
        "administratorAccount": "123456789012,
        "domainName": "my_domain",
        "domainOwner": "111122223333",
        "arn": "arn:aws:codeartifact:region-id:111122223333:repository/my_domain/my_repo"
        "upstreams": [],
        "externalConnections": []
    }
}
```

### 修改存储库上游配置
<a name="modify-upstream"></a>

借助上游存储库，程序包管理器客户端可以使用单个 URL 端点访问多个存储库中包含的程序包。要添加或更改存储库的上游关系，请使用 `update-repository` 命令。

```
aws codeartifact update-repository --domain my_domain --domain-owner 111122223333 --repository my_repo \
       --upstreams repositoryName=my-upstream-repo
```

输出示例：

```
{
    "repository": {
        "name": "my_repo",
        "administratorAccount": "123456789012,
        "domainName": "my_domain",
        "domainOwner": "111122223333",
        "arn": "arn:aws:codeartifact:region-id:111122223333:repository/my_domain/my_repo"
        "upstreams": [
            {
                "repositoryName": "my-upstream-repo"
            }
        ],
        "externalConnections": []
    }
}
```

**注意**  
要添加上游存储库，您必须拥有对上游存储库执行 `AssociateWithDownstreamRepository` 操作的权限。

要移除存储库的上游关系，请使用空列表作为 `--upstreams` 选项的参数。

```
aws codeartifact update-repository --domain my_domain --domain-owner 111122223333 --repository my_repo --upstreams []
```

输出示例：

```
{
    "repository": {
        "name": "my_repo",
        "administratorAccount": "123456789012,
        "domainName": "my_domain",
        "domainOwner": "111122223333",
        "arn": "arn:aws:codeartifact:region-id:111122223333:repository/my_domain/my_repo"
        "upstreams": [],
        "externalConnections": []
    }
}
```

# 存储库策略
<a name="repo-policies"></a>

CodeArtifact 使用基于资源的权限来控制访问权限。基于资源的权限让您可以指定能够访问存储库的用户，以及这些用户可以对该存储库执行的操作。默认情况下，只有存储库所有者有权访问存储库。您可以应用策略文档，让其他 IAM 主体可以访问您的存储库。

有关更多信息，请参阅[基于资源的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_resource-based)以及[基于身份的策略和基于资源的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)。

## 创建资源策略来授予读取访问权限
<a name="creating-a-resource-policy-to-grant-read-access"></a>

资源策略是 JSON 格式的文本文件。该文件必须指定主体 (actor)、一个或多个操作以及效果（`Allow` 或 `Deny`）。例如，以下资源策略向账户 `123456789012` 授予从存储库下载程序包的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:ReadFromRepository"
            ],
            "Effect": "Allow",
            "Principal": {
                 "AWS": "arn:aws:iam::123456789012:root"
            },
            "Resource": "*"
        }
    ]
}
```

------

由于策略仅针对策略所附加到的存储库的操作进行评估，因此无需指定资源。由于资源是隐含的，因此可以将 `Resource` 设置为 `*`。为了让程序包管理器可从这个存储库下载程序包，还需要创建域策略来实现跨账户访问。域策略必须至少向主体授予 `codeartifact:GetAuthorizationToken` 权限。有关授予跨账户访问权限的完整域策略的示例，请参阅这个[域策略示例](domain-policies.md#domain-policy-example)。

**注意**  
`codeartifact:ReadFromRepository` 操作只能在存储库资源上使用。您不能将程序包的 Amazon 资源名称 (ARN) 作为资源，将 `codeartifact:ReadFromRepository` 作为操作来允许对存储库中的程序包子集进行读取访问。给定的主体可以读取存储库中的所有程序包，也可以不读取任何程序包。

由于存储库中指定的唯一操作是 `ReadFromRepository`，因此账户 `1234567890` 中的用户和角色可以从存储库下载程序包。但是，他们无法对其执行其他操作（例如，列出程序包名称和版本）。通常，因为从存储库下载程序包的用户也需要以其他方式与存储库进行交互，所以除了 `ReadFromRepository` 之外，您还需要在以下策略中授予权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:DescribePackageVersion",
                "codeartifact:DescribeRepository",
                "codeartifact:GetPackageVersionReadme",
                "codeartifact:GetRepositoryEndpoint",
                "codeartifact:ListPackages",
                "codeartifact:ListPackageVersions",
                "codeartifact:ListPackageVersionAssets",
                "codeartifact:ListPackageVersionDependencies",
                "codeartifact:ReadFromRepository"
            ],
            "Effect": "Allow",
            "Principal": {
                 "AWS": "arn:aws:iam::123456789012:root"
            },
            "Resource": "*"
        }
    ]
}
```

------

## 设置策略
<a name="setting-a-policy"></a>

创建策略文档后，使用 `put-repository-permissions-policy` 命令将其附加到存储库：

```
aws codeartifact put-repository-permissions-policy --domain my_domain --domain-owner 111122223333 \
          --repository my_repo --policy-document file:///PATH/TO/policy.json
```

如果调用 `put-repository-permissions-policy`，则在评估权限时会忽略存储库上的资源策略。这样可以确保域的所有者不会将自己锁定在存储库之外，因而使他们无法更新资源策略。

**注意**  
 您不能向其他 AWS 账户授予使用资源策略更新仓库资源策略的权限，因为调用时会忽略资源策略 put-repository-permissions-policy。

示例输出：

```
{
    "policy": {
        "resourceArn": "arn:aws:codeartifact:region-id:111122223333:repository/my_domain/my_repo",
        "document": "{ ...policy document content...}",
        "revision": "MQlyyTQRASRU3HB58gBtSDHXG7Q3hvxxxxxxx="
    }
}
```

命令输出包含存储库资源的 Amazon 资源名称 (ARN)、策略文档的完整内容以及修订标识符。您可以使用 `--policy-revision` 选项将修订标识符传递给 `put-repository-permissions-policy`。这样可以确保覆盖文档的已知修订版，而不是由另一个作者设置的较新版本。

## 读取策略
<a name="reading-a-policy"></a>

使用 `get-repository-permissions-policy` 命令来读取策略文档的现有版本。要格式化输出来提高可读性，请将 `--output` 和 `--query policy.document` 与 Python `json.tool` 模块一起使用。

```
aws codeartifact get-repository-permissions-policy --domain my_domain --domain-owner 111122223333 \
          --repository my_repo --output text --query policy.document | python -m json.tool
```

示例输出：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": [
                "codeartifact:DescribePackageVersion",
                "codeartifact:DescribeRepository",
                "codeartifact:GetPackageVersionReadme",
                "codeartifact:GetRepositoryEndpoint",
                "codeartifact:ListPackages",
                "codeartifact:ListPackageVersions",
                "codeartifact:ListPackageVersionAssets",
                "codeartifact:ListPackageVersionDependencies",
                "codeartifact:ReadFromRepository"
            ],
            "Resource": "*"
        }
    ]
}
```

------

## 删除策略
<a name="deleting-a-policy"></a>

使用 `delete-repository-permissions-policy` 命令从存储库中删除策略。

```
aws codeartifact delete-repository-permissions-policy --domain my_domain --domain-owner 111122223333 \
          --repository my_repo
```

输出的格式与 `get-repository-permissions-policy` 命令的输出格式相同。

## 向主体授予读取访问权限
<a name="granting-read-access-to-specific-principals"></a>

 当您在策略文档中将账户的根用户指定为主体时，即向该账户中的所有用户和角色授予访问权限。要限制选定用户或角色的访问权限，请在策略的 `Principal` 部分使用他们的 ARN。例如，使用以下方法向账户 `123456789012` 中的 IAM 用户 `bob` 授予读取权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:ReadFromRepository"
            ],
            "Effect": "Allow",
            "Principal": {
                 "AWS": "arn:aws:iam::123456789012:user/bob"
            },
            "Resource": "*"
        }
    ]
}
```

------

## 授予对程序包的写入权限
<a name="granting-write-access-to-specific-packages"></a>

 `codeartifact:PublishPackageVersion` 操作用于控制发布程序包新版本的权限。与此操作一起使用的资源必须是程序包。 CodeArtifact 包的格式 ARNs 如下。

```
arn:aws:codeartifact:region-id:111122223333:package/my_domain/my_repo/package-format/package-namespace/package-name
```

以下示例显示了域 `my_domain` 的 `my_repo` 存储库中作用域为 `@parity` 且名称为 `ui` 的 npm 程序包的 ARN。

```
arn:aws:codeartifact:region-id:111122223333:package/my_domain/my_repo/npm/parity/ui
```

如果一个 npm 程序包没有作用域，那么它的 ARN 的命名空间字段为空字符串。以下示例显示了域 `my_domain` 的 `my_repo` 存储库中没有作用域且名称为 `react` 的程序包的 ARN。

```
arn:aws:codeartifact:region-id:111122223333:package/my_domain/my_repo/npm//react
```

以下策略向账户 `123456789012` 授予在 `my_repo` 存储库中发布 `@parity/ui` 版本的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:PublishPackageVersion"
            ],
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Resource": "arn:aws:codeartifact:us-east-1:111122223333:package/my_domain/my_repo/npm/parity/ui"
        }
    ]
}
```

------

**重要**  
要授予发布 Maven 和 NuGet 软件包版本的权限，请除添加以下权限外。`codeartifact:PublishPackageVersion`  
NuGet: `codeartifact:ReadFromRepository` 并指定存储库资源
Maven：`codeartifact:PutPackageMetadata`

 由于此策略将域和存储库指定为资源的一部分，所以仅当连接到该存储库时才允许发布。

## 授予对存储库的写入权限
<a name="granting-write-access-to-a-repository"></a>

 您可以使用通配符来授予对存储库中所有程序包的写入权限。例如，使用以下策略向账户授予对 `my_repo` 存储库中所有程序包的写入权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:PublishPackageVersion"
            ],
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Resource": "arn:aws:codeartifact:us-east-1:111122223333:package/my_domain/my_repo/*"
        }
    ]
}
```

------

## 存储库策略与域策略之间的交互
<a name="interaction-repo-domain-policies"></a>

 CodeArtifact 支持域和存储库的资源策略。资源策略是可选的。每个域可能有一个策略，域中的每个存储库可能都有自己的存储库策略。如果同时存在域策略和存储库策略，则在确定是否允许或拒绝对 CodeArtifact 存储库的请求时，将对两者进行评估。将使用以下规则对域策略和存储库策略进行评估：
+ 在执行账户级操作（例如[ListDomains](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListDomains.html)或）时，不会评估任何资源策略。[ListRepositories](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListRepositories.html)
+ 在执行域级操作（例如[DescribeDomain](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_DescribeDomain.html)或）时，不会评估任何存储库策略。[ListRepositoriesInDomain](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListRepositoriesInDomain.html)
+ 执行时不会对域策略进行评估[PutDomainPermissionsPolicy](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PutDomainPermissionsPolicy.html)。请注意，此规则可防止锁定。
+ 执行时会评估域策略 [PutRepositoryPermissionsPolicy](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PutRepositoryPermissionsPolicy.html)，但不评估存储库策略。
+ 任一策略中的显式拒绝都会覆盖另一策略中的允许。
+ 仅在一个资源策略中需要显式允许。如果域策略允许某项操作，则从存储库策略中省略该操作不会导致隐式拒绝。
+ 如果没有资源策略允许某项操作，则结果为隐式拒绝，除非调用主体的账户是域所有者或存储库管理员账户，并且基于身份的策略允许该操作。

 在单个账户场景中用于授予访问权限时，资源策略是可选的，在这种情况下，用于访问存储库的调用方账户与域所有者和存储库管理员账户相同。在跨账户场景中，调用方账户与域所有者或存储库管理员账户不同，此时需要资源策略来授予访问权限。中的跨账户访问 CodeArtifact 遵循跨账户访问的常规 IAM 规则，如 IA *M* 用户[指南中确定是否允许跨账户请求](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html#policy-eval-cross-account)中所述。
+ 可以通过基于身份的策略，向域所有者账户中的主体授予访问域中任何存储库的权限。请注意，在这种情况下，域策略或存储库策略不需要显式允许。
+ 可以通过域策略或存储库策略，向域所有者账户中的主体授予访问任何存储库的权限。请注意，在这种情况下，基于身份的策略不需要显式允许。
+ 可以通过基于身份的策略，向存储库管理员账户中的主体授予访问存储库的权限。请注意，在这种情况下，域策略或存储库策略不需要显式允许。
+ 只有在至少一个资源策略和至少一个基于身份的策略允许的情况下，另一个账户中的主体才能获得访问权限，并且没有任何策略显式拒绝该操作。

# 在中标记存储库 CodeArtifact
<a name="tag-repositories"></a>

标签是与 AWS 资源关联的键/值对。您可以将标签应用于中的仓库 CodeArtifact。有关 CodeArtifact 资源标记、用例、标签键和值限制以及支持的资源类型的信息，请参阅[为资源添加标签](tag-resources.md)。

您可以使用 CLI 在创建存储库时指定标签。您可以使用控制台或 CLI 来添加或删除标签，以及更新存储库中标签的值。您最多可以为每个存储库添加 50 个标签。

**Topics**
+ [标记存储库 (CLI)](#tag-repositories-tag-cli)
+ [标记存储库（控制台）](#tag-repositories-console)

## 标记存储库 (CLI)
<a name="tag-repositories-tag-cli"></a>

您可以使用 CLI 来管理存储库标签。

**Topics**
+ [向存储库添加标签 (CLI)](#add-repositories-tag-cli)
+ [查看存储库的标签 (CLI)](#list-repositories-tag-cli)
+ [编辑存储库的标签 (CLI)](#update-repositories-tag-cli)
+ [移除存储库的标签 (CLI)](#delete-repositories-tag-cli)

### 向存储库添加标签 (CLI)
<a name="add-repositories-tag-cli"></a>

您可以使用控制台或 AWS CLI 来标记存储库。

要在创建存储库为其添加标签，请参阅[创建 存储库](create-repo.md)。

在这些步骤中，我们假设您已安装最新版本的 AWS CLI 或已更新到当前版本。有关更多信息，请参阅[安装 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)。

在终端或命令行中运行 **tag-resource** 命令，并指定要添加标签的存储库的 Amazon 资源名称（ARN）以及要添加的标签的键和值。

**注意**  
要获取存储库的 ARN，请运行 `describe-repository` 命令：  

```
aws codeartifact describe-repository --domain my_domain --repository my_repo --query repository.arn
```

您可以将多个标签添加到一个存储库中。例如，要标记域*my\$1repo*中名为的存储库，该域名*my\$1domain*有两个标签，一个标签键名为*key1*的标签值为*value1*，一个标签键名为*key2*的标签值为*value2*：

```
aws codeartifact tag-resource --resource-arn arn:aws:codeartifact:us-west-2:111122223333:repository/my_domain/my_repo --tags key=key1,value=value1 key=key2,value=value2
```

如果成功，此命令没有输出。

### 查看存储库的标签 (CLI)
<a name="list-repositories-tag-cli"></a>

按照以下步骤使用 AWS CLI 来查看存储库的 AWS 标签。如果尚未添加标签，则返回的列表为空。

在终端或命令行中，运行 **list-tags-for-resource** 命令。

**注意**  
要获取存储库的 ARN，请运行 `describe-repository` 命令：  

```
aws codeartifact describe-repository --domain my_domain --repository my_repo --query repository.arn
```

例如，要查看名为 `arn:aws:codeartifact:us-west-2:111122223333:repository/my_domain/my_repo` ARN 的域*my\$1repo*中命名的仓库的标签键和标签值列表*my\$1domain*，请执行以下操作：

```
aws codeartifact list-tags-for-resource --resource-arn arn:aws:codeartifact:us-west-2:111122223333:repository/my_domain/my_repo
```

如果成功，该命令返回类似以下内容的信息：

```
{
    "tags": {
        "key1": "value1",
        "key2": "value2"
    }
}
```

### 编辑存储库的标签 (CLI)
<a name="update-repositories-tag-cli"></a>

按照以下步骤 AWS CLI 使用编辑存储库的标签。您可以更改现有键的值或添加另一个键。

在终端或命令行中运行 **tag-resource** 命令，指定要为其更新标签的存储库的 ARN 并指定标签键和标签值。

**注意**  
要获取存储库的 ARN，请运行 `describe-repository` 命令：  

```
aws codeartifact describe-repository --domain my_domain --repository my_repo --query repository.arn
```

```
aws codeartifact tag-resource --resource-arn arn:aws:codeartifact:us-west-2:111122223333:repository/my_domain/my_repo --tags key=key1,value=newvalue1
```

如果成功，此命令没有输出。

### 移除存储库的标签 (CLI)
<a name="delete-repositories-tag-cli"></a>

按照以下步骤使用从 AWS CLI 存储库中移除标签。

**注意**  
如果删除 存储库，则会从删除的存储库中删除所有标签关联。您无需在删除存储库之前移除标签。

在终端或命令行中运行 **untag-resource** 命令，指定要从中删除标签的存储库的 ARN 以及要删除的标签的标签键。

**注意**  
要获取存储库的 ARN，请运行 `describe-repository` 命令：  

```
aws codeartifact describe-repository --domain my_domain --repository my_repo --query repository.arn
```

例如，要在以标签键命名的域*my\$1repo*中删除存储库上的多个标签，*key1*并且*key2*：*my\$1domain*

```
aws codeartifact untag-resource --resource-arn arn:aws:codeartifact:us-west-2:111122223333:repository/my_domain/my_repo --tag-keys key1 key2
```

如果成功，此命令没有输出。移除标签后，您可以使用 `list-tags-for-resource` 命令查看存储库中剩余的标签。

## 标记存储库（控制台）
<a name="tag-repositories-console"></a>

您可以使用控制台或 CLI 来标记资源。

**Topics**
+ [向存储库添加标签（控制台）](#add-tag-repositories-console)
+ [查看存储库的标签（控制台）](#list-tag-repositories-console)
+ [编辑存储库的标签（控制台）](#update-tag-repositories-console)
+ [从存储库中移除标签（控制台）](#delete-tag-repositories-console)

### 向存储库添加标签（控制台）
<a name="add-tag-repositories-console"></a>

您可以使用控制台向现有存储库添加标签。

1. 在 [https://console.aws.amazon.com/codesuite/codeartifact](https://console.aws.amazon.com/codesuite/codeartifact/home) /hom AWS CodeArtifact e 打开控制台。

1. 在**存储库**页面上，选择要为其添加标签的存储库。

1. 展开**详细信息**部分。

1. 在**存储库标签**下面，如果存储库没有标签，请选择**添加存储库标签**。如果存储库有标签，请选择**查看和编辑存储库标签**。

1. 选择**添加新标签**。

1. 在**键**和**值**字段中，输入要添加的每个标签的文本。（**值**字段为可选项。） 例如，在**键**中，输入 **Name**。在**值**中，输入 **Test**。  
![\[存储库配置。\]](http://docs.aws.amazon.com/zh_cn/codeartifact/latest/ug/images/repo-add-tag-console.png)

1. （可选）选择**添加标签**以添加多行并输入多个标签。

1. 选择**更新存储库**。

### 查看存储库的标签（控制台）
<a name="list-tag-repositories-console"></a>

您可以使用控制台列出现有存储库的标签。

1. 在 [https://console.aws.amazon.com/codesuite/codeartifact](https://console.aws.amazon.com/codesuite/codeartifact/home) /hom AWS CodeArtifact e 打开控制台。

1. 在**存储库**页面上，选择要在其中查看标签的存储库。

1. 展开**详细信息**部分。

1. 在**存储库标签**下面，选择**查看和编辑存储库标签**。
**注意**  
如果未向此存储库添加任何标签，则控制台会显示**添加存储库标签**。

### 编辑存储库的标签（控制台）
<a name="update-tag-repositories-console"></a>

您可以使用控制台来编辑已添加到存储库的标签。

1. 在 [https://console.aws.amazon.com/codesuite/codeartifact](https://console.aws.amazon.com/codesuite/codeartifact/home) /hom AWS CodeArtifact e 打开控制台。

1. 在**存储库**页面上，选择要在其中更新标签的存储库。

1. 展开**详细信息**部分。

1. 在**存储库标签**下面，选择**查看和编辑存储库标签**。
**注意**  
如果未向此存储库添加任何标签，则控制台会显示**添加存储库标签**。

1. 在**键**和**值**字段中，根据需要更新每个字段的值。例如，对于 **Name** 键，在**值**中，将 **Test** 更改为 **Prod**。

1. 选择**更新存储库**。

### 从存储库中移除标签（控制台）
<a name="delete-tag-repositories-console"></a>

您可以使用控制台从存储库删除标签。

1. 在 [https://console.aws.amazon.com/codesuite/codeartifact](https://console.aws.amazon.com/codesuite/codeartifact/home) /hom AWS CodeArtifact e 打开控制台。

1. 在**存储库**页面上，选择要在其中删除标签的存储库。

1. 展开**详细信息**部分。

1. 在**存储库标签**下面，选择**查看和编辑存储库标签**。
**注意**  
如果未向此存储库添加任何标签，则控制台会显示**添加存储库标签**。

1. 接下来，对于您要删除的每个标签的键和值，选择**删除**。

1. 选择**更新存储库**。