의 버전 2에서 업그레이드 AWS SDK for PHP - AWS SDK for PHP

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

의 버전 2에서 업그레이드 AWS SDK for PHP

이 주제에서는 의 AWS SDK for PHP 버전 3을 사용하도록 코드를 마이그레이션하는 방법과 새 버전이 의 버전 2와 어떻게 다른지 보여줍니다SDK.

참고

의 기본 사용 패턴SDK(예: $result = $client->operation($params);)이 버전 2에서 버전 3으로 변경되지 않았으므로 마이그레이션이 원활해집니다.

소개

의 버전 3 AWS SDK for PHP 은 의 기능을 개선하고SDK, 2년 이상의 고객 피드백을 통합하고, 종속성을 업그레이드하고, 성능을 개선하고, 최신 PHP 표준을 채택하기 위한 상당한 노력을 나타냅니다.

버전 3의 새 기능

의 버전 3은 AWS SDK for PHP PSR-4 및 PSR-7 표준을 따르며 향후 SemVer 표준을 따릅니다.

기타 새로운 기능은 다음과 같습니다.

  • 서비스 클라이언트 동작을 사용자 지정하기 위한 미들웨어 시스템

  • 페이지 지정된 결과를 반복하는 유연한 페이지네이터

  • 를 사용하여 결과페이지 매김기 객체의 데이터를 쿼리하는 기능 JMESPath

  • 'debug' 구성 옵션을 통해 손쉽게 디버깅

분리된 HTTP 계층

  • 기본적으로 Guzzle 6가 요청을 전송하는 데 사용되지만, Guzzle 5도 지원됩니다.

  • SDK 는 cURL를 사용할 수 없는 환경에서 작동합니다.

  • 사용자 지정 HTTP 핸들러도 지원됩니다.

비동기 요청

  • 또한 waiter, 멀티파트 업로더 등과 같은 기능을 비동기로 사용할 수 있습니다.

  • promise코루틴을 사용하여 비동기 워크플로를 생성할 수 있습니다.

  • 동시 또는 배치 요청의 성능이 향상되었습니다.

버전 2와의 차이점

프로젝트 종속 항목이 업데이트됨

이 버전에서는 의 종속성이 SDK 변경되었습니다.

  • SDK 이제 에 PHP 5.5+가 필요합니다. SDK 코드 내에서 생성기를 자유롭게 사용합니다.

  • Guzzle 6(또는 5)SDK을 사용하도록 를 업그레이드했습니다. Guzzle 6(또는 5)은 에서 AWS 서비스에 요청을 보내는 SDK 데 사용하는 기본 HTTP 클라이언트 구현을 제공합니다. 최신 버전의 Guzzle은 비동기식 요청, 교체 가능한 HTTP 핸들러, PSR-7 규정 준수, 더 나은 성능 등을 비롯한 다양한 개선 사항을 제공합니다.

  • PSR- (psr/http-message)의 PHP-FIG7 패키지는 HTTP 요청, HTTP 응답URLs, 및 스트림을 나타내는 인터페이스를 정의합니다. 이러한 인터페이스는 SDK 및 Guzzle에서 사용되며, 다른 PSR-7 호환 패키지와의 상호 운용성을 제공합니다.

  • Guzzle의 PSR-7 구현(guzzlehttp/psr7)은 PSR-7의 인터페이스 구현과 여러 유용한 클래스 및 함수를 제공합니다. SDK 및 Guzzle 6 모두 이 패키지에 크게 의존합니다.

  • Guzzle의 Promises/A+ 구현(guzzlehttp/promises)은 SDK 및 Guzzle 전체에서 비동기 요청 및 코루틴을 관리하기 위한 인터페이스를 제공하는 데 사용됩니다. Guzzle의 다중 CURL HTTP 핸들러는 비동기 요청을 허용하는 비차단 I/O 모델을 궁극적으로 구현하지만 이 패키지는 해당 패러다임 내에서 프로그래밍할 수 있는 기능을 제공합니다. 자세한 내용은 AWS SDK for PHP 버전 3의 약속을 참조하세요.

  • JMESPath (mtdowling/jmespath.php)의 PHP 구현은 에서 Aws\Result::search()Aws\ResultPaginator::search() 메서드의 데이터 쿼리 기능을 제공하는 SDK 데 사용됩니다. 자세한 내용은 JMESPath AWS SDK for PHP 버전 3의 표현식을 참조하세요.

이제 리전 및 버전 옵션이 필요합니다.

서비스에 대한 클라이언트를 인스턴스화할 때 'region''version' 옵션을 지정합니다. 의 버전 2에서 AWS SDK for PHP'version'는 완전히 선택 사항이었고 때로는 선택 사항'region'이었습니다. 버전 3에서는 둘 모두 항상 필요합니다. 이 두 옵션 모두에 대해 명시적으로 설명하면 코딩하려는 API 버전과 AWS 리전을 잠글 수 있습니다. 새 API 버전이 생성되거나 새 AWS 리전을 사용할 수 있게 되면 구성을 명시적으로 업데이트할 준비가 될 때까지 잠재적으로 중단되는 변경 사항으로부터 격리됩니다.

참고

사용 중인 API 버전이 걱정되지 않는 경우 'version' 옵션을 로 설정하면 됩니다'latest'. 그러나 프로덕션 코드에 대한 API 버전 번호를 명시적으로 설정하는 것이 좋습니다.

일부 AWS 리전에서는 일부 서비스를 사용할 수 없습니다. 이전 및 엔드포인트 참조를 사용하여 사용 가능한 리전 목록을 확인할 수 있습니다.

단일 글로벌 엔드포인트(예: Amazon Route 53, AWS Identity and Access Management및 Amazon CloudFront)를 통해서만 사용할 수 있는 서비스의 경우 구성된 리전이 로 설정된 상태로 클라이언트를 인스턴스화합니다us-east-1.

중요

에는 명령 파라미터로 제공된 파라미터(@region)를 기반으로 요청을 다른 AWS 리전으로 디스패치할 수 있는 다중 리전 클라이언트SDK도 포함되어 있습니다. 이러한 클라이언트에서 기본적으로 사용되는 리전은 클라이언트 생성자에 제공된 region 옵션으로 지정됩니다.

클라이언트 인스턴스화에서 생성자 사용

의 버전 3에서는 클라이언트를 인스턴스화하는 AWS SDK for PHP방식이 변경되었습니다. 버전 2의 factory 메서드 대신 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' ]);
참고

factory() 메서드를 통한 클라이언트 인스턴스화도 계속 작동합니다. 하지만 사용되지 않는 것으로 간주됩니다.

클라이언트 구성이 변경됨

버전 3의 클라이언트 구성 옵션이 버전 2에서 약간 AWS SDK for PHP 변경되었습니다. 지원되는 모든 옵션에 대한 설명은 AWS SDK for PHP 버전 3의 구성을 참조하세요.

중요

버전 3에서는 'key''secret'이 더 이상 루트 수준에서 유효한 옵션이 아니지만, 'credentials' 옵션의 일부로 전달할 수 있습니다. 이렇게 한 이유 중 하나는 개발자가 자격 AWS 증명을 프로젝트에 하드 코딩하지 않도록 하기 위한 것이었습니다.

SDK 객체

의 버전 3에서는 Aws\Sdk 객체를 의 대체품으로 AWS SDK for PHP 도입합니다Aws\Common\Aws. Sdk 객체는 클라이언트 팩토리 역할을 하며 여러 클라이언트 간의 공유 구성 옵션을 관리하는 데 사용됩니다.

버전 2의 Aws 클래스는 서비스 로케이터처럼 SDK 작동했지만(항상 클라이언트의 동일한 인스턴스를 반환함), 버전 3의 Sdk 클래스는 클라이언트를 사용할 때마다 클라이언트의 새 인스턴스를 반환합니다.

또한 Sdk 객체는 버전 2와 동일한 구성 파일 형식을 지원하지 않습니다SDK. 이 구성 형식은 Guzzle 3에 특정하며 이제 사용되지 않습니다. 구성은 기본 배열을 사용하여 간단히 수행할 수 있으며 SDK 클래스 사용에 설명되어 있습니다.

일부 API 결과가 변경되었습니다.

가 API 작업 결과를 구문 분석하는 방법에 일관성을 제공하기 위해 Amazon SDK , ElastiCacheAmazon RDS, Amazon Redshift는 이제 일부 API 응답에 대해 추가 래핑 요소를 갖게 됩니다.

예를 들어 버전 3에서 Amazon RDSDescribeEngineDefaultParameters 결과를 호출하면 이제 래핑 “EngineDefaults” 요소가 포함됩니다. 버전 2에는 이 요소가 없습니다.

$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'];

이 변경의 영향을 받고 결과 출력에 래핑 요소가 포함되는 작업은 다음과 같습니다(아래 괄호 안에 제공됨).

  • Amazon ElastiCache

    • AuthorizeCacheSecurityGroupIngress (CacheSecurityGroup)

    • CopySnapshot (스냅샷)

    • CreateCacheCluster (CacheCluster)

    • CreateCacheParameterGroup (CacheParameterGroup)

    • CreateCacheSecurityGroup (CacheSecurityGroup)

    • CreateCacheSubnetGroup (CacheSubnetGroup)

    • CreateReplicationGroup (ReplicationGroup)

    • CreateSnapshot (스냅샷)

    • DeleteCacheCluster (CacheCluster)

    • DeleteReplicationGroup (ReplicationGroup)

    • DeleteSnapshot (스냅샷)

    • DescribeEngineDefaultParameters (EngineDefaults)

    • ModifyCacheCluster (CacheCluster)

    • ModifyCacheSubnetGroup (CacheSubnetGroup)

    • ModifyReplicationGroup (ReplicationGroup)

    • PurchaseReservedCacheNodesOffering (ReservedCacheNode)

    • RebootCacheCluster (CacheCluster)

    • RevokeCacheSecurityGroupIngress (CacheSecurityGroup)

  • Amazon RDS

    • AddSourceIdentifierToSubscription (EventSubscription)

    • AuthorizeDBSecurityGroupIngress (DBSecurityGroup)

    • C opyDBParameter그룹(DBParameterGroup)

    • CopyDBSnapshot (DBSnapshot)

    • CopyOptionGroup (OptionGroup)

    • CreateDBInstance (DBInstance)

    • CreateDBInstanceReadReplica (DBInstance)

    • C reateDBParameter그룹(DBParameterGroup)

    • C reateDBSecurity그룹(DBSecurityGroup)

    • CreateDBSnapshot (DBSnapshot)

    • C reateDBSubnet그룹(DBSubnetGroup)

    • CreateEventSubscription (EventSubscription)

    • CreateOptionGroup (OptionGroup)

    • DeleteDBInstance (DBInstance)

    • DeleteDBSnapshot (DBSnapshot)

    • DeleteEventSubscription (EventSubscription)

    • DescribeEngineDefaultParameters (EngineDefaults)

    • ModifyDBInstance (DBInstance)

    • M odifyDBSubnet그룹(DBSubnetGroup)

    • ModifyEventSubscription (EventSubscription)

    • ModifyOptionGroup (OptionGroup)

    • PromoteReadReplica (DBInstance)

    • PurchaseReservedDBInstancesOffering (R eservedDBInstance)

    • RebootDBInstance (DBInstance)

    • RemoveSourceIdentifierFromSubscription (EventSubscription)

    • R estoreDBInstanceFromDBSnapshot (DBInstance)

    • RestoreDBInstanceToPointInTime (DBInstance)

    • RevokeDBSecurityGroupIngress (DBSecurityGroup)

  • Amazon Redshift

    • AuthorizeClusterSecurityGroupIngress (ClusterSecurityGroup)

    • AuthorizeSnapshotAccess (스냅샷)

    • CopyClusterSnapshot (스냅샷)

    • CreateCluster (클러스터)

    • CreateClusterParameterGroup (ClusterParameterGroup)

    • CreateClusterSecurityGroup (ClusterSecurityGroup)

    • CreateClusterSnapshot (스냅샷)

    • CreateClusterSubnetGroup (ClusterSubnetGroup)

    • CreateEventSubscription (EventSubscription)

    • CreateHsmClientCertificate (HsmClientCertificate)

    • CreateHsmConfiguration (HsmConfiguration)

    • DeleteCluster (클러스터)

    • DeleteClusterSnapshot (스냅샷)

    • DescribeDefaultClusterParameters (DefaultClusterParameters)

    • DisableSnapshotCopy (클러스터)

    • EnableSnapshotCopy (클러스터)

    • ModifyCluster (클러스터)

    • ModifyClusterSubnetGroup (ClusterSubnetGroup)

    • ModifyEventSubscription (EventSubscription)

    • ModifySnapshotCopyRetentionPeriod (클러스터)

    • PurchaseReservedNodeOffering (ReservedNode)

    • RebootCluster (클러스터)

    • RestoreFromClusterSnapshot (클러스터)

    • RevokeClusterSecurityGroupIngress (ClusterSecurityGroup)

    • RevokeSnapshotAccess (스냅샷)

    • RotateEncryptionKey (클러스터)

Enum 클래스 제거됨

AWS SDK for PHP버전 2에 있던 Enum 클래스(예: Aws\S3\Enum\CannedAcl)를 제거했습니다. 열거형은 유효한 파라미터 값의 그룹을 나타내는 상수SDK가 포함된 API의 퍼블릭 내 콘크리트 클래스였습니다. 이러한 열거형은 API 버전에 따라 다르고, 시간이 지남에 따라 변경될 수 있으며, PHP 예약된 단어와 충돌하여 유용하지 않을 수 있으므로 버전 3에서 제거했습니다. 이는 API 버전 3의 데이터 기반 및 버전에 구애받지 않는 특성을 지원합니다.

Enum 객체의 값을 사용하는 대신 리터럴 값을 직접 사용합니다(예: CannedAcl::PUBLIC_READ'public-read').

세부 예외 클래스 제거

열거형을 제거한 것과 흡사한 이유로 각 서비스의 네임스페이스에 존재했던 세부 예외 클래스(예: Aws\Rds\Exception\{SpecificError}Exception)를 제거했습니다. 서비스 또는 작업에서 발생하는 예외는 사용되는 API 버전에 따라 달라집니다(버전마다 변경될 수 있음). 또한 버전 2의 세부 예외 클래스가 완성되지 않았으므로 지정된 작업에서 발생될 수 있는 전체 예외 목록이 제공되지 않습니다.

따라서 각 서비스에 대한 근본적인 예외 클래스(예: Aws\Rds\Exception\RdsException)를 파악하여 오류를 처리합니다. 예외의 getAwsErrorCode() 메서드를 사용하여 특정 오류 코드를 확인할 수 있습니다. 이는 다양한 예외 클래스를 포착하는 것과 기능적으로 동일하지만 에 부동 소수점을 추가하지 않고 해당 함수를 제공합니다SDK.

정적 Facade 클래스 제거

의 버전 2에는 Laravel에서 영감을 받은 모호한 기능이 AWS SDK for PHP있어서 Aws 클래스enableFacades()에서 를 호출하여 다양한 서비스 클라이언트에 대한 정적 액세스를 활성화할 수 있었습니다. 이 기능은 PHP 모범 사례에 반하므로 1년 전에 문서화를 중단했습니다. 버전 3에서는 이 기능이 완전히 제거되었습니다. Aws\Sdk 객체에서 클라이언트 객체를 가져온 다음 해당 객체를 정적 클래스가 아닌 객체 인스턴스로 사용합니다.

페이지네이터로 반복기 대체

버전 2에는 * 반복자*라는 기능이 AWS SDK for PHP 있었습니다. 이 기능은 페이지 지정된 결과를 반복하는 데 사용되는 객체입니다. 이와 관련하여 반복기는 각 결과에서 특정 값만 내보내므로 유연성이 부족하다는 불만이 있었습니다. 따라서 결과에 필요한 다른 값이 있는 경우 이벤트 리스너를 통해 검색해야 합니다.

버전 3에서는 반복기가 페이지네이터로 대체되었습니다. 목적은 비슷하지만 페이지네이터는 더 유연합니다. 이는 응답에서 값 대신 결과 객체를 출력하기 때문입니다.

다음 예에서는 버전 2와 버전 3에서 S3 ListObjects 작업에 대한 페이지 지정된 결과를 검색하는 방법을 설명하여 페이지네이터가 반복기와 어떻게 다른지를 보여줍니다.

// 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"; } }

패지네이터 객체에는 표현JMESPath식을 사용하여 결과 세트에서 데이터를 더 쉽게 추출할 수 있는 search() 메서드가 있습니다.

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

버전 3으로 부드럽게 전환할 수 있도록 getIterator() 메서드가 계속 지원되지만 코드를 마이그레이션하여 페이지네이터를 사용하는 것이 좋습니다.

많은 상위 수준 추상화 변경

일반적으로 많은 상위 수준 추상화(서비스별 헬퍼 객체, 클라이언트와 별개로)가 개선되거나 업데이트되었습니다. 또한 일부는 제거되었습니다.

  • Updated:
    • Amazon S3 멀티파트 업로드를 사용하는 방법이 변경되었습니다. Amazon S3 Glacier 멀티파트 업로드도 비슷한 방법으로 변경되었습니다.

    • 사전 서명된 Amazon S3URLs를 생성하는 방법이 변경되었습니다.

    • Aws\S3\Sync 네임스페이스가 Aws\S3\Transfer 클래스로 대체되었습니다. S3Client::uploadDirectory()S3Client::downloadBucket() 메서드를 계속 사용할 수 있지만 다른 옵션이 있습니다. AWS SDK for PHP 버전 3의 Amazon S3 Transfer Manager 설명서를 참조하세요.

    • Aws\S3\Model\ClearBucketAws\S3\Model\DeleteObjectsBatchAws\S3\BatchDeleteS3Client::deleteMatchingObjects()로 대체되었습니다.

    • AWS SDK for PHP 버전 3에서 DynamoDB 세션 핸들러 사용에 대한 옵션과 동작이 약간 변경되었습니다.

    • Aws\DynamoDb\Model\BatchRequest 네임스페이스가 Aws\DynamoDb\WriteRequestBatch로 대체되었습니다. DynamoDB WriteRequestBatch에 대한 설명서를 참조하세요.

    • 이제 SendRawEmail 작업을 사용하면 Aws\Ses\SesClientRawMessage를 인코딩하는 base64를 처리합니다.

  • 제거된 항목:
    • Amazon DynamoDBItem, Attribute, 및 ItemIterator 클래스 - 이미 버전 2.7.0부터 사용되지 않습니다.

    • Amazon SNS 메시지 검사기 - 이제 를 종속성SDK으로 요구하지 않는 별도의 경량 프로젝트입니다. 그러나 이 프로젝트는 의 Phar 및 ZIP 배포에 포함됩니다SDK. 개발 블로그에서 AWS PHP 시작하기 가이드를 찾을 수 있습니다.

    • Amazon S3AcpBuilder 및 관련 객체를 제거했습니다.

두 버전의 코드 샘플 비교 SDK

다음 예제에서는 의 버전 3을 사용하는 방법이 버전 2와 다를 AWS SDK for PHP 수 있는 몇 가지 방법을 보여줍니다.

예: Amazon S3 ListObjects Operation

의 버전 2에서 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"; }

의 버전 3에서 SDK

주요 차이점:

  • new 대신 factory()를 사용하여 클라이언트를 인스턴스화합니다.

  • 인스턴스화 중에 'version''region' 옵션이 필요합니다.

<?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"; }

예제: 전역 구성으로 클라이언트 인스턴스화

의 버전 2에서 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.

의 버전 3에서 SDK

주요 차이점:

  • Aws\Sdk 대신 Aws\Common\Aws 클래스를 사용합니다.

  • 구성 파일이 없습니다. 구성에 대한 배열을 대신 사용합니다.

  • 인스턴스화 중에 'version' 옵션이 필요합니다.

  • create<Service>() 대신 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.