Amazon Simple Storage Service (S3) - AWS Mobile SDK para Unity

AWS Mobile SDK para Unity ahora está incluido en AWS SDK for .NET. Esta guía hace referencia a la versión archivada de Mobile SDK para Unity. Para obtener más información, consulte ¿Qué es AWS Mobile SDK para Unity?

Amazon Simple Storage Service (S3)

Amazon Simple Storage Service (Amazon S3) proporciona a los desarrolladores y equipos de TI un almacenamiento de objetos seguro, duradero y con un alto grado de escalabilidad. Los desarrolladores de Unity pueden utilizar S3 para cargar dinámicamente los recursos utilizados por sus juegos. Esto puede ayudar a que la descarga inicial de los juegos desde las tiendas de aplicaciones sea más rápida.

Para obtener más información acerca de S3, consulte Amazon S3.

Para obtener información acerca de la disponibilidad regional de AWS S3, consulte la disponibilidad regional de los servicios de AWS.

nota

Algunas de las muestras de este documento presuponen el uso de una variable de cuadro de texto denominada ResultText para mostrar la salida de rastreo.

Creación y configuración de un bucket de S3

Amazon S3 almacena los recursos en buckets de Amazon S3, es decir, en contenedores de almacenamiento en la nube que residen en una región concreta. Cada bucket de Amazon S3 debe tener un nombre único. Puede utilizar la consola de Amazon S3 para crear un bucket.

Creación de S3 Bucket

  1. Inicie sesión en la consola de Amazon S3 y haga clic en Create Bucket (Crear bucket).

  2. Escriba un nombre de bucket, seleccione una región y haga clic en Create (Crear).

Definición de permisos de S3

La política predeterminada de roles de IAM da a su aplicación acceso a Amazon Mobile Analytics y Amazon Cognito Sync. Para que el grupo de identidades de Cognito obtenga acceso a Amazon S3, debe modificar los roles del grupo de identidades.

  1. Vaya a la consola de Identity and Access Management y haga clic en Roles (Roles) en el panel izquierdo.

  2. Escriba el nombre del grupo de identidades en el campo de búsqueda. Se muestran dos roles: uno para los usuarios no autenticados y otro para los usuarios autenticados.

  3. Haga clic en el rol de los usuarios no autenticados (el nombre del grupo de identidades tendrá añadido el texto "unauth").

  4. Haga clic en Create Role Policy (Crear política de roles), seleccione Policy Generator (Generador de políticas) y haga clic en Select (Seleccionar).

  5. En la página Edit Permissions (Editar permisos), escriba la configuración que se muestra en la siguiente imagen y reemplace el nombre de recurso de Amazon (ARN) por el suyo. El ARN de un bucket de S3 es parecido a arn:aws:s3:::examplebucket/* y está integrado por la región en la que se encuentra el bucket y por el nombre del bucket. La configuración que se muestra a continuación dará a su grupo de identidades pleno acceso a todas las acciones para el bucket especificado.

    Edit Permissions interface for AWS policy creation, showing options for Amazon S3 access control.
  1. Haga clic en el botón Add Statement (Agregar instrucción) y, a continuación, haga clic en Next Step (Paso siguiente).

  2. El asistente le mostrará la configuración que ha generado. Haga clic en Apply Policy (Aplicar política).

Para obtener más información acerca del procedimiento para conceder acceso a S3, consulte Granting Access to an Amazon S3 Bucket.

Carga de archivos desde la consola

Para cargar un archivo de prueba en un bucket:

  1. En la consola de S3, en la vista del bucket, haga clic en Upload (Cargar).

  2. Haga clic en Add Files (Añadir archivos) y seleccione un archivo de prueba para cargarlo. En este tutorial, supondremos que está cargando una imagen llamada myImage.jpg.

  3. Con la imagen de prueba seleccionada, haga clic en Start Upload (Comenzar carga).

(opcional) Configuración de la versión de Signature para las solicitudes de S3

Toda interacción con Amazon S3 es o autenticada o anónima. AWS utiliza los algoritmos de Signature Version 4 o Signature Version 2 para autenticar las llamadas al servicio.

Las nuevas regiones de AWS creadas después de enero de 2014 admiten únicamente Signature Version 4. Sin embargo, muchas de las regiones más antiguas todavía admiten solicitudes de Signature Version 4 y Signature Version 2.

Si su bucket se encuentra en una región que no es compatible con solicitudes de Signature Version 2 según la lista de esta página, debe asignar a la propiedad AWSConfigsS3.UseSignatureVersion4 el valor "true":

Para obtener más información acerca de las versiones de AWS Signature, consulte Authenticating Requests (AWS Signature Version 4).

Creación del cliente de Amazon S3

Para utilizar Amazon S3, primero debe crear una instancia de AmazonS3Client que incluya una referencia a la instancia de CognitoAWSCredentials que ha creado anteriormente:

AmazonS3Client S3Client = new AmazonS3Client (credentials);

La clase AmazonS3Client es el punto de entrada a la API de S3 de alto nivel.

Lista de buckets

Para ver los buckets de una cuenta de AWS, llame al método AmazonS3Client.ListBucketsAsync como se indica en el siguiente código de muestra:

// ResultText is a label used for displaying status information ResultText.text = "Fetching all the Buckets"; Client.ListBucketsAsync(new ListBucketsRequest(), (responseObject) => { ResultText.text += "\n"; if (responseObject.Exception == null) { ResultText.text += "Got Response \nPrinting now \n"; responseObject.Response.Buckets.ForEach((s3b) => { ResultText.text += string.Format("bucket = {0}, created date = {1} \n", s3b.BucketName, s3b.CreationDate); }); } else { ResultText.text += "Got Exception \n"; } });

Lista de objetos

Para ver una lista de todos los objetos de un bucket, llame al método AmazonS3Client.ListObjectsAsync como se indica en el siguiente código de muestra:

// ResultText is a label used for displaying status information ResultText.text = "Fetching all the Objects from " + S3BucketName; var request = new ListObjectsRequest() { BucketName = S3BucketName }; Client.ListObjectsAsync(request, (responseObject) => { ResultText.text += "\n"; if (responseObject.Exception == null) { ResultText.text += "Got Response \nPrinting now \n"; responseObject.Response.S3Objects.ForEach((o) => { ResultText.text += string.Format("{0}\n", o.Key); }); } else { ResultText.text += "Got Exception \n"; } });

Descarga de un objeto

Para descargar un objeto, cree una solicitud GetObjectRequest en la que se especifiquen el nombre y la clave del bucket y pase el objeto a una llamada a Client.GetObjectAsync:

private void GetObject() { ResultText.text = string.Format("fetching {0} from bucket {1}", SampleFileName, S3BucketName); Client.GetObjectAsync(S3BucketName, SampleFileName, (responseObj) => { string data = null; var response = responseObj.Response; if (response.ResponseStream != null) { using (StreamReader reader = new StreamReader(response.ResponseStream)) { data = reader.ReadToEnd(); } ResultText.text += "\n"; ResultText.text += data; } }); }

GetObjectAsync toma una instancia de GetObjectRequest, una devolución de llamada, y una instancia de AsyncOptions. La devolución de llamada debe ser de tipo: AmazonServiceCallback<GetObjectRequest, GetObjectResponse>. La instancia de AsyncOptions es opcional. Si se especifica, determina si la devolución de llamada se ejecutará en el hilo principal.

Carga de un objeto

Para cargar un objeto, escríbalo en una secuencia, cree una nueva solicitud PostObjectRequest y especifique la clave, el nombre del bucket y los datos de la secuencia.

AWS SDK para Unity usa el cliente HTTP WWW, que no admite la operación HTTP PUT. Para cargar un objeto en el bucket de S3, tendrá que utilizar Browser Post de S3, como se muestra a continuación.

public void PostObject(string fileName) { ResultText.text = "Retrieving the file"; var stream = new FileStream(Application.persistentDataPath + Path.DirectorySeparatorChar + fileName, FileMode.Open, FileAccess.Read, FileShare.Read); ResultText.text += "\nCreating request object"; var request = new PostObjectRequest() { Bucket = S3BucketName, Key = fileName, InputStream = stream, CannedACL = S3CannedACL.Private }; ResultText.text += "\nMaking HTTP post call"; Client.PostObjectAsync(request, (responseObj) => { if (responseObj.Exception == null) { ResultText.text += string.Format("\nobject {0} posted to bucket {1}", responseObj.Request.Key, responseObj.Request.Bucket); } else { ResultText.text += "\nException while posting the result object"; ResultText.text += string.Format("\n receieved error {0}", responseObj.Response.HttpStatusCode.ToString()); } }); }