У меня есть пользовательский пул Cognito, которому требуется доступ к корзине S3 с префиксом на основе идентификатора пользователя (${cognito-identity.amazonaws.com:sub}
).Я настроил роль для пула пользователей в IAM со следующей встроенной политикой, скопированной и отредактированной из существующей аналогичной политики для группы IAM:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::[Bucket Having Problems]"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::[Unrelated Bucket]/${cognito-identity.amazonaws.com:sub}/*"
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[Bucket Having Problems]/${cognito-identity.amazonaws.com:sub}/*"
}
]
}
На вкладке Доверительные отношения есть
Trusted entities: cognito-identity.amazonaws.com
с
Conditions: StringEquals, cognito-identity.amazonaws.com:aud, [Pool ID of User Pool I want to use]
Когда я пытаюсь либо ListObjects
в желаемом Bucket, с префиксом
[Cognito User Id]/[optional: Subfolder, with or without trailing "/"]
или getObject
on
[Cognito User Id]/[File I know is there]
Я получаю ошибку 403: Access Denied
(или иногда ошибку, что доступ без аутентификации запрещен, после чего мне нужно снова ввести свое имя пользователя и пароль).
Я подтвердил, что UserId (${cognito-identity.amazonaws.com:sub}
) на CognitoUserPool.getCurrentUser
совпадает с Cognito User, на котором я вхожу (хотя в середине есть CognitoCachingCredentialsProvider
, который имеетразные IdentityId
связаны с ним.
Я понятия не имею, применяется ли моя политика даже должным образом, я думаю, что все правильно привязано, но Access Advisor говорит, что к ней не обращались впериод отслеживания. Делаю ли я удаленно правильную вещь?очевидно, я скучаю?Могу ли я собрать какие-либо данные о проблеме?Исключения всегда имеют идентификатор запроса и расширенный идентификатор запроса S3, но Google, похоже, предполагает, что я могу воспользоваться этим, только напрямую обратившись в службу технической поддержки AWS.
Как предоставить разрешения пользователю Cognitoчитать из S3 Bucket на основе информации, однозначно идентифицирующей пользователя Cognito?
ОБНОВЛЕНИЕ: я изменил политику, чтобы разрешить доступ GetObject ко всему, и я все еще получаю AccessDenied:
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "*"
}
Я думаю, что проблема в том, что политика вообще не используется, и я понятия не имею, почему.
ОБНОВЛЕНИЕ: Я думаю, что мне нужно сделать запрос на использование роли.Выяснение того, как сделать это сейчас.
ОБНОВЛЕНИЕ: Попытка, принимая Роль:
AssumeRoleRequest roleRequest = new AssumeRoleRequest().withRoleArn([ARN for Role]).withRoleSessionName([I made up a name for this]);
AssumeRoleResult result = new AWSSecurityTokenServiceClient(cognitocachingprovider.getCredentials()).assumeRole(roleRequest);
AmazonS3Client client = new AmazonS3Client(new BasicAWSCredentials(result.getCredentials().getAccessKeyId(), result.getCredentials().getSecretAccessKey()));
S3Object obj = client.getObject(bucket, pathOfKnownObject);
И я получаю 403: Отказано в доступе assumeRole(roleRequest)