使用Amazon Cognito和IAM策略访问us-west-2 S3存储桶

时间:2015-07-17 03:40:51

标签: amazon-web-services amazon-s3 amazon-iam amazon-cognito

Amazon Cognito仅适用于2个区域:us-east-1eu-west-1
我在us-west-2

中有一个存储桶

以下是我在Cognito身份池中为未经身份验证的访客提供的IAM策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::vocal.test14/*"
            ]
        }
    ]
}

在上传过程中,我无法访问S3存储桶 如上所述,它应该是可能的:

我需要将哪些规则添加到我的政策中,以便让Cognito能够与不在us-east中的存储桶进行通信?

有人要求提供更多信息,所以这是:

我创建了一个名为vocal.west2的新存储桶 我给了桶以下CORS属性:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>https://domain.com</AllowedOrigin>
        <AllowedOrigin>https://*.domain.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedHeader>Authorization</AllowedHeader>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
    </CORSRule>
    <CORSRule>
        <AllowedOrigin>https://domain.com</AllowedOrigin>
        <AllowedOrigin>https://*.domain.com</AllowedOrigin>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
        <ExposeHeader>ETag</ExposeHeader>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
    </CORSRule>
</CORSConfiguration>

我已将IAM角色更新为以下内容:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::vocal.west2/*"
            ]
        }
    ]
}

我正在尝试使用AWS JavaScript SDK上传文件。代码很长,但这里是Cognito凭证调用:

AWS.config.region = 'us-east-1';
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'us-east-1:REST-OF-ID-HERE'
});

请注意,该区域设置为1us-east-1`,但这是因为它引用了Cognito区域,而不是S3存储桶。

另请注意,执行上传的实际JS代码在us-east-1存储桶时可以正常工作。

2 个答案:

答案 0 :(得分:3)

解决:

我正在使用AWS.S3.ManagedUpload lib 为了指定S3区域,需要创建AWS.S3对象(这里的情况很重要;不能与AWS.s3一起使用)

这是AWS.S3对象实例化:

var s3 = (new AWS.S3({
    region: 'us-west-2'
}))

这是AWS.S3.ManagedUpload实例化:

var upload = (new AWS.S3.ManagedUpload({
    params: {
        Bucket: 'vocal.test14',
        Key: 'filename',
        Body: file,
        ContentType: 'image/jpeg',
        ACL: 'public-read'
    },
    service: s3
}));

以上是上传/报告进度的逻辑:

upload.on('httpUploadProgress', function(event) {
    console.log(
        'Progress:',
        event.loaded,
        '/',
        event.total
    );
});
upload.send(function(err, data) {
    if (data) {
        console.log('Uploaded');
        console.log(data);
    } else {
        console.log(arguments);
    }
});

感谢@ mark-mercurio的帮助

答案 1 :(得分:2)

我看到你将区域设置为us-east-1(点击Amazon Cognito的端点)。

实例化S3客户端时,请尝试指定区域。

var s3 = new AWS.S3({region: 'us-west-2'});

另外,如果这不起作用,您能提供错误吗?

-Mark