在javascript中从EC2获取凭据
我已经实现了一个javascript函数,它从ajax获取AWS凭据并将文件上传到s3。 现在,我希望避免从ajax获取凭据,而从ec2检索凭据。 代码如下:在javascript中从EC2获取凭据,javascript,amazon-web-services,amazon-s3,Javascript,Amazon Web Services,Amazon S3,我已经实现了一个javascript函数,它从ajax获取AWS凭据并将文件上传到s3。 现在,我希望避免从ajax获取凭据,而从ec2检索凭据。 代码如下: function upload_file(entity_key_arg){ var accessKeyId,secretAccessKey,s3region,Bucket,link_to_file; $.ajax({ async : true, 'type' : "POST",
function upload_file(entity_key_arg){
var accessKeyId,secretAccessKey,s3region,Bucket,link_to_file;
$.ajax({
async : true,
'type' : "POST",
'global' : false,
'dataType' : 'json',
'url' : getUrl('getConfigFile'),
'data' : {
'token' : sessionStorage.getItem("token")
},
'success' : function(data) {
if(data.msg == "Error"){
throw_to_login_page();
}
var ssToken = data.data.ssToken;
accessKeyId = data.data.S3AccessKey;
secretAccessKey = data.data.secretAccessKey;
s3region = data.data.S3Region;
link_to_file = data.data.link_to_file;
Bucket = data.data.Bucket;
AWS.config.update({
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey,
region: s3region
});
//AWS.Credentials(sessionToken = ssToken);
var s3 = new AWS.S3();
var file = document.getElementById('file_select').files[0];
if (file == null) {
return alert('Please choose a file to upload first.');
}
if(file.size >= 1024 * 1024 * 5){
alert("The Maximum file size is 5MB")
}
else{
var file_description = $("#attach_file_description_field").val();
var file_name_from_input = $("#file_name_field").val();
file_type = file.name.split(".")[file.name.split(".").length-1];
var fileName = data.data.client_key+"/Files/"+entity_key_arg+"_"+file_name_from_input+"."+file_type;
var link_to_file = link_to_file + fileName
var params = {
Bucket: Bucket,
Key: fileName,
Body: file,
ACL: 'public-read'
};
s3.upload(params, function(err, data) {
if (err) {
return alert('There was an error uploading your photo: ', err.message);
}
else{
$("#add_file_modal").css("display","none");
$.post(getUrl('insert_file'),
{
'token' : sessionStorage.getItem("token"),
'entity_key': entity_key_arg,
'entity_type': new RegExp("ALR").test(entity_key_arg) || new RegExp("MAN").test(entity_key_arg)? "ALERT":"CUST",
'file_path': link_to_file,
'file_name': $("#file_name_field").val(),
'file_desc': $("#attach_file_description_field").val()
},function(ans){
if(ans.msg == "Error"){
throw_to_login_page();
}
get_attachments(entity_key_arg);
populate_audit_table(entity_key_arg);
});
}
});
}
}
}
);
}
我已经为aws创建了一个完全访问s3的IAM角色,并将其连接到ec2。
上面的JS函数是web应用程序的一部分,它使用tomcat部署在ec2内部。CORS也是可以的,但是有了这些,一旦我在我的函数中注释了凭证部分,我就不能上传文件了
/*AWS.config.update({
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey,
region: s3region
});*/
我一直被拒绝访问。
当我尝试通过CLI将文件从ec2上传到s3时,我成功了,并且在需要的地方没有凭据,因此附加到ec2的IAM角色可以访问s3
对部署在机器内部的js文件的访问被拒绝的原因可能是什么?我如何调试这个?
(CORS已完全打开..)这真是令人沮丧。当您使用cli上载时,您是否正在执行与
ACL:“公共读取”相当的cli操作?具体来说,--acl public read
?提供该参数需要更多的权限,而不仅仅是上载具有默认ACL的对象。My EC2的inbounds规则几乎可以使用并启用所有类型:http、https tcp和相关端口,甚至ssh。这与此无关。S3有两种不同的权限与所讨论的操作相关,可以有权限上载对象,但不能设置其ACL。如果在命令中包含--acl public read
,请验证aws cli命令是否有效。完成。也适用于CLI上载命令中的--acl public read可能会出现什么问题?