Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services AWS S3-配置网站访问_Amazon Web Services_Amazon S3 - Fatal编程技术网

Amazon web services AWS S3-配置网站访问

Amazon web services AWS S3-配置网站访问,amazon-web-services,amazon-s3,Amazon Web Services,Amazon S3,我一直在学习本教程: 这最终将被更改为管理音频文件而不是图像 我遵循了指南,但肯定错过了一些东西,因为在尝试列出对象时,仍然会出现拒绝访问错误 我已经在S3上创建了一个bucket -它不是一个公共桶 -该地区为欧盟(伦敦),因此为欧盟-西部-2 CORS配置: <?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">

我一直在学习本教程:

这最终将被更改为管理音频文件而不是图像

我遵循了指南,但肯定错过了一些东西,因为在尝试列出对象时,仍然会出现拒绝访问错误

我已经在S3上创建了一个bucket -它不是一个公共桶 -该地区为欧盟(伦敦),因此为欧盟-西部-2 CORS配置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
  </CORSRule>
</CORSConfiguration>
然后在我的网站上,我会:

<script src="https://sdk.amazonaws.com/js/aws-sdk-2.243.1.min.js"></script>
<script type="text/javascript">

function getHtml(template) {
  return template.join('\n');
}

var albumBucketName = 'myactualname';
var IdentityPoolId = 'eu-west-2:lotsofcharacters';

AWS.config.update({
  region: 'eu-west-2',
  credentials: new AWS.CognitoIdentityCredentials({
    IdentityPoolId: IdentityPoolId,
  })
});

var s3 = new AWS.S3({
  apiVersion: '2006-03-01',
  params: {Bucket: albumBucketName},
});

listAlbums();

function listAlbums() {
  s3.listObjects({Delimiter: '/'}, function(err, data) {
    if (err) {
      console.log(err.message);
      //return alert('There was an error listing your albums: ' + err.message);
    } else {
      // we never get here
    }
  });
}
</script>

函数getHtml(模板){
返回模板。join('\n');
}
var albumBucketName='myactualname';
var IdentityPoolId='eu-west-2:lotsofcharacters';
AWS.config.update({
地区:“欧盟-西部-2”,
凭证:新AWS.CognitoIdentityCredentials({
IdentityPoolId:IdentityPoolId,
})
});
var s3=新的AWS.s3({
apiVersion:‘2006-03-01’,
参数:{Bucket:albumBucketName},
});
listAlbums();
函数listAlbums(){
s3.listObjects({分隔符:'/'},函数(err,数据){
如果(错误){
控制台日志(错误消息);
//返回警报(“列出相册时出错:”+err.message);
}否则{
//我们永远都到不了这里
}
});
}
我错过什么了吗?如果我回到bucket并为读/写设置公共访问权限,那么一切都会正常工作-但是我认为这样做是错误的,因为它会向使用我的AWS的任何人/每个人开放


谢谢

我发现您的S3存储桶策略有问题。listObjects调用需要在bucket上设置权限,而不是在bucket中的对象上设置权限

简而言之,您需要将
“arn:aws:s3:::thisuesmybucketname”
添加到您的资源语句中,因此它看起来如下所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::thisusesmybucketname/*",
            "arn:aws:s3:::thisusesmybucketname"
        ]
    }
  ]
}

你们都做对了,一切都很完美。现在有了这个概念,您创建了一个无服务器的公共网站,它显示了一些图像,任何公众都可以使用AWS Cognito提供给浏览器的客户端临时凭据看到这些图像。 但是你还没有给公众读权限,那么他们将如何访问呢

上载对象/图像时,您必须为希望公众看到的对象创建ACL,即访问控制列表,以便任何人都可以访问只有您允许的对象。如果您也希望公众上载,则还必须提供写访问

另一件事是,允许公众读取bucket并不意味着公众对您的AWS帐户拥有无限的权限,他们被有意地提供了一个特定的位置,在那里他们可以与您网站的存储服务进行交互

以下是我如何执行此操作的代码:

var file = fileChooser.files[0];
if (file) {
    results.innerHTML = '';

var params = {
                    Key: 'maus/group1.jpeg',
                    ContentType: file.type,
                    Body: file,
                    ACL: 'public-read'
                };

                s3.putObject(params, function (err, data) {
                    if (err) {
                        results.innerHTML = 'ERROR: ' + err;
                    }else {
                        results.innerHTML = ' snapshot uploaded !!!';
                    }
                }).on('httpUploadProgress', function (progress) {console.log(progress);});
} else {

            results.innerHTML = 'Nothing to upload.';
        }
如果你想对你的bucket进行更严格的控制,那么你可以使用身份验证池这样做,然后修改你的代码,让特定用户可以访问s3 bucket中的特定对象,用户名作为他/她上传的对象的前缀

e、 g.
yourbucketname/user1/*只能由user1访问


未经身份验证的用户池本身意味着您希望每个人都使用临时凭据访问特定的AWS资源

这就是一个-与往常一样,当其他人指出它时,它看起来很容易。补充说,并收紧了桶的政策,以参考具体的,似乎所有排序现在,谢谢!
var file = fileChooser.files[0];
if (file) {
    results.innerHTML = '';

var params = {
                    Key: 'maus/group1.jpeg',
                    ContentType: file.type,
                    Body: file,
                    ACL: 'public-read'
                };

                s3.putObject(params, function (err, data) {
                    if (err) {
                        results.innerHTML = 'ERROR: ' + err;
                    }else {
                        results.innerHTML = ' snapshot uploaded !!!';
                    }
                }).on('httpUploadProgress', function (progress) {console.log(progress);});
} else {

            results.innerHTML = 'Nothing to upload.';
        }