AWS S3 Transfer Manager $ {cognito-identity.amazonaws.com:sub} Política de acceso variable denegado

Estoy tratando de descargar un archivo de AWS S3 a mi aplicación móvil iOS desde una carpeta específica para el usuario, usando Transfer Manager, así:

@IBAction func download() {
    let transferManager = AWSS3TransferManager.default()!
    let downloadingFileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("disney1.jpg")
    let downloadRequest = AWSS3TransferManagerDownloadRequest()!
    downloadRequest.bucket = "sidestreamx"
    // user's UUID/disney1
    downloadRequest.key = "631d121f-b294-4318-b3cd-36b3b74ebdff/disney1"
    downloadRequest.downloadingFileURL = downloadingFileURL

    transferManager.download(downloadRequest).continue(with: AWSExecutor.mainThread(), with: {
        (task: AWSTask<AnyObject>) -> Any? in
        if let error = task.error as? NSError {
            // handle error
            return nil
        }
        self.imageView.image = UIImage(contentsOfFile: downloadingFileURL.path)
        return nil
    })
}

Mi política de permisos de roles de IAM es la siguiente, obtenida deeste documento de AWS:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetBucketListIfRequestIsForUser",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::sidestreamx"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "${cognito-identity.amazonaws.com:sub}/*"
                    ]
                }
            }
        },
        {
            "Sid": "S3GetObjects",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::sidestreamx/${cognito-identity.amazonaws.com:sub}/*"
            ]
        }
    ]
}

La respuesta que obtengo es

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code>
   <Message>Access Denied</Message>    
   <RequestId>E1F205B58EF4A670</RequestId>
   <HostId>dUWI8PfVZL3mJmykjhXRqvFd1yt/CqDFNlwgwD3kmLk2vrMBP6JvVgezMYSROt3KyE3dx0+3eDE=</HostId>
</Error>

El usuario se autentica a través de AWS Cognito User Pool e Cognito Federated Identities. He depurado y extraído el token JWT, y he visto que elsub = "631d121f-b294-4318-b3cd-36b3b74ebdff". Incluso he usadoCharles para ver la Solicitud / Respuesta.

Esofunciona si Sustituyo${cognito-identity.amazonaws.com:sub} en la última declaraciónS3GetObjects con631d121f-b294-4318-b3cd-36b3b74ebdff Llegararn:aws:s3:::sidestreamx/631d121f-b294-4318-b3cd-36b3b74ebdff/*. La primera declaración puede seguir teniendo la variable de política y seguirá funcionando. ¡Funcionará si elimino la primera declaración por completo! Es cuando agrego la variable de política a la última declaración donde comienza a descomponerse.

He comprobado estoDesbordamiento de pila pregunta yéste, en vano. Entonces, no lo sé. He estado en esto durante casi 9 horas hombre, por lo que cualquier ayuda sería sinceramente apreciada.

Respuestas a la pregunta(1)

Su respuesta a la pregunta