AWS CLI 如何用 codeartifact login 为 npm 配置 CodeArtifact 仓库认证
如果你已经把 JS 包仓库托管在 AWS CodeArtifact 的 npm 格式仓库里,本地的 npm install / npm publish 会因为没有认证而被拒绝。AWS CLI 提供的 aws codeartifact login --tool npm 命令可以一步完成:获取临时授权令牌、把 CodeArtifact 仓库设置为 npm registry,并写入 npm 认证配置。命令执行成功后,本地 npm 即可直接访问该仓库,令牌最长有效期 12 小时,过期后需要重新执行登录。
前置条件
完成这个任务前需要确认三件事:
- 已安装 AWS CLI,并且凭证配置可以访问你的 CodeArtifact 资源(
login命令内部会调用GetAuthorizationToken和GetRepositoryEndpoint两个 API); - 已安装 npm。如果找不到工具,命令会报错
npm was not found. Please verify installation.(Windows 上 AWS CLI 会显式调用npm.cmd); - 已经存在一个 CodeArtifact 域(domain)和一个 npm 格式的仓库(repository),命令参数里会用到它们的名称。
执行登录
基本命令如下,--domain 和 --repository 是必填项,示例值 test-domain、test-repo 来自仓库示例文档,替换为你自己的名称:
aws codeartifact login \
--domain test-domain \
--repository test-repo \
--tool npm
命令成功后,标准输出(文档示例):
Successfully configured npm to use AWS CodeArtifact repository https://test-domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/npm/test-repo/
Login expires in 12 hours at 2020-11-12 01:53:16-05:00
这两行分别告诉你:npm 已指向哪个仓库端点(你的域名、账户 ID、区域不同,端点也不同),以及本次登录信息的过期时间。
登录命令实际做了什么
结合 login 命令实现,--tool npm 时的动作是:
- 写入
~/.npmrc:追加或更新一行//<仓库主机名和路径>:_authToken=<授权令牌>。如果设置了环境变量NPM_CONFIG_USERCONFIG,则写入该变量指向的文件而不是默认的~/.npmrc; - 执行
npm config set registry <仓库端点>,把 CodeArtifact 仓库设为 npm registry; - 执行
npm config set //<仓库主机名和路径>:always-auth true,让 npm 对该仓库始终要求认证。
因此登录完成后,可以直接检查 ~/.npmrc 中是否出现了对应仓库的 _authToken 条目,作为配置已写入的依据。
可选参数
login 命令的完整参数定义见 实现文件中的 ARG_TABLE:
| 参数 | 用途 |
|---|---|
--domain-owner | 可选。拥有该 CodeArtifact 域的 AWS 账户 ID |
--namespace | 可选。把命名空间关联到仓库工具。npm 支持该参数:传入 namespace 后等价于设置 @namespace:registry(缺少 @ 前缀会自动补上),而不是把整个默认 registry 指向 CodeArtifact |
--duration-seconds | 可选。以秒为单位指定登录信息的有效期 |
--endpoint-type | 可选。指定工具要交互的端点类型(会透传给 GetRepositoryEndpoint 的 endpointType 参数) |
--dry-run | 只打印将要执行的命令,不修改任何配置。注意:dry-run 输出会包含未脱敏的授权令牌,不要在公共环境直接展示 |
带命名空间的例子:
aws codeartifact login \
--domain test-domain \
--repository test-repo \
--tool npm \
--namespace @myorg
命名空间有格式限制:只允许 URL-safe 字符,不能以点或下划线开头,否则报错 Invalid scope name, scope must contain URL-safe characters, no leading dots or underscores。
验证配置结果
验证分两层:
- 命令输出:看到
Successfully configured npm to use AWS CodeArtifact repository ...及过期时间行,说明令牌获取、仓库端点解析和 npm 配置写入都已完成; - 配置文件:检查
~/.npmrc(或NPM_CONFIG_USERCONFIG指向的文件)中存在该仓库对应的_authToken行,以及 npm 配置中 registry 已指向 CodeArtifact 端点。可以用 get-repository-endpoint 示例 中的命令独立核对端点地址:
aws codeartifact get-repository-endpoint \
--domain test-domain \
--repository test-repo \
--format npm
常见报错与边界
- 找不到工具:
npm was not found. Please verify installation.,先确认 npm 已安装且在 PATH 中。 - 底层命令失败:登录过程中执行的 npm 子命令如果返回非零退出码,AWS CLI 会抛出
CommandFailedError,错误信息中授权令牌会被替换为******(脱敏),并附上子命令的 stderr 输出,可据此定位具体失败原因。 - npm 9 的 always-auth 报错被忽略:npm 9 及以上版本移除了
always-auth支持,设置该配置会返回非零退出码。AWS CLI 对此做了特殊处理:忽略这条报错,登录整体仍视为成功(见 功能测试 test_npm_login_always_auth_error_ignored)。 --namespace不适用于所有工具:它只对支持命名空间的工具(npm、swift)生效;对 pip、twine、nuget、dotnet 传入会报错,例如Argument --namespace is not supported for pip。- 12 小时有效期:命令描述明确写了 login information is valid for up to 12 hours after which you must login again。到期后 npm 访问会失去认证,重新执行一次 login 即可。
如果不想真正修改本地配置、只想确认将要执行的命令,可以加 --dry-run 预演,再按上面的实际命令执行。更多 npm 配置 CodeArtifact 的背景,可参考 AWS CodeArtifact User Guide 中 Getting started with the AWS CLI 一节(login 示例文档 中有指向)。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



