我們的對象存儲是基於ceph的對象存儲搭建的,測試環境是N版本的,生產環境是M版本的。業務使用的是doesObjectExist這個API,核心Java代碼如下
boolean exists = s3Client.doesObjectExist(bucketName, object+"ss");
if (exists) {
System.out.println("Object \"" + bucketName + "/" + object + "\" exists!");
}
else {
System.out.println("Object \"" + bucketName + "/" + object + "\" does not exist!");
}
doesObjectExist本質上是通過HTTP HEAD請求,檢查存儲是否存在。這個API在測試環境運行ok,但生產環境卻是403異常,通過抓包測試可以發現,當使用普通用戶返回403,但如果是用admin則是404.如下
一開始我們以爲是授權問題,因爲S3標準是這樣的寫的
簡單來說就是如果有ListBucket權限就返回404,沒有就返回403。但我們反覆檢查策略,即便是放開所有權限都不行
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAll",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::<bucket>/*",
"arn:aws:s3:::<bucket>"
]
}
]
}
並且測試環境和生產環境使用相同的策略。那麼只可能是生產環境這個版本的有bug。
最終我們找到bug
就是在policy校驗的地方有問題,原來的代碼只有admin才能校驗通過。
解決辦法就是升級ceph,還好只是小版本的更新!