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

Accessing a us-west-2 S3 bucket using Amazon Cognito and an IAM policy

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 存储桶时工作正常。

我看到您将区域设置为 us-east-1(以访问 Amazon Cognito 的端点)。

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

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

此外,如果这不起作用,您能否提供您遇到的错误?

-马克

已解决:

我正在使用 AWS.S3.ManagedUpload 库。
为了指定 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/report 进度的逻辑:

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 的帮助