Migración desde la versión 2 del AWS SDK para PHP - AWS SDK para PHP

Migración desde la versión 2 del AWS SDK para PHP

En este tema se muestra cómo migrar su código para utilizar la versión 3 de AWS SDK para PHP y las diferencias de la nueva versión frente a la versión 2 del SDK.

nota

El patrón de uso básico del SDK (es decir, $result = $client->operation($params);) no ha cambiado de la versión 2 a la 3, por lo que la migración debería realizarse sin problema.

Introducción

La versión 3 de AWS SDK para PHP representa una mejora importante de las capacidades del SDK, incorpora los comentarios realizados por nuestros clientes a lo largo de dos años, la actualización de nuestras dependencias, la mejora del rendimiento y la adopción de los estándares más recientes de PHP.

¿Qué novedades incluye la versión 3?

A partir de este momento, la versión 3 de AWS SDK para PHP sigue los estándares PSR-4 y PSR-7 y el estándar SemVer.

Otras nuevas características incluyen:

  • Sistema de middleware para personalizar el comportamiento del cliente del servicio

  • Paginadores flexibles para iterar a través de los resultados paginados

  • Capacidad para consultar los datos de los objetos result y paginator con JMESPath

  • Depuración sencilla mediante la opción de configuración 'debug'

Capa HTTP desacoplada

  • Guzzle 6 se utiliza de forma predeterminada para enviar solicitudes, pero también se admite Guzzle 5.

  • El SDK funcionará en entornos donde cURL no está disponible.

  • También se admiten los controladores HTTP personalizados.

Solicitudes asíncronas

  • Las características como los esperadores y los cargadores multiparte también se pueden utilizar de forma asíncrona.

  • Los flujos de trabajo asíncronos se pueden crear utilizando promesas y corutinas.

  • El rendimiento de las solicitudes simultáneas o en lotes ha mejorado.

¿Cuáles son las diferencias con la versión 2?

Se han actualizado las dependencias del proyecto

En esta versión, las dependencias del SDK han cambiado.

  • El SDK ahora requiere PHP 8.1 y superior. Usamos numerosos generadores dentro del código del SDK.

  • Hemos actualizado el SDK para utilizar Guzzle 6 (o 5), que proporciona la implementación del cliente HTTP subyacente que utiliza el SDK para enviar solicitudes a los servicios de AWS. La versión más reciente de Guzzle incluye una serie de mejoras, que engloba solicitudes asíncronas, controladores HTTP intercambiables, conformidad con PSR-7, mejora del rendimiento y mucho más.

  • El paquete PSR-7 de PHP-FIG (psr/http-message) define interfaces para que representen las solicitudes HTTP, las respuestas HTTP, las URL y los flujos. Estas interfaces se utilizan en el SDK y en Guzzle, y permiten operar internamente con otros paquetes compatibles con PSR-7.

  • La implementación de PSR-7 (guzzlehttp/psr7) de Guzzle proporciona una implementación de las interfaces en PSR-7 y varias clases y funciones útiles. Tanto el SDK como Guzzle 6 dependen fuertemente de este paquete.

  • La implementación de Promises/A+ de Guzzle (guzzlehttp/promises) se utiliza tanto en el SDK como en Guzzle para proporcionar interfaces para gestionar solicitudes y corutinas asíncronas. Mientras el controlador HTTP multi-cURL de Guzzle implementa en última instancia el modelo E/S sin bloqueo que permite las solicitudes asíncronas, este paquete ofrece la posibilidad de programar dentro de ese paradigma. Para obtener más información, consulte Promesas en la versión 3 de AWS SDK para PHP.

  • La implementación de PHP de JMESPath (mtdowling/jmespath.php) se utiliza en el SDK para proporcionar los datos que consultan la capacidad de los métodos Aws\Result::search() y Aws\ResultPaginator::search(). Para obtener información detallada, consulte Expresiones JMESPath en la versión 3 de AWS SDK para PHP.

Ahora se requieren las opciones de región y versión

Al crear una instancia de un cliente para cualquier servicio, especifique las opciones 'region' y 'version'. En la versión 2 de AWS SDK para PHP, 'version' era totalmente opcional y 'region', a veces. En la versión 3, ambas son siempre necesarias. Al ser explícito sobre ambas opciones, le permite bloquear la versión de la API y la región de AWS sobre las que está codificando. Cuando se creen versiones de la API nuevas o haya nuevas regiones de AWS disponibles, estará aislado de posibles cambios bruscos hasta que esté listo para actualizar su configuración de forma explícita.

nota

Si no le preocupa la versión de la API que está usando, establezca la opción 'version' en 'latest'. Sin embargo, le recomendamos que establezca los números de versión de la API de forma explícita para el código de producción.

No todos los servicios están disponibles en todas las regiones de AWS. Para ver una lista de las regiones disponibles, consulte la referencia Regiones y puntos de enlace.

En el caso de los servicios que solo están disponibles a través de un único punto de conexión global (por ejemplo, Amazon Route, AWS Identity and Access Management y Amazon CloudFront), cree instancias de los clientes con su región establecida en us-east-1.

importante

El SDK también incluye clientes en varias regiones, que pueden enviar solicitudes a diferentes regiones de AWS en función de un parámetro (@region) suministrado como parámetro del comando. El parámetro Region que utilizan estos clientes de forma predeterminada se especifica en la opción region suministrada al constructor de clientes.

En la creación de instancias del cliente se utiliza el constructor

En la versión 3 de AWS SDK para PHP, la forma en la que crea la instancia de un cliente ha cambiado. En lugar de utilizar los métodos factory de la versión 2, aquí puede crear una instancia de un cliente utilizando la palabra clave new.

use Aws\DynamoDb\DynamoDbClient; // Version 2 style $client = DynamoDbClient::factory([ 'region' => 'us-east-2' ]); // Version 3 style $client = new DynamoDbClient([ 'region' => 'us-east-2', 'version' => '2012-08-10' ]);
nota

De todos modos, también se puede crear una instancia de un cliente utilizando el método factory(). Sin embargo, se considera obsoleto.

La configuración del cliente ha cambiado

Las opciones de configuración del cliente en la versión 3 de AWS SDK para PHP han cambiado un poco respecto a la versión 2. Consulte la página Configuración de la versión 3 de AWS SDK para PHP para ver una descripción de todas las opciones admitidas.

importante

En la versión 3, las opciones 'key' y 'secret' ya no son válidas en el nivel de raíz, pero las puede transferir como parte de la opción 'credentials'. Uno de los motivos por lo que lo hemos hecho es para evitar que los desarrolladores codifiquen de forma rígida sus credenciales de AWS en sus proyectos.

El objeto Sdk

La versión 3 de AWS SDK para PHP presenta el objeto Aws\Sdk en sustitución del Aws\Common\Aws. El objeto Sdk actúa como una fábrica de cliente y se utiliza para administrar las opciones de configuración compartidas en varios clientes.

Aunque la clase Aws de la versión 2 del SDK funcionaba como un localizador de servicio (siempre devolvía la misma instancia de un cliente), la clase Sdk de la versión 3 devuelve una nueva instancia de un cliente cada vez que se utiliza.

El objeto Sdk tampoco admite el mismo formato de archivo de configuración de la versión 2 del SDK. Dicho formato de configuración era específico de Guzzle 3 y ya está obsoleto. La configuración se puede simplificar con matrices y se documenta en Uso de la clase Sdk.

Algunos resultados de la API han cambiado

Para ser coherentes en la forma en que el SDK analiza el resultado de una operación de la API, Amazon ElastiCache, Amazon RDS y Amazon Redshift ahora tienen un elemento de encapsulamiento adicional en algunas respuestas de la API.

Por ejemplo, al llamar al resultado de DescribeEngineDefaultParameters de Amazon RDS en la versión 3 ahora se incluye un elemento de encapsulamiento “EngineDefaults”. En la versión 2, este elemento no existía.

$client = new Aws\Rds\RdsClient([ 'region' => 'us-west-1', 'version' => '2014-09-01' ]); // Version 2 $result = $client->describeEngineDefaultParameters(); $family = $result['DBParameterGroupFamily']; $marker = $result['Marker']; // Version 3 $result = $client->describeEngineDefaultParameters(); $family = $result['EngineDefaults']['DBParameterGroupFamily']; $marker = $result['EngineDefaults']['Marker'];

Estas son las operaciones afectadas y ahora contienen un elemento de encapsulamiento en la salida del resultado (incluido a continuación entre paréntesis):

  • Amazon ElastiCache

    • AuthorizeCacheSecurityGroupIngress (CacheSecurityGroup)

    • CopySnapshot (Snapshot)

    • CreateCacheCluster (CacheCluster)

    • CreateCacheParameterGroup (CacheParameterGroup)

    • CreateCacheSecurityGroup (CacheSecurityGroup)

    • CreateCacheSubnetGroup (CacheSubnetGroup)

    • CreateReplicationGroup (ReplicationGroup)

    • CreateSnapshot (Snapshot)

    • DeleteCacheCluster (CacheCluster)

    • DeleteReplicationGroup (ReplicationGroup)

    • DeleteSnapshot (Snapshot)

    • DescribeEngineDefaultParameters (EngineDefaults)

    • ModifyCacheCluster (CacheCluster)

    • ModifyCacheSubnetGroup (CacheSubnetGroup)

    • ModifyReplicationGroup (ReplicationGroup)

    • PurchaseReservedCacheNodesOffering (ReservedCacheNode)

    • RebootCacheCluster (CacheCluster)

    • RevokeCacheSecurityGroupIngress (CacheSecurityGroup)

  • Amazon RDS

    • AddSourceIdentifierToSubscription (EventSubscription)

    • AuthorizeDBSecurityGroupIngress (DBSecurityGroup)

    • CopyDBParameterGroup (DBParameterGroup)

    • CopyDBSnapshot (DBSnapshot)

    • CopyOptionGroup (OptionGroup)

    • CreateDBInstance (DBInstance)

    • CreateDBInstanceReadReplica (DBInstance)

    • CreateDBParameterGroup (DBParameterGroup)

    • CreateDBSecurityGroup (DBSecurityGroup)

    • CreateDBSnapshot (DBSnapshot)

    • CreateDBSubnetGroup (DBSubnetGroup)

    • CreateEventSubscription (EventSubscription)

    • CreateOptionGroup (OptionGroup)

    • DeleteDBInstance (DBInstance)

    • DeleteDBSnapshot (DBSnapshot)

    • DeleteEventSubscription (EventSubscription)

    • DescribeEngineDefaultParameters (EngineDefaults)

    • ModifyDBInstance (DBInstance)

    • ModifyDBSubnetGroup (DBSubnetGroup)

    • ModifyEventSubscription (EventSubscription)

    • ModifyOptionGroup (OptionGroup)

    • PromoteReadReplica (DBInstance)

    • PurchaseReservedDBInstancesOffering (ReservedDBInstance)

    • RebootDBInstance (DBInstance)

    • RemoveSourceIdentifierFromSubscription (EventSubscription)

    • RestoreDBInstanceFromDBSnapshot (DBInstance)

    • RestoreDBInstanceToPointInTime (DBInstance)

    • RevokeDBSecurityGroupIngress (DBSecurityGroup)

  • Amazon Redshift

    • AuthorizeClusterSecurityGroupIngress (ClusterSecurityGroup)

    • AuthorizeSnapshotAccess (Snapshot)

    • CopyClusterSnapshot (Snapshot)

    • CreateCluster (Cluster)

    • CreateClusterParameterGroup (ClusterParameterGroup)

    • CreateClusterSecurityGroup (ClusterSecurityGroup)

    • CreateClusterSnapshot (Snapshot)

    • CreateClusterSubnetGroup (ClusterSubnetGroup)

    • CreateEventSubscription (EventSubscription)

    • CreateHsmClientCertificate (HsmClientCertificate)

    • CreateHsmConfiguration (HsmConfiguration)

    • DeleteCluster (Cluster)

    • DeleteClusterSnapshot (Snapshot)

    • DescribeDefaultClusterParameters (DefaultClusterParameters)

    • DisableSnapshotCopy (Cluster)

    • EnableSnapshotCopy (Cluster)

    • ModifyCluster (Cluster)

    • ModifyClusterSubnetGroup (ClusterSubnetGroup)

    • ModifyEventSubscription (EventSubscription)

    • ModifySnapshotCopyRetentionPeriod (Cluster)

    • PurchaseReservedNodeOffering (ReservedNode)

    • RebootCluster (Cluster)

    • RestoreFromClusterSnapshot (Cluster)

    • RevokeClusterSecurityGroupIngress (ClusterSecurityGroup)

    • RevokeSnapshotAccess (Snapshot)

    • RotateEncryptionKey (Cluster)

Se han eliminado las clases Enum

Hemos eliminado las clases Enum (por ejemplo, Aws\S3\Enum\CannedAcl) de la versión 2 de AWS SDK para PHP. Las clases Enum eran clases concretas dentro de la API pública del SDK que incluían constantes que representan grupos de valores de parámetros válidos. Dado que estos objetos Enum son específicos de las versiones de la API, pueden cambiar con el paso del tiempo, pueden entrar en conflicto con palabras reservadas de PHP y acabar no siendo muy útiles, los hemos eliminado de la versión 3. Esto es compatible con la naturaleza agnóstica de la versión de la API y basada en datos de la versión 3.

En lugar de utilizar valores de objetos Enum, utilice los valores literales directamente (por ejemplo, CannedAcl::PUBLIC_READ'public-read').

Se han eliminado las clases de excepción detalladas

Hemos eliminado las clases de excepción detalladas que existían en los espacios de nombres de cada servicio (por ejemplo, Aws\Rds\Exception\{SpecificError}Exception) por motivos muy similares por los que hemos eliminado los objetos Enum. Las excepciones que lanza un servicio u operación dependen de la versión de la API que se utiliza (pueden cambiar de versión a versión). Además, la lista completa de excepciones que puede lanzar una operación determinada no está disponible, lo que provocaba que las clases de excepción detalladas de la versión 2 fueran incompletas.

Gestione los errores capturando la clase de excepción raíz de cada servicio (por ejemplo, ).., Aws\Rds\Exception\RdsException). Puede utilizar el método getAwsErrorCode() de la excepción para comprobar si hay códigos de error específicos. Desde el punto de vista funcional, es similar a la captura de diferentes clases de excepción pero proporciona dicha función sin añadir sobredimensionamiento al SDK.

Se han eliminado las clases Facade estáticas

En la versión 2 de AWS SDK para PHP, había una característica oculta inspirada por Laravel que permitía llamar a enableFacades() en la clase Aws para habilitar el acceso estático a los distintos clientes de servicios. Esta característica es contraria a las prácticas recomendadas de PHP, por lo que dejamos de documentarla hace más de un año. En la versión 3, esta característica se ha eliminado por completo. Recupere sus objetos de cliente del objeto Aws\Sdk y utilícelos como instancias de objeto, no como clases estáticas.

Los paginadores sustituyen a los iteradores

La versión 2 de AWS SDK para PHP tenía una característica llamada *iteradores*. Estos objetos se utilizaban para la iteración de los resultados paginados. Una de las quejas que recibimos al respecto era que no eran suficientemente flexibles, ya que el iterador solo emitía valores específicos de cada resultado. Si necesitaba otros valores de los resultados, solo se podían recuperar a través de los agentes de escucha.

En la versión 3, los iteradores se han sustituido por Paginadores. Su finalidad es similar, pero los paginadores son más flexibles. Esto se debe a que generaban objetos Result en lugar de valores de una respuesta.

En los siguientes ejemplos se muestra la diferencia entre los paginadores y los iteradores, y se explica cómo recuperar resultados paginados para la operación S3 ListObjects tanto en la versión 2 como en la versión 3.

// Version 2 $objects = $s3Client->getIterator('ListObjects', ['Bucket' => 'amzn-s3-demo-bucket']); foreach ($objects as $object) { echo $object['Key'] . "\n"; }
// Version 3 $results = $s3Client->getPaginator('ListObjects', ['Bucket' => 'amzn-s3-demo-bucket']); foreach ($results as $result) { // You can extract any data that you want from the result. foreach ($result['Contents'] as $object) { echo $object['Key'] . "\n"; } }

Los objetos del paginador tienen un método search() que le permite utilizar expresiones JMESPath para extraer datos más fácilmente del conjunto de resultados.

$results = $s3Client->getPaginator('ListObjects', ['Bucket' => 'amzn-s3-demo-bucket']); foreach ($results->search('Contents[].Key') as $key) { echo $key . "\n"; }
nota

El método getIterator() sigue siendo compatible para que la transición a la versión 3 sea suave, pero le recomendamos que migre su código para utilizar paginadores.

Han cambiado muchas abstracciones de nivel superior

En general, muchas de las abstracciones de nivel superior (objetos auxiliares específicos de servicios, aparte de los clientes) se han mejorado o actualizado. Y algunas se han eliminado.

Comparación de ejemplos de código de ambas versiones del SDK

En los siguientes ejemplos se muestran algunas de las diferencias entre utilizar la versión 3 del AWS SDK para PHP y utilizar la versión 2.

Ejemplo: operación ListObjects de Amazon S3

En la versión 2 del SDK

<?php require '/path/to/vendor/autoload.php'; use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; $s3 = S3Client::factory([ 'profile' => 'my-credential-profile', 'region' => 'us-east-1' ]); try { $result = $s3->listObjects([ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'my-object-key' ]); foreach ($result['Contents'] as $object) { echo $object['Key'] . "\n"; } } catch (S3Exception $e) { echo $e->getMessage() . "\n"; }

En la versión 3 del SDK

Diferencias clave:

  • Se utiliza new en lugar de factory() para crear instancias del cliente.

  • Las opciones 'version' y 'region' son obligatorias para crear instancias.

<?php require '/path/to/vendor/autoload.php'; use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; $s3 = new S3Client([ 'profile' => 'my-credential-profile', 'region' => 'us-east-1', 'version' => '2006-03-01' ]); try { $result = $s3->listObjects([ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'my-object-key' ]); foreach ($result['Contents'] as $object) { echo $object['Key'] . "\n"; } } catch (S3Exception $e) { echo $e->getMessage() . "\n"; }

Ejemplo: crear una instancia de un cliente con configuración global

En la versión 2 del SDK

<?php return array( 'includes' => array('_aws'), 'services' => array( 'default_settings' => array( 'params' => array( 'profile' => 'my_profile', 'region' => 'us-east-1' ) ), 'dynamodb' => array( 'extends' => 'dynamodb', 'params' => array( 'region' => 'us-west-2' ) ), ) );
<?php require '/path/to/vendor/autoload.php'; use Aws\Common\Aws; $aws = Aws::factory('path/to/my/config.php'); $sqs = $aws->get('sqs'); // Note: SQS client will be configured for us-east-1. $dynamodb = $aws->get('dynamodb'); // Note: DynamoDB client will be configured for us-west-2.

En la versión 3 del SDK

Diferencias clave:

  • Se utiliza la clase Aws\Sdk en lugar de Aws\Common\Aws.

  • No hay ningún archivo de configuración. En su lugar, utilice una matriz para configurar.

  • La opción 'version' es obligatoria durante la creación de instancias.

  • Utilice los métodos create<Service>() en lugar de get('<service>').

<?php require '/path/to/vendor/autoload.php'; $sdk = new Aws\Sdk([ 'profile' => 'my_profile', 'region' => 'us-east-1', 'version' => 'latest', 'DynamoDb' => [ 'region' => 'us-west-2', ], ]); $sqs = $sdk->createSqs(); // Note: Amazon SQS client will be configured for us-east-1. $dynamodb = $sdk->createDynamoDb(); // Note: DynamoDB client will be configured for us-west-2.