Как создать папку в 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"
      ]
    }
  ]
}

Как я могу достичь этого или есть лучший способ сделать это?

0 ответов

Другие вопросы по тегам