.NET环境下向私有子网S3存储桶上传文件返回403错误如何解决
私有子网S3上传403错误修复方案
1. 修复S3配置的ServiceURL格式错误
你当前代码中的ServiceURL不符合VPC端点的标准格式,正确格式为:https://<bucket-name>.<vpce-id>.s3.<aws-region>.vpce.amazonaws.com
你需要将其中的占位符替换为你实际的桶名、S3 VPC端点ID、AWS区域编码。
2. 检查必要权限配置
- IAM身份权限:你所使用的AccessKey对应的IAM用户/角色,必须添加如下最小权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::test/*" } ] }
如果你的S3桶开启了KMS默认加密,还需要额外添加KMS相关权限:
{ "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "<你的KMS密钥ARN>" }
- VPC端点策略:确认你使用的S3 VPC端点的访问策略允许当前子网资源、当前IAM身份对
test桶执行写入操作。 - 桶策略:确认
test桶的桶策略没有禁止你使用的IAM身份执行上传操作。
3. 补充异常调试逻辑的完整代码示例
var s3Config = new AmazonS3Config() { ServiceURL = "https://test.<替换为你的VPC端点ID>.s3.<替换为你的AWS区域>.vpce.amazonaws.com", RegionEndpoint = Amazon.RegionEndpoint.GetBySystemName("<替换为你的AWS区域编码,例如cn-north-1>") }; using (var cli = new AmazonS3Client( awsAccessKey, awsSecretKey, s3Config)) { try { PutObjectRequest req = new PutObjectRequest() { BucketName = "test", ContentType = "image/jpg", InputStream = st, Key = fileName }; var response = cli.PutObject(req); } catch (AmazonS3Exception ex) { // 输出AWS返回的具体错误码,方便定位问题 Console.WriteLine($"AWS错误码:{ex.ErrorCode}, 错误信息:{ex.Message}"); throw; } }
错误截图参考

内容的提问来源于stack exchange,提问作者Anjali
相关产品推荐
相关产品推荐

