기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS SDK for PHP 버전 3의 JMEsPath 표현식
JMESPathAws\ResultInterface
및 Aws\ResultPaginator
에서 JMESPath 검색을 노출합니다.
온라인 JMESPath 예제
AWS CLI
결과에서 데이터 추출
Aws\ResultInterface
인터페이스에는 JMESPath 표현식을 기반으로 결과 모델에서 데이터를 추출하는 search($expression)
메서드가 있습니다. JMESPath 표현식을 사용하여 결과 객체에서 데이터를 쿼리하면 보일러플레이트 조건부 코드를 제거하고, 추출 중인 데이터를 자세히 나타낼 수 있습니다.
작동 방식을 보여 주기 위해 먼저 아래와 같은 기본 JSON 출력으로 시작합니다. 여기서는 별도의 EC2 인스턴스에 연결된 두 개의 Amazon Elastic Block Store (Amazon EBS) 볼륨을 설명합니다.
$result = $ec2Client->describeVolumes(); // Output the result data as JSON (just so we can clearly visualize it) echo json_encode($result->toArray(), JSON_PRETTY_PRINT);
{ "Volumes": [ { "AvailabilityZone": "us-west-2a", "Attachments": [ { "AttachTime": "2013-09-17T00:55:03.000Z", "InstanceId": "i-a071c394", "VolumeId": "vol-e11a5288", "State": "attached", "DeleteOnTermination": true, "Device": "/dev/sda1" } ], "VolumeType": "standard", "VolumeId": "vol-e11a5288", "State": "in-use", "SnapshotId": "snap-f23ec1c8", "CreateTime": "2013-09-17T00:55:03.000Z", "Size": 30 }, { "AvailabilityZone": "us-west-2a", "Attachments": [ { "AttachTime": "2013-09-18T20:26:16.000Z", "InstanceId": "i-4b41a37c", "VolumeId": "vol-2e410a47", "State": "attached", "DeleteOnTermination": true, "Device": "/dev/sda1" } ], "VolumeType": "standard", "VolumeId": "vol-2e410a47", "State": "in-use", "SnapshotId": "snap-708e8348", "CreateTime": "2013-09-18T20:26:15.000Z", "Size": 8 } ], "@metadata": { "statusCode": 200, "effectiveUri": "https:\/\/ec2.us-west-2.amazonaws.com", "headers": { "content-type": "text\/xml;charset=UTF-8", "transfer-encoding": "chunked", "vary": "Accept-Encoding", "date": "Wed, 06 May 2015 18:01:14 GMT", "server": "AmazonEC2" } } }
먼저 다음 명령을 사용하여 볼륨 목록의 첫 번째 볼륨만 검색할 수 있습니다.
$firstVolume = $result->search('Volumes[0]');
이제 wildcard-index
expression [*]
를 사용하여 전체 목록을 반복하고 세 요소를 추출한 후 VolumeId
는 ID
로, AvailabilityZone
은 AZ
로 이름을 바꾸고 Size
는 Size
로 그대로 둡니다. 이러한 요소를 추출한 후 multi-hash
표현식을 wildcard-index
표현식 뒤에 사용하여 이름을 바꿉니다.
$data = $result->search('Volumes[*].{ID: VolumeId, AZ: AvailabilityZone, Size: Size}');
그러면 다음과 같은 PHP 데이터 배열이 제공됩니다.
array(2) { [0] => array(3) { 'AZ' => string(10) "us-west-2a" 'ID' => string(12) "vol-e11a5288" 'Size' => int(30) } [1] => array(3) { 'AZ' => string(10) "us-west-2a" 'ID' => string(12) "vol-2e410a47" 'Size' => int(8) } }
또한 multi-hash
표기법에서는 key1.key2[0].key3
과 같은 체인 키를 사용하여 구조 내에 깊이 중첩된 요소를 추출할 수 있습니다. 다음 예에서는 간단히 Attachments[0].InstanceId
라는 별칭이 지정된 InstanceId
키를 사용하여 이 작업을 보여 줍니다. 대부분의 경우 JMESPath 표현식에서는 공백을 무시합니다.
$expr = 'Volumes[*].{ID: VolumeId, InstanceId: Attachments[0].InstanceId, AZ: AvailabilityZone, Size: Size}'; $data = $result->search($expr); var_dump($data);
이전 표현식은 다음 데이터를 출력합니다.
array(2) { [0] => array(4) { 'ID' => string(12) "vol-e11a5288" 'InstanceId' => string(10) "i-a071c394" 'AZ' => string(10) "us-west-2a" 'Size' => int(30) } [1] => array(4) { 'ID' => string(12) "vol-2e410a47" 'InstanceId' => string(10) "i-4b41a37c" 'AZ' => string(10) "us-west-2a" 'Size' => int(8) } }
multi-list
expression:[key1, key2]
를 사용하여 여러 요소를 필터링할 수도 있습니다. 이렇게 하면 유형과 상관없이 필터링된 모든 속성이 객체당 단 하나의 순서가 지정된 목록으로 서식 지정됩니다.
$expr = 'Volumes[*].[VolumeId, Attachments[0].InstanceId, AvailabilityZone, Size]'; $data = $result->search($expr); var_dump($data);
이전 검색을 실행하면 다음과 같은 데이터가 생성됩니다.
array(2) { [0] => array(4) { [0] => string(12) "vol-e11a5288" [1] => string(10) "i-a071c394" [2] => string(10) "us-west-2a" [3] => int(30) } [1] => array(4) { [0] => string(12) "vol-2e410a47" [1] => string(10) "i-4b41a37c" [2] => string(10) "us-west-2a" [3] => int(8) } }
특정 필드 값을 기준으로 결과를 필터링하려면 filter
표현식을 사용합니다. 다음 예제 쿼리는 us-west-2a
가용 영역의 볼륨만 출력합니다.
$data = $result->search("Volumes[?AvailabilityZone ## 'us-west-2a']");
JMESPath에서는 함수 표현식도 지원합니다. 위와 동일한 쿼리를 실행하지만 이번에는 AWS 리전에서 "us-"로 시작하는 모든 볼륨을 검색한다고 가정합니다. 다음 표현식에서는 starts_with
문자열 리터럴을 전달하여 us-
함수를 사용합니다. 그런 다음 필터 투영을 통해 true
를 반환한 필터 조건자의 결과만 전달하여 이 함수의 결과를 true
JSON 리터럴 값과 비교합니다.
$data = $result->search('Volumes[?starts_with(AvailabilityZone, 'us-') ## `true`]');
페이지네이터에서 데이터 추출
AWS SDK for PHP 버전 3의 페이지네이터 가이드에서 살펴본 대로 Aws\ResultPaginator
객체는 페이징 가능한 API 작업에서 결과를 출력하는 데 사용됩니다. AWS SDK for PHP를 사용하면 Aws\ResultPaginator
객체에서 필터링된 데이터를 추출하여 반복할 수 있습니다. 이때 JMESPath 표현식의 결과가 맵 함수인 반복자에 대해 flat-map
버킷에서 1MB보다 큰 객체만 출력하는 iterator
를 생성한다고 가정합니다. 이렇게 하려면 ListObjects
페이지네이터를 생성한 다음 search()
함수를 페이지네이터에 적용하여 페이지 지정된 데이터에 대해 flat-map 반복자를 생성합니다.
$result = $s3Client->getPaginator('ListObjects', ['Bucket' => 't1234']); $filtered = $result->search('Contents[?Size > `1048576`]'); // The result yielded as $data will be each individual match from // Contents in which the Size attribute is > 1048576 foreach ($filtered as $data) { var_dump($data); }