AWS S3 headObject未返回JS SDK中的所有元数据值



我在AWS S3存储桶中有一个对象,上面设置了一些元数据密钥。我在AWS v2 JavaScript SDK中使用headObject()获取密钥和值。

const headParams = {
Bucket: "THE_BUCKET", 
Key: "THE_KEY"
};
S3.headObject(headParams, (err, data) => {
if(err) {
console.log(err);
} else {
console.log(data);
}
});

如果我那么";修改";使用copyObject():的按键之一

objectMetadata["SOME_EXISTING_METADATA_KEY"] = "Some New Value";
const params = {    
Bucket: "THE_BUCKET", 
Key: "THE_KEY",
CopySource: "THE_BUCKET/THE_KEY",
MetadataDirective: "REPLACE",
ACL: "public-read",
'Metadata': objectMetadata
};
S3.copyObject(params, (err, data) => {
if(err) {
console.log(err);
} else {
console.log(data);
}
});

然后再次调用headObject(),我得到了更新后的值,正如预期的那样。

如果我使用上面相同的copyObject()代码,但尝试添加对象上不存在的新元数据密钥:

...
objectMetadata["SOME_NEW_METADATA_KEY"] = "Some New Value";
...

我在S3控制台中看到了新的值,但当我再次调用headObject()时,新的元数据键不会出现。

但是,LastModified标头中的时间戳显示,当我添加新密钥时,对象已被修改。而且,如果我使用AWS CLI检索同一对象的元数据,则会出现新的密钥:

aws s3api head-object --bucket THE_BUCKET --key THE_KEY
{
"AcceptRanges": "bytes",
"LastModified": "2021-05-03T19:06:14+00:00",
"ContentLength": 18340648,
"ETag": ""a8..."",
"ContentType": "application/octet-stream; charset=UTF-8",
"Metadata": {
...
"SOME_NEW_METADATA_KEY": "Some New Value",
...
}
}

有人见过这种行为吗?我不明白为什么这个键会出现在控制台和CLI的结果中,但不会出现在JavaScriptSDK中。特别是因为SDK显示了更新现有密钥的结果。

我的一位同事找到了这件事。如果其他人遇到这个问题,结果是CORS配置问题*。

每个元数据键都需要显式添加为CORS配置中的ExposeHeader条目。

这是CORS配置中的相关部分,您可以在S3中的"权限"选项卡下编辑该部分;跨来源资源共享;区段:

"ExposeHeaders": [
...
"SOME_EXISTING_METADATA_KEY",
"SOME_NEW_METADATA_KEY"
]

*应该知道的。正如我祖父喜欢说的那样;当网络上的某些东西不能正常工作时,可能是CORS问题">

最新更新