【问题标题】:Accessing a us-west-2 S3 bucket using Amazon Cognito and an IAM policy使用 Amazon Cognito 和 IAM 策略访问 us-west-2 S3 存储桶
【发布时间】:2015-10-06 17:10:17
【问题描述】:

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 开发工具包上传文件。代码很长,但这里是 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 存储桶时可以正常工作。

【问题讨论】:

  • 您好,您能提供更多信息吗?您是否从 S3 收到 accessDenied 异常?您正在使用的代码示例和 sdk 将是寻找解决方案的良好开端。

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


【解决方案1】:

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

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

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

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

-马克

【讨论】:

  • 感谢马克的提示。里面有一个错字,还有一些需要做的事情,但你让我走上了正确的轨道。谢谢你的帮助。很快就会发布答案。
【解决方案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.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 的帮助

【讨论】:

    猜你喜欢
    • 2013-08-05
    • 2023-03-29
    • 2011-09-10
    • 2023-02-26
    • 2016-03-12
    • 2019-02-26
    • 1970-01-01
    • 2020-12-18
    • 2023-03-31
    相关资源
    最近更新 更多