Tengo problemas para descargar un archivo de mi depósito de AWS S3 (aplicación Swift/iOS). Parece ser uno de dos problemas, pero no puedo decir cuál:
Si creo el proveedor de credenciales de esta manera:
AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"us-west-2:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"];Obtuve el siguiente error:
[Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=10 "(null)" UserInfo={__type=ResourceNotFoundException, message=Identity 'us-west-2:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' not found.}]Noté la falta de coincidencia en la línea donde creo el proveedor de credenciales: el tipo de región es AWSRegionUSEast1, pero tengo "us-west-2" como parte de IdentityPoolId.
Si cambio regionType a AWSRegionUSWest2 (para que coincida con mi ID), ResourceNotFoundExeception desaparece. Pero luego me sale esto:
<Error><Code>PermanentRedirect</Code><Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message><Bucket>sportsmanregs</Bucket><Endpoint>s3.amazonaws.com</Endpoint><RequestId>AEFD833FF4E7B6F1</RequestId><HostId>mYxbBKlzTeWgVZW4W060+ESiBhWuxmfDDFE6UriXG7bqxA5NWuRbH9lu4NuGCaU/7H8f1hjAukA=</HostId></Error>Lo interesante es que el error anterior se encuentra en el objeto de datos en el controlador de finalización, como en "datos" a continuación:
completionHandler = { (task, location, data, error) -> Void in DispatchQueue.main.async( execute: {Entonces el controlador de finalización se llama OK. En la consola S3, la URL del archivo que intento descargar comienza con " https://s3.amazonaws.com/ /xxx/xxx.tiff". ¿Alguien tiene una idea de cuál es el problema aquí?
Parece que tanto su grupo de identidades como su depósito S3 están en la región us-west-2. Usted abordó la parte del conjunto de identidades sobre usted mismo, y eso es correcto. Para corregir la región del depósito en su código, también debe pasar la región a la llamada S3; de lo contrario, utilizará el valor predeterminado de us-east-1 y le dará ese error.
Una alternativa sería especificar su URL con [bucketname].s3.amazonaws.com, algunas personas parecieron tener éxito con eso, pero probablemente lo hará simplemente arreglando la región.
AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"us-west-2:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"];Es correcto pero necesita agregar alguna línea de código. Por favor agregue este código:
NSString *cognitoId = credentialsProvider.identityId; NSString *cognitopoolId = credentialsProvider.identityPoolId; NSLog(@"This is cognitoId: %@",cognitoId); NSLog(@"This is cognitopoolId: %@",cognitopoolId); [[credentialsProvider getIdentityId] continueWithBlock:^id(AWSTask *task){ if (task.error == nil) { NSString* cognitoId = credentialsProvider.identityId; NSLog(@"cognitoId: %@", cognitoId); } else { NSLog(@"Error : %@", task.error); } return nil; }];