使用twine上传Python包至AWS CodeArtifact时遇401未授权错误求助
排查Twine上传AWS CodeArtifact 401过期凭证问题的思路
检查
.pypirc配置的准确性
打开~/.pypirc文件,确认[myrepo]段的配置:repository地址必须和登录成功返回的地址完全一致username必须是awspassword是最新生成的CodeArtifact临时令牌(不是AWS的access key),且没有被意外覆盖。如果不确定,手动重新执行aws codeartifact login命令,然后立刻查看文件内容是否更新。
排除AWS凭证链干扰
Twine可能优先读取环境变量AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY,而不是.pypirc里的临时令牌。可以暂时清空这些环境变量后重试:unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN另外,确保上传时没有通过命令行参数指定其他凭证,覆盖了
.pypirc的配置。校准本地系统时间
CodeArtifact的临时令牌对时间精度要求高,若本地时间与AWS服务器时间偏差超过5分钟,会被判定为过期。用NTP同步系统时间,比如:# Linux sudo ntpdate pool.ntp.org # macOS sudo sntp -sS time.apple.com手动生成令牌验证有效性
跳过aws codeartifact login,手动生成授权令牌并替换到.pypirc中:aws codeartifact get-authorization-token --domain mydomain --domain-owner 111122223333 --region us-east-1 --profile myprofile --query authorizationToken --output text将输出的令牌复制到
.pypirc的password字段,再执行twine上传。如果还是失败,说明令牌本身有问题,需要检查IAM权限或账户配置。确认IAM权限是否足够
登录成功仅代表有访问仓库的权限,但上传包需要codeartifact:PutPackageVersion权限。检查当前IAM用户/角色的权限策略,确保包含以下权限:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codeartifact:PutPackageVersion", "codeartifact:DescribePackageVersion" ], "Resource": "arn:aws:codeartifact:us-east-1:111122223333:repository/mydomain/myrepo" } ] }升级Twine到最新版本
旧版Twine可能存在与CodeArtifact API的兼容性问题,导致凭证处理错误。执行升级命令:pip install --upgrade twine升级后重新尝试上传。
用Curl直接测试凭证
绕过Twine,用Curl测试凭证是否有效:curl -u aws:<你的令牌> https://mydomain-111122223333.d.codeartifact.us-east-1.amazonaws.com/pypi/myrepo/simple/如果返回401,说明令牌无效或权限不足;如果返回200,说明Twine的配置存在问题,需进一步检查Twine的参数或配置文件。
内容的提问来源于stack exchange,提问作者polo
相关产品推荐
相关产品推荐

