我在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问题">