无需认证通过AWS内部VPC访问S3 Bucket的可行方案咨询
解决方案:VPC内无认证访问S3 + 外部IAM角色访问并存
可以实现你的需求,核心是通过S3网关型VPC端点结合存储桶策略来区分VPC内和外部的访问规则,同时保持对象私有、公共访问禁用。
1. 创建S3网关型VPC端点
- 在AWS控制台或通过
aws ec2 create-vpc-endpoint命令创建S3网关端点,关联到你的EKS集群节点所在的私有子网。 - 确保私有子网的路由表中添加指向该端点的路由,目标前缀为S3对应区域的前缀(如
pl-xxxxxx),目标为VPC端点ID。 - 网关端点无额外收费,仅允许同区域VPC内流量访问S3,不走公网。
2. 配置存储桶策略
编写存储桶策略,同时允许两种访问场景:VPC内无认证访问、指定外部IAM角色的认证访问。策略示例如下(替换占位符为实际资源信息):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*" ], "Condition": { "StringEquals": { "aws:SourceVpc": "vpc-xxxxxxxxx" // EKS集群所在VPC ID } } }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/your-external-access-role" // 外部访问用的IAM角色ARN }, "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*" ] }, { "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*" ], "Condition": { "Bool": { "aws:SecureTransport": "false" } } } ] }
- 第一条规则:允许指定VPC内的所有请求(无需IAM认证)执行指定S3操作;
- 第二条规则:允许指定IAM角色执行S3操作(外部访问需通过该角色认证);
- 第三条规则:强制所有请求使用HTTPS,提升传输安全性。
3. 验证GitLab Runner访问
- 确认EKS私有节点在关联网关端点的子网内,且路由表配置正确;
- GitLab Runner无需配置任何AWS凭证环境变量,直接使用S3区域域名(如
your-bucket-name.s3.us-east-1.amazonaws.com)或路径式访问即可完成对象操作。
关键注意事项
- S3网关端点仅支持同区域访问,确保EKS集群与S3存储桶在同一AWS区域;
- 存储桶策略权限最小化,仅授予实际需要的操作(如仅读取则保留
s3:GetObject和s3:ListBucket); - 保持存储桶公共访问完全阻止的设置,该设置会覆盖策略中的公共访问规则,确保对象私有;
- 外部访问的IAM角色需自身具备对应S3权限(通过IAM策略授予),存储桶策略仅作为访问允许的补充。
内容的提问来源于stack exchange,提问作者Abdullah Khawer
相关产品推荐
相关产品推荐

