Как создать папку в AWS S3 с помощью AWS Lambda для пользователя, аутентифицированного в Cognito
Я пытаюсь вызвать лямбда-функцию, которая создает ресурсы AWS (папка S3 и элемент DynamoDB) для аутентифицированных пользователей. Лямбда-функция будет вызываться со стороны клиента после входа пользователя в систему через AWS Cognito.
Выполнение запроса S3 putObject на стороне клиента работает нормально. Однако, если я сделаю тот же запрос из вызванной лямбда-функции, она не будет выполнена.
Client --> S3 --> Works
Client --> Lambda --> S3 --> Does not work
Вот моя лямбда-функция:
s3 = boto3.resource('s3')
bucket = s3.Bucket('BUCKET_NAME')
id = str(context.identity.cognito_identity_id)
bucket.put_object(Key='cognito/users/{}/'.format(id))
Я получаю следующую ошибку
ClientError: An error occurred (AccessDenied) when calling the PutObject operation:
Access Denied
Роль Cognito Authenticated Role и Lambda Role указывают на одну и ту же роль:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["lambda:InvokeFunction"],
"Effect": "Allow",
"Resource": "arn:aws:lambda:us-east-1:ACCOUNT_ID:function:CreateResources"
},
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::BUCKET_NAME"],
"Condition": {
"StringLike": {
"s3:prefix": ["cognito/users/${cognito-identity.amazonaws.com:sub}/*"]
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::BUCKET_NAME/cognito/users/${cognito-identity.amazonaws.com:sub}",
"arn:aws:s3:::BUCKET_NAME/cognito/users/${cognito-identity.amazonaws.com:sub}/*"
]
}
]
}
И доверительные отношения:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "us-east-1:IDENTITY_POOL_ID"
},
"ForAnyValue:StringLike": {
"cognito-identity.amazonaws.com:amr": "authenticated"
}
}
},
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:AssumeRoleWithWebIdentity"
]
}
]
}
Как я могу достичь этого или есть лучший способ сделать это?