AWS CLI 实战:使用codeartifact describe-repository查询 CodeArtifact 仓库详情
【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli
本指南以 AWS CLI 官方示例 describe-repository.rst 为蓝本,系统讲解aws codeartifact describe-repository命令的用法:如何传入--domain与--repository参数查询仓库信息、如何解读返回的RepositoryDescription对象中每个字段的含义,并结合本仓库内的服务模型(service-2.json)与相关示例(如 create-repository.rst、list-repositories.rst)深入剖析其底层实现。读完本文,你将掌握查询 CodeArtifact 仓库配置(上游仓库、外部连接、ARN、域归属等)的完整实操方法与诊断思路。
命令概览:一条命令拿到仓库全貌
aws codeartifact describe-repository是 AWS CLI 中 CodeArtifact 服务的查询类命令,其作用是从 CodeArtifact 服务端获取指定仓库的完整描述信息(RepositoryDescription)。该命令只读、不产生任何变更,适合在以下场景使用:
- 部署前核对仓库是否已创建、归属哪个域、属于哪个 AWS 账户;
- 排查仓库为何拉不到某个上游包——检查
upstreams与externalConnections配置; - 获取仓库 ARN 以在 IAM 策略、资源标签或自动化脚本中引用;
- 与
create-repository、update-repository的输出对比,验证配置是否生效。
其最小调用形式如下(取自仓库示例文档 describe-repository.rst):
aws codeartifact describe-repository \ --domain test-domain \ --repository test-repo命令执行后返回一个 JSON 对象,其中repository字段承载所有仓库信息:
{ "repository": { "name": "test-repo", "administratorAccount": "111122223333", "domainName": "test-domain", "domainOwner": "111122223333", "arn": "arn:aws:codeartifact:us-west-2:111122223333:repository/test-domain/test-repo", "description": "This is a test repository.", "upstreams": [], "externalConnections": [] } }提示:默认输出格式为 JSON。若只需 ARN 或某个字段,可结合
--query与--output text使用,例如aws codeartifact describe-repository --domain test-domain --repository test-repo --query 'repository.arn' --output text。
参数详解:必填与可选参数
从服务模型中DescribeRepositoryRequest的定义(service-2.json)可以看出,该接口接受三个参数,其中两个为必填:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
--domain | String | 是 | 包含目标仓库的 CodeArtifact 域的名称。域名称有严格的格式约束(见下文)。 |
--repository | String | 是 | 要查询的仓库名称。 |
--domain-owner | String | 否 | 拥有该域的 AWS 账户的 12 位账户 ID(不含短横线或空格)。默认情况下 AWS CLI 会使用当前凭据所属的账户,仅在查询其他账户共享给你的域时才有必要显式指定。 |
这三个参数在 HTTP 层面均通过 URL query string 传递(请求方法为GET /v1/repository),也就是说describe-repository是一次无请求体的只读 GET 调用,天然安全、可幂等重试。
名称约束:提前规避 400 错误
仓库中的名称不是任意字符串,服务模型给出了明确的格式校验:
- 域名称(
DomainName):长度 2~50 个字符,必须匹配正则[a-z][a-z0-9\-]{0,48}[a-z0-9](service-2.json),即小写字母开头、以小写字母或数字结尾,中间可含小写字母、数字与连字符。 - 账户 ID(
AccountId):固定 12 位数字,正则[0-9]{12}(service-2.json)。 - 仓库名称(
RepositoryName):长度 2~100 个字符,匹配[A-Za-z0-9][A-Za-z0-9._\-]{1,99}(service-2.json),字母、数字、点、下划线和连字符均可使用。
若传入的名称不合规或仓库不存在,服务端会返回ValidationException或ResourceNotFoundException,CLI 会将这些异常以错误消息的形式输出。查询前先通过aws codeartifact list-repositories或aws codeartifact list-repositories-in-domain(示例见 list-repositories.rst)确认名称拼写,可减少无效调用。
返回值逐字段解读:RepositoryDescription
接口的返回结构DescribeRepositoryResult只包含一个repository成员,其类型为RepositoryDescription(service-2.json)。下表对照示例输出逐字段解释:
| 字段 | 类型 | 含义 |
|---|---|---|
name | String | 仓库名称,与查询参数一致。 |
administratorAccount | String | 管理该仓库的 AWS 账户的 12 位账户 ID。 |
domainName | String | 仓库所属 CodeArtifact 域的名称。 |
domainOwner | String | 拥有该域的 AWS 账户的 12 位账户 ID(不含短横线与空格)。 |
arn | String | 仓库的 Amazon Resource Name(ARN),格式为arn:aws:codeartifact:<region>:<account-id>:repository/<domain>/<repository>,可用于 IAM 策略与资源级授权。 |
description | String | 仓库的文本描述(最长 1000 个字符,见Description类型定义,service-2.json)。 |
upstreams | List | 与仓库关联的上游仓库列表。列表中各上游仓库的顺序即优先级顺序——CodeArtifact 按此顺序查找请求的包版本(官方文档称之为 "Working with upstream repositories")。 |
externalConnections | List | 与仓库关联的外部连接数组(如公共 npm、PyPI、Maven 仓库的连接)。 |
createdTime | Timestamp | 仓库创建时间(示例输出中未展示,但服务模型已定义该字段)。 |
在示例输出中upstreams与externalConnections均为空数组[],表示这是一个尚未配置上游/外部连接的独立仓库——这与 create-repository.rst 中创建仓库时的初始状态完全一致(该示例创建的test-repo同样返回"upstreams": []与"externalConnections": [])。
上游仓库与外部连接:两个关键字段的诊断价值
upstreams(上游仓库):每个成员包含上游仓库的名称等信息。当仓库配置了上游后,包管理客户端(npm、pip、Maven、NuGet 等)在本地仓库找不到包时,会按upstreams列表中的顺序向上游继续查找。若你发现拉包行为异常(如拉到旧版本),应通过describe-repository核对upstreams的排列顺序。externalConnections(外部连接):每个成员形如RepositoryExternalConnectionInfo(service-2.json),包含externalConnectionName、packageFormat与status三个字段。packageFormat取值包括npm、pypi、maven、nuget、generic、ruby、swift、cargo等;status目前唯一的合法值是Available。
新增上游或外部连接分别对应aws codeartifact update-repository、associate-external-connection命令(示例见 associate-external-connection.rst),而查询其当前状态的最佳手段正是describe-repository。
典型实战场景
场景一:创建后立即验证仓库配置
配合 create-repository.rst 中的创建命令:
aws codeartifact create-repository \ --domain test-domain \ --domain-owner 111122223333 \ --repository test-repo \ --description "This is a test repository."执行成功后,运行describe-repository即可确认描述、ARN、归属账户均正确落库。两者的返回结构相同,便于直接比对。
场景二:跨账户查询共享域中的仓库
当仓库位于其他账户拥有的域中时,必须显式传入--domain-owner:
aws codeartifact describe-repository \ --domain shared-domain \ --domain-owner 222233334444 \ --repository shared-repo此时调用方需要具备对该域/仓库的读取权限(通常通过 CodeArtifact 的资源策略或 IAM 授权),否则会收到AccessDeniedException(HTTP 403,见DescribeRepository的错误列表,service-2.json)。
场景三:在脚本中解析仓库 ARN
在自动化脚本中提取仓库 ARN 用于后续 IAM 策略生成:
REPO_ARN=$(aws codeartifact describe-repository \ --domain test-domain \ --repository test-repo \ --query 'repository.arn' \ --output text) echo "$REPO_ARN" # 输出: arn:aws:codeartifact:us-west-2:111122223333:repository/test-domain/test-repo场景四:排查拉包失败
当pip install或npm install从 CodeArtifact 拉取包失败时,先用describe-repository检查upstreams与externalConnections是否为空、顺序是否符合预期;再配合aws codeartifact get-repository-endpoint --format pypi --domain test-domain --repository test-repo核对仓库端点,以及aws codeartifact get-authorization-token --domain test-domain获取临时令牌(有效期为 12 小时,相关逻辑见 login.py 中的CodeArtifactLogin.DESCRIPTION),形成完整的排查链路。
源码视角:命令背后的实现路径
服务模型:一切参数与返回结构的权威定义
describe-repository的命令骨架并非硬编码,而是由 botocore 从服务模型 service-2.json 自动生成的。关键定义包括:
- 操作定义(第 308-324 行):
"DescribeRepository",HTTP 方法GET,请求路径/v1/repository,声明了五种错误类型:AccessDeniedException、InternalServerException、ResourceNotFoundException、ThrottlingException、ValidationException。 - 请求结构(第 1716-1742 行):
DescribeRepositoryRequest,必填domain与repository,可选domainOwner。 - 响应结构(第 1743-1751 行):
DescribeRepositoryResult,单成员repository。 - 返回对象(第 3994-4035 行):
RepositoryDescription的全部字段定义。
AWS CLI 的codeartifact命令会自动读取该模型生成参数解析、校验与输出序列化逻辑。仓库中的examples-1.json与各类.rst示例文件(describe-repository.rst 等)则负责为命令生成帮助文档与示例。
配套命令:login 定制化逻辑
除标准的模型驱动命令外,aws codeartifact login是仓库中唯一带定制化实现的 CodeArtifact 命令,其源码位于 login.py。虽然它与describe-repository的查询能力无关,但二者常在同一条使用链路中出现:login内部会调用get_authorization_token与get_repository_endpoint来配置 npm/pip/NuGet 等工具(见 TOOL_MAP 中swift、nuget、dotnet、npm、pip、twine六种工具的映射),而describe-repository则用于确认仓库本身的配置状态。
测试与验证
在仓库的单元测试中,CodeArtifact 的模型驱动命令(包括describe-repository)由 botocore 的通用命令测试覆盖,验证了参数的序列化、错误映射与输出格式;login命令则有专门的定制测试,可参考tests/unit/customizations/codeartifact/目录下的测试用例(如test_login.py),其中对 token 过期时间计算(get_relative_expiration_time)、.npmrc/.pypirc写入等逻辑均有断言。这提示我们:凡是查询类命令,其参数与返回结构均以服务模型为准;凡是定制命令,其行为以customizations/下的源码为准。
常见错误与排查建议
| 报错现象 | 可能原因 | 排查动作 |
|---|---|---|
ResourceNotFoundException | 仓库不存在,或--domain/--repository拼写错误 | 先执行aws codeartifact list-repositories核对名称 |
AccessDeniedException(HTTP 403) | 当前账户无权读取该仓库/域 | 检查 IAM 策略与域的资源配置策略;跨账户查询时补传--domain-owner |
ValidationException | 名称违反格式约束(如域名为大写开头) | 对照上文名称约束一节核对正则 |
ThrottlingException | 请求过于频繁 | 适当退避重试 |
小结
aws codeartifact describe-repository是 CodeArtifact 运维与排障的基础命令:
- 两个必填参数
--domain与--repository,跨账户场景追加--domain-owner; - 返回的
RepositoryDescription覆盖仓库名称、管理员账户、所属域、ARN、描述、上游仓库、外部连接与创建时间八个维度; - 上游仓库顺序即拉包优先级,
externalConnections反映公共仓库连接状态,二者是诊断拉包问题的第一手证据; - 命令实现由服务模型驱动,参数与返回结构的权威定义位于 service-2.json,可随时查阅。
配合本仓库中的其他示例(create-repository.rst、update-repository.rst、associate-external-connection.rst)即可完成从创建、配置到查询验证的完整闭环。
【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考