Actualización desde la versión 2 del AWS SDK for PHP - AWS SDK for PHP

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Actualización desde la versión 2 del AWS SDK for PHP

En este tema se muestra cómo migrar el código para usar la versión 3 de AWS SDK for PHP y en qué se diferencia la nueva versión de la versión 2 deSDK.

nota

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

Introducción

La versión 3 de la AWS SDK for PHP representa un esfuerzo significativo para mejorar las capacidades de laSDK, incorporar más de dos años de comentarios de los clientes, actualizar nuestras dependencias, mejorar el rendimiento y adoptar los PHP estándares más recientes.

¿Qué novedades incluye la versión 3?

La versión 3 AWS SDK for PHP sigue los estándares PSR -4 y PSR -7 y seguirá el SemVerestándar en el futuro.

Otras nuevas características

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

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

  • Posibilidad de consultar datos de objetos de resultados y paginadores con JMESPath

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

Capa desacoplada HTTP

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

  • SDKFuncionará en entornos donde c no URL esté disponible.

  • También se admiten HTTP controladores 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?

Las dependencias del proyecto están actualizadas

Las dependencias del SDK han cambiado en esta versión.

  • SDKAhora requiere una versión superior a PHP 5.5. Usamos generosamente los generadores dentro del código. SDK

  • Lo hemos actualizado SDK para usar Guzzle 6 (o 5), que proporciona la implementación de HTTP cliente subyacente que utilizan SDK para enviar solicitudes a los AWS servicios. La última versión de Guzzle trae consigo una serie de mejoras, que incluyen solicitudes asíncronas, HTTP controladores intercambiables, compatibilidad con PSR -7, mejor rendimiento y más.

  • El paquete PSR -7 de PHP - FIG (psr/http-message) define las interfaces para representar las HTTP solicitudes, las respuestas y las transmisiones. HTTP URLs Estas interfaces se utilizan en Guzzle SDK y en Guzzle, lo que proporciona interoperabilidad con otros paquetes compatibles con PSR -7.

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

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

  • La PHP implementación de JMESPath(mtdowling/jmespath.php) se utiliza SDK para proporcionar la capacidad de consulta de datos de los Aws\ResultPaginator::search() métodos Aws\Result::search() y. Consulte JMESPathExpresiones en la AWS SDK for PHP versión 3 para obtener más información.

Ahora se requieren las opciones Region y Version

Al crear una instancia de un cliente para cualquier servicio, especifique las opciones 'region' y 'version'. En la versión 2 de AWS SDK for PHP, 'version' era completamente opcional y, a veces, 'region' era opcional. En la versión 3, ambas son siempre necesarias. Ser explícito en cuanto a estas dos opciones te permite fijar la API versión y la AWS región en las que estás codificando. Cuando se creen nuevas API versiones o haya nuevas AWS regiones disponibles, estarás protegido de posibles cambios importantes hasta que estés preparado para actualizar tu configuración de forma explícita.

nota

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

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

Para los servicios que solo están disponibles a través de un único punto final global (por ejemplo, Amazon Route 53 y Amazon CloudFront), cree instancias de los clientes con su región configurada configurada como. AWS Identity and Access Managementus-east-1

importante

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

La creación de instancias del cliente utiliza el constructor

En la versión 3 de AWS SDK for PHP, la forma de crear instancias 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 de la versión 3 AWS SDK for PHP han cambiado un poco con respecto a la versión 2. Consulte la página de configuración de la AWS SDK for PHP versión 3 para obtener una descripción de todas las opciones compatibles.

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'. Una de las razones por las que lo hicimos fue para disuadir a los desarrolladores de incluir sus AWS credenciales en sus proyectos.

El objeto Sdk

La versión 3 de AWS SDK for PHP presenta el Aws\Sdk objeto como reemplazo de. 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 Aws clase de la versión 2 de la SDK funcionaba como un localizador de servicios (siempre devolvía la misma instancia de un cliente), la Sdk clase de la versión 3 devuelve una nueva instancia de un cliente cada vez que se usa.

El Sdk objeto tampoco admite el mismo formato de archivo de configuración que en la versión 2 deSDK. 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 API resultados han cambiado

Para proporcionar coherencia en la forma en que SDK analiza el resultado de una API operación, Amazon ElastiCacheRDS, Amazon y Amazon Redshift ahora incluyen un elemento de envoltura adicional en API algunas respuestas.

Por ejemplo, llamar al RDS DescribeEngineDefaultParametersresultado de Amazon en la versión 3 ahora incluye un elemento envolvente «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 (Instantánea)

    • CreateCacheCluster (CacheCluster)

    • CreateCacheParameterGroup (CacheParameterGroup)

    • CreateCacheSecurityGroup (CacheSecurityGroup)

    • CreateCacheSubnetGroup (CacheSubnetGroup)

    • CreateReplicationGroup (ReplicationGroup)

    • CreateSnapshot (Instantánea)

    • DeleteCacheCluster (CacheCluster)

    • DeleteReplicationGroup (ReplicationGroup)

    • DeleteSnapshot (Instantánea)

    • DescribeEngineDefaultParameters (EngineDefaults)

    • ModifyCacheCluster (CacheCluster)

    • ModifyCacheSubnetGroup (CacheSubnetGroup)

    • ModifyReplicationGroup (ReplicationGroup)

    • PurchaseReservedCacheNodesOffering (ReservedCacheNode)

    • RebootCacheCluster (CacheCluster)

    • RevokeCacheSecurityGroupIngress (CacheSecurityGroup)

  • Amazon RDS

    • AddSourceIdentifierToSubscription (EventSubscription)

    • A uthorizeDBSecurity GroupIngress (DBSecurityGroup)

    • opyDBParameterGrupo C (DBParameterGroup)

    • opyDBSnapshot (CDBSnapshot)

    • CopyOptionGroup (OptionGroup)

    • reateDBInstance (CDBInstance)

    • reateDBInstanceReadReplica (CDBInstance)

    • reateDBParameterGrupo C (DBParameterGroup)

    • reateDBSecurityGrupo C (DBSecurityGroup)

    • reateDBSnapshot (CDBSnapshot)

    • reateDBSubnetGrupo C (DBSubnetGroup)

    • CreateEventSubscription (EventSubscription)

    • CreateOptionGroup (OptionGroup)

    • eleteDBInstance (DDBInstance)

    • eleteDBSnapshot (DDBSnapshot)

    • DeleteEventSubscription (EventSubscription)

    • DescribeEngineDefaultParameters (EngineDefaults)

    • M odifyDBInstance (DBInstance)

    • odifyDBSubnetGrupo M (DBSubnetGroup)

    • ModifyEventSubscription (EventSubscription)

    • ModifyOptionGroup (OptionGroup)

    • PromoteReadReplica (DBInstance)

    • PurchaseReservedDBInstancesOffering(ReservedDBInstance)

    • R ebootDBInstance (DBInstance)

    • RemoveSourceIdentifierFromSubscription (EventSubscription)

    • R romDBSnapshot (estoreDBInstanceFDBInstance)

    • R estoreDBInstance ToPointInTime (DBInstance)

    • R evokeDBSecurity GroupIngress (DBSecurityGroup)

  • Amazon Redshift

    • AuthorizeClusterSecurityGroupIngress (ClusterSecurityGroup)

    • AuthorizeSnapshotAccess (Instantánea)

    • CopyClusterSnapshot (Instantánea)

    • CreateCluster (Clúster)

    • CreateClusterParameterGroup (ClusterParameterGroup)

    • CreateClusterSecurityGroup (ClusterSecurityGroup)

    • CreateClusterSnapshot (Instantánea)

    • CreateClusterSubnetGroup (ClusterSubnetGroup)

    • CreateEventSubscription (EventSubscription)

    • CreateHsmClientCertificate (HsmClientCertificate)

    • CreateHsmConfiguration (HsmConfiguration)

    • DeleteCluster (Clúster)

    • DeleteClusterSnapshot (Instantánea)

    • DescribeDefaultClusterParameters (DefaultClusterParameters)

    • DisableSnapshotCopy (Clúster)

    • EnableSnapshotCopy (Clúster)

    • ModifyCluster (Clúster)

    • ModifyClusterSubnetGroup (ClusterSubnetGroup)

    • ModifyEventSubscription (EventSubscription)

    • ModifySnapshotCopyRetentionPeriod (Clúster)

    • PurchaseReservedNodeOffering (ReservedNode)

    • RebootCluster (Clúster)

    • RestoreFromClusterSnapshot (Clúster)

    • RevokeClusterSecurityGroupIngress (ClusterSecurityGroup)

    • RevokeSnapshotAccess (Instantánea)

    • RotateEncryptionKey (Clúster)

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 for PHP. Las enumeraciones eran clases concretas entre el público API del mundo SDK que contenían constantes que representaban grupos de valores de parámetros válidos. Como estas enumeraciones son específicas de cada API versión, pueden cambiar con el tiempo, pueden entrar en conflicto con palabras PHP reservadas y, por lo tanto, no son muy útiles, las eliminamos en la versión 3. Esto confirma la naturaleza independiente de la API versión 3, basada en datos e independiente de las versiones.

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 generadas por un servicio u operación dependen de la API versión que se utilice (pueden cambiar de una versión a otra). 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. Esto equivale funcionalmente a detectar diferentes clases de excepciones, pero proporciona esa función sin añadir hinchazón a la. SDK

Se han eliminado las clases Facade estáticas

En la versión 2 de AWS SDK for PHP, había una característica poco conocida inspirada en Laravel que permitía utilizar la Aws clase para permitir enableFacades() el acceso estático a los distintos clientes del servicio. Esta función va en contra de las PHP mejores prácticas y 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 AWS SDK for PHP tenía una función denominada * 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 Paginator tienen un search() método que permite utilizar JMESPathexpresiones para extraer datos del conjunto de resultados con mayor facilidad.

$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.

  • Actualizaciones:
    • Ha cambiado la manera de utilizar la Carga multiparte de Amazon S3. La carga multiparte de Amazon S3 Glacier también se ha modificado de forma parecida.

    • La forma de crear Amazon S3 prefirmado URLs ha cambiado.

    • El espacio de nombres Aws\S3\Sync se ha sustituido por la clase Aws\S3\Transfer. Los métodos S3Client::uploadDirectory() y S3Client::downloadBucket() siguen estando disponibles, pero tienen diferentes opciones. Consulte la documentación de Amazon S3 Transfer Manager con AWS SDK for PHP la versión 3.

    • Aws\S3\Model\ClearBucket y Aws\S3\Model\DeleteObjectsBatch se han sustituido por Aws\S3\BatchDelete y S3Client::deleteMatchingObjects().

    • Las opciones y los comportamientos de Using the DynamoDB Session Handler AWS SDK for PHP con la versión 3 han cambiado ligeramente.

    • El espacio de nombres Aws\DynamoDb\Model\BatchRequest se ha sustituido por Aws\DynamoDb\WriteRequestBatch. Consulte la documentación de DynamoDB WriteRequestBatch.

    • Aws\Ses\SesClient ahora se encarga de la codificación base64 de RawMessage cuando se utiliza la operación SendRawEmail.

  • Eliminaciones:
    • Las clases Item, Attribute y ItemIterator de Amazon DynamoDB ya eran obsoletas en la versión 2.7.0.

    • Validador de SNS mensajes de Amazon: ahora se trata de un proyecto independiente y ligero que no requiere que SDK sea una dependencia. Sin embargo, este proyecto está incluido en Phar y en las ZIP distribuciones de. SDK Encontrará una guía de introducción en el blog de AWS PHP desarrollo.

    • Se han eliminado AcpBuilder de Amazon S3 y objetos relacionados.

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

Los siguientes ejemplos muestran algunos de los aspectos en los que el uso de la versión 3 AWS SDK for PHP puede diferir del de la versión 2.

Ejemplo: ListObjects operación de Amazon S3

A partir de 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"; }

A partir de 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

A partir de 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.

A partir de 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.