Я создал политику IAM, чтобы пользователи Cognito могли писать в мой ведро S3, но я хотел бы ограничить их папками на основе их идентификатора Cognito. Я выполнил инструкции Amazon здесь и создал политику, которая выглядит так:
{
"Effect": "Allow",
"Action": ["s3:PutObject","s3:GetObject"],
"Resource": [
"arn:aws:s3:::mybucket/myappfolder/${cognito-identity.amazonaws.com:sub}*"
]
}
Но когда я пытаюсь загрузить с помощью v2 SDK IOS SDK, я получаю ошибку отказа в доступе.
Если я изменю последний компонент пути ресурса, чтобы заменить ${cognito-identity.amazonaws.com:sub}
на явное значение identityId
, которое я получаю из SDK AWSCognitoCredentialsProvider
, он работает.
{
"Effect": "Allow",
"Action": ["s3:PutObject","s3:GetObject"],
"Resource": [
"arn:aws:s3:::mybucket/myappfolder/us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx*"
]
}
Я понял, что они должны совпадать с одним и тем же. Я что-то упустил в своей политике или должен использовать другой путь в моем запросе на загрузку?
** Обновить **
Первоначально у меня была эта проблема в iOS, поэтому сегодня я попытался сделать то же самое в node.js, и результат будет идентичным. Вот простой код, который я использую в node:
var s3 = new AWS.S3();
AWS.config.region = 'us-east-1';
AWS.config.credentials = new AWS.CognitoIdentityCredentials(AWSParams);
AWS.config.credentials.get(function (err) {
if (!err) {
console.log("Cognito Identity Id: " + AWS.config.credentials.identityId);
var bucketName = 'ch123_test_bucket';
var keyName = AWS.config.credentials.identityId + '.txt';
var params = {Bucket: bucketName, Key: keyName, Body: 'Hello World!'};
s3.putObject(params, function (err, data) {
if (err)
console.log(err)
else
console.log("Successfully uploaded data to " + bucketName + "/" + keyName);
});
}
И я получаю те же результаты, что и в iOS: если я не укажу явный идентификатор cognito в политике IAM, API ответил бы 403.
Я отключил свою политику IAM до минимального минимума. Это не работает:
{
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:PutObject","s3:GetObject"],
"Resource": [
"arn:aws:s3:::ch123_test_bucket/${cognito-identity.amazonaws.com:sub}*"
]
}
]
}
Это делает:
{
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:PutObject","s3:GetObject"],
"Resource": [
"arn:aws:s3:::ch123_test_bucket/us-east-1:68a5dc49-6cc7-4289-8257-d3d5636f7034*"
]
}
]
}
Я не вижу, что мне здесь не хватает... единственная документация, которую я смог найти, всегда показывает тот же пример Ресурс, который я использовал.