使用 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-1
和 eu-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 的帮助
Amazon Cognito 仅在 2 个区域可用:us-east-1
和 eu-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 的帮助