如何无需凭证实现AWS CodeArtifact仓库的公网访问或VPC内访问?
针对你想让公司VPN用户和第三方系统,在无需安装AWS客户端、不用凭证的情况下,直接通过pip install --extra-index-url命令访问CodeArtifact仓库的需求,我整理了两种适配你场景的方案,重点推荐VPC内访问的配置——毕竟你的用户和系统都部署在同一VPC中:
方案一:VPC内无凭证访问(推荐)
利用AWS VPC端点实现VPC内资源直接访问CodeArtifact,流量完全在AWS内部传输,安全且无需凭证,步骤如下:
创建CodeArtifact的VPC端点
- 登录AWS控制台,进入VPC服务,找到「端点」菜单点击「创建端点」
- 服务类型选「AWS服务」,搜索
codeartifact,选中对应区域的com.amazonaws.<你的区域>.codeartifact服务 - 选择你的目标VPC、用户/系统所在的子网,以及允许VPC内443端口流量的安全组(确保安全组放行VPC内的入站HTTPS请求)
- 完成创建后,VPC内的资源就能通过这个端点直接访问CodeArtifact
更新CodeArtifact仓库的资源策略
给仓库添加允许VPC内所有主体只读访问的策略,这样VPC内的请求不需要凭证就能拉取包。在CodeArtifact控制台的仓库「权限」页面,添加以下策略(记得替换占位符):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": [ "codeartifact:GetPackageVersionAsset", "codeartifact:GetPackageVersionReadme", "codeartifact:ListPackageVersions", "codeartifact:ListPackages", "codeartifact:DescribePackageVersion", "codeartifact:ReadFromRepository" ], "Resource": "arn:aws:codeartifact:eu-west-1:domain-owner-id:repository/my-domain/my-repo", "Condition": { "StringEquals": { "aws:SourceVpc": "vpc-你的VPC-ID" } } } ] }这个策略只开放了pip安装所需的只读权限,避免了不必要的安全风险。
验证访问
现在VPC内的机器或第三方系统,直接用你想要的命令即可安装包(注意URL必须加上/simple/后缀,pip需要这个路径识别索引):pip install --extra-index-url https://my-domain-<domain-owner-id>.d.codeartifact.eu-west-1.amazonaws.com/pypi/my-repo/simple/ package_name如果你用
requirements.txt,可以直接添加:--extra-index-url https://my-domain-<domain-owner-id>.d.codeartifact.eu-west-1.amazonaws.com/pypi/my-repo/simple/ package_name另外,通过VPN连接到VPC的用户,只要流量进入了目标VPC,也能无凭证访问。
方案二:公网无凭证访问(可选)
如果之后需要公网环境下的无凭证访问,可以通过限制IP范围来实现:
更新仓库资源策略
添加允许指定公网IP访问的策略,比如公司办公IP段或第三方系统的公网IP:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": [ "codeartifact:GetPackageVersionAsset", "codeartifact:GetPackageVersionReadme", "codeartifact:ListPackageVersions", "codeartifact:ListPackages", "codeartifact:DescribePackageVersion", "codeartifact:ReadFromRepository" ], "Resource": "arn:aws:codeartifact:eu-west-1:domain-owner-id:repository/my-domain/my-repo", "Condition": { "IpAddress": { "aws:SourceIp": [ "192.168.1.0/24", # 公司办公IP段 "203.0.113.10/32" # 第三方系统公网IP ] } } } ] }开启仓库公网访问
在CodeArtifact控制台的仓库「设置」页面,将「访问控制」改为「公网和VPC」,确保公网流量能到达仓库。验证公网访问
用同样的pip命令即可在指定IP范围内无凭证安装包。
重要注意事项
- 一定要确保CodeArtifact的PyPI索引URL带有
/simple/后缀,否则pip会无法识别包索引 - 资源策略遵循最小权限原则,只开放必要的只读操作,不要授予发布包等写权限
- VPC端点方案比公网方案更安全,因为流量完全在AWS内部传输,不会暴露到公网
内容的提问来源于stack exchange,提问作者marqram

