使用 AWS CLI 的 put-repository-permissions-policy 为 CodeArtifact 仓库配置资源访问策略
使用 AWS CLI 的 put-repository-permissions-policy 为 CodeArtifact 仓库配置资源访问策略【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli导读本指南围绕 AWS CLI 中的aws codeartifact put-repository-permissions-policy命令展开讲解如何为 CodeArtifact 仓库repository附加基于资源resource-based的权限策略从而精细控制哪些账号、角色可以读取或管理仓库中的软件包。读完本文你将掌握该命令的完整参数、策略文档policy document的写法、返回结果的含义、乐观锁optimistic locking的用法以及配套的读取与删除策略命令能够直接在自己的 CodeArtifact 域与仓库上落地一套可复用的访问控制方案。命令概览什么是仓库权限策略在 AWS CodeArtifact 中权限控制分为两个层级域domain级资源策略和仓库repository级资源策略。仓库级资源策略直接挂在某个仓库上指定该仓库可以被哪些主体Principal执行哪些codeartifact:操作例如从仓库拉取包、列出包版本等。对应的 AWS CLI 命令aws codeartifact put-repository-permissions-policy会在仓库上创建或替换这份资源策略。仓库awscli/examples/codeartifact/put-repository-permissions-policy.rst中给出了该命令最典型的用法aws codeartifact put-repository-permissions-policy \ --domain test-domain \ --repository test-repo \ --policy-document file://PATH/TO/policy.json执行成功后命令返回仓库上当前生效的策略对象包含资源 ARN、策略文档正文和修订号revision{ policy: { resourceArn: arn:aws:codeartifact:region-id:111122223333:repository/test-domain/test-repo, document: { ...policy document content...}, revision: MQlyyTQRASRU3HB58gBtSDHXG7Q3hvxxxxxxx } }其中revision是一个不透明字符串用于后续更新策略时的乐观锁校验详见下文「使用 policyRevision 实现乐观锁」一节。参数详解与取值范围从底层 API 模型 awscli/botocore/data/codeartifact/2018-09-22/service-2.json 的PutRepositoryPermissionsPolicyRequest结构可以看出该操作通过 HTTPPUT /v1/repository/permissions/policy实现请求参数如下参数是否必填说明取值约束来自 service-2.json--domain是包含目标仓库的 CodeArtifact 域名DomainName1–100 个非空白字符\S--domain-owner否拥有该域的 12 位 AWS 账号 ID不带横线或空格AccountId默认取当前凭证所属账号--repository是要设置资源策略的仓库名RepositoryName2–100 个字符--policy-document是合法的、可展示的 JSON 策略字符串PolicyDocument长度 1–7168模式[\P{C}\s]--policy-revision否资源策略的当前修订号用于乐观锁PolicyRevision长度 1–100 的非空白字符串需要特别注意的是--policy-document的容量上限策略文档正文最大 7168 个字符。如果策略过于庞大会触发校验类错误需要精简 Statement 或拆分到多个资源策略。从文件加载策略文档CLI 支持从本地文件读取 JSON 策略写法为file://前缀--policy-document file://PATH/TO/policy.json其中PATH/TO/policy.json应替换为你本地存放策略 JSON 的绝对路径或相对路径。CLI 会读取文件内容并将其作为policyDocument传给服务端。也可以直接内联传入 JSON 字符串注意转义但从文件加载更利于维护和复用。如何编写仓库策略文档policy.jsonput-repository-permissions-policy本身不关心策略的语义只要它是合法 JSON 且不超过 7168 字符即可。一份典型的仓库只读策略可以参考同目录下读取策略的示例 awscli/examples/codeartifact/get-repository-permissions-policy.rst它展示了附着在仓库上的策略文档结构{ Version: 2012-10-17, Statement: [ { Effect: Allow, Principal: { AWS: arn:aws:iam::111122223333:root }, Action: [ codeartifact:DescribePackageVersion, codeartifact:DescribeRepository, codeartifact:GetPackageVersionReadme, codeartifact:GetRepositoryEndpoint, codeartifact:ListPackages, codeartifact:ListPackageVersions, codeartifact:ListPackageVersionAssets, codeartifact:ListPackageVersionDependencies, codeartifact:ReadFromRepository ], Resource: * } ] }要点说明Version固定使用策略语言版本2012-10-17。Principal指明策略授权给谁。上面的例子授权给账号111122223333的根用户也可以替换为具体的 IAM 角色 ARN例如arn:aws:iam::111122223333:role/CodeArtifactReader。ActionReadFromRepository是仓库读取类操作的核心权限ListPackages、ListPackageVersions、DescribeRepository等则覆盖浏览与元数据读取场景。若需要跨账号拉包务必包含ReadFromRepository和GetRepositoryEndpoint。Resource示例使用*匹配仓库内所有资源是仓库策略中最常见的写法如需精确控制也可以指向具体资源 ARN。编写完成后保存为policy.json再通过file://传入命令即可。返回值解析命令输出中的policy对象对应 API 模型中的ResourcePolicy结构见 awscli/botocore/data/codeartifact/2018-09-22/service-2.json包含三个字段字段类型含义resourceArnstring与该资源策略关联的仓库 ARN形如arn:aws:codeartifact:region:account-id:repository/domain/repositorydocumentstringJSON 格式的资源策略正文即你提交的策略文档revisionstring该资源策略的当前修订号供下一次更新时做并发控制使用 policyRevision 实现乐观锁仓库资源策略可能被多个管理员或自动化流程修改。为避免互相覆盖PutRepositoryPermissionsPolicyRequest提供了可选的policyRevision参数见 service-2.json设置资源策略的修订号用于乐观锁定防止他人覆盖你对仓库资源策略的修改。使用方式分两步先用aws codeartifact get-repository-permissions-policy --domain test-domain --repository test-repo读取当前策略从返回结果中取出policy.revision再在更新命令中带上该修订号aws codeartifact put-repository-permissions-policy \ --domain test-domain \ --repository test-repo \ --policy-document file://policy.json \ --policy-revision MQlyyTQRASRU3HB58gBtSDHXG7Q3hvxxxxxxx如果服务端检测到当前修订号与你传入的不一致说明策略已被他人修改请求会失败从而避免静默覆盖他人的变更。若你确实希望无条件覆盖不传--policy-revision即可。底层实现与错误处理该命令对应的底层 API 在 awscli/botocore/data/codeartifact/2018-09-22/service-2.json 中被定义为PutRepositoryPermissionsPolicy其文档明确指出一个容易被忽略的安全语义调用PutRepositoryPermissionsPolicy时评估权限会忽略仓库上现有的资源策略。这确保仓库所有者不会因误设策略而把自己锁在仓库之外导致无法再更新资源策略。也就是说该操作不要求调用者已被仓库现有策略授权只有拥有足够 IAM 权限的用户或角色即可设置/更新仓库策略。该操作可能抛出的异常类型同样定义在模型文件中包括AccessDeniedException调用者缺少codeartifact:PutRepositoryPermissionsPolicy相关权限ConflictException策略修订号冲突乐观锁失败或并发修改ResourceNotFoundException指定的域或仓库不存在ServiceQuotaExceededException策略大小或数量超出配额ThrottlingException/ValidationException/InternalServerException限流、参数校验失败或服务端内部错误。当命令执行失败时AWS CLI 会将这些异常渲染为带错误码与消息的输出便于定位问题例如策略文档超过 7168 字符会触发ValidationException。配套命令读取与删除仓库策略put-repository-permissions-policy通常与下面两个命令配合使用构成仓库策略的完整生命周期读取策略aws codeartifact get-repository-permissions-policy --domain test-domain --repository test-repo用于查看当前策略与获取revision完整示例见 get-repository-permissions-policy.rst。删除策略aws codeartifact delete-repository-permissions-policy --domain test-domain --repository test-repo移除仓库上的资源策略恢复默认的基于身份的 IAM 权限控制示例见 delete-repository-permissions-policy.rst。如果你的控制目标是整个域下的所有仓库还可以使用aws codeartifact put-domain-permissions-policy设置域级资源策略示例见 put-domain-permissions-policy.rst。域策略与仓库策略可以叠加使用实际生效权限取二者的并集语义因此在设计跨账号访问时建议同时审视这两个层级的策略。实践建议以文件形式管理策略文档将策略 JSON 纳入版本控制通过file://引用便于审计与回滚。先读后写善用乐观锁在自动化更新流程中先get-repository-permissions-policy拿到revision再携带--policy-revision写入避免并发覆盖。最小化授权仅开放业务所需的codeartifact:操作如仅需拉包就只给ReadFromRepository相关权限不要直接使用通配 Action。验证效果写入后立即用get-repository-permissions-policy复核文档内容与revision确认策略已按预期生效。通过put-repository-permissions-policy你可以把 CodeArtifact 仓库的访问边界精确收敛到指定的账号与角色为软件包供应链的跨账号共享、CI/CD 拉包等场景建立可靠的授权基础。【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考