As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Expressões do JMESPath no AWS SDK for PHP versão 3
O JMESPathAws\ResultInterface
e Aws\ResultPaginator
.
Você pode experimentar o JMESPath no navegador, testando os Exemplos do JMESPath
A AWS CLI
Extração de dados dos resultados
A interface Aws\ResultInterface
tem um método search($expression)
que extrai dados de um modelo de resultados com base em uma expressão do JMESPath. O uso de expressões do JMESPath para consultar dados de um objeto de resultado pode ajudar a remover código condicional boilerplate e expressar de forma muito mais concisa os dados que estão sendo extraídos.
Para demonstrar como funciona, começaremos com a saída JSON padrão abaixo, que descreve dois volumes do Amazon Elastic Block Store (Amazon EBS) anexados a instâncias separadas do Amazon EC2.
$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" } } }
Primeiro, podemos recuperar somente o primeiro volume da lista Volumes com o seguinte comando.
$firstVolume = $result->search('Volumes[0]');
Agora, usamos a expressão wildcard-index
[*]
para iterar sobre a lista inteira e também para extrair e renomear três elementos: VolumeId
é renomeado para ID
, AvailabilityZone
é renomeada para AZ
e Size
permanece Size
. Podemos extrair e renomear esses elementos usando uma expressão multi-hash
colocada depois da expressão wildcard-index
.
$data = $result->search('Volumes[*].{ID: VolumeId, AZ: AvailabilityZone, Size: Size}');
Isso fornece uma matriz de dados do PHP, como a seguinte:
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) } }
Na notação multi-hash
, também é possível usar chaves encadeadas, como key1.key2[0].key3
para extrair elementos altamente aninhados na estrutura. O exemplo a seguir demonstra isso com a chave Attachments[0].InstanceId
, com o alias simples InstanceId
. (Na maioria dos casos, as expressões do JMESPath ignoram espaços em branco.)
$expr = 'Volumes[*].{ID: VolumeId, InstanceId: Attachments[0].InstanceId, AZ: AvailabilityZone, Size: Size}'; $data = $result->search($expr); var_dump($data);
A saída da expressão anterior conterá os seguintes dados:
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) } }
Você também pode filtrar vários elementos com a expressão multi-list
: [key1, key2]
. Isso formata todos os atributos filtrados em uma única lista ordenada por objeto, independentemente do tipo.
$expr = 'Volumes[*].[VolumeId, Attachments[0].InstanceId, AvailabilityZone, Size]'; $data = $result->search($expr); var_dump($data);
A execução da pesquisa anterior produz os seguintes dados:
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) } }
Use uma expressão filter
para filtrar os resultados de um campo específico. A consulta de exemplo a seguir produz apenas volumes na zona de disponibilidade us-west-2a
.
$data = $result->search("Volumes[?AvailabilityZone ## 'us-west-2a']");
O JMESPath também oferece suporte a expressões de função. Vamos supor que você queira executar a mesma consulta acima, mas recuperar todos os volumes que estão em uma região da AWS que começa com "us-". A expressão a seguir usa a função starts_with
, passando uma sequência literal de us-
. O resultado dessa função é comparado com o valor literal true
do JSON passando apenas os resultados do predicado do filtro que retornou true
por meio da projeção do filtro.
$data = $result->search('Volumes[?starts_with(AvailabilityZone, 'us-') ## `true`]');
Extração de dados dos paginadores
Como você sabe, no guia Paginadores no AWS SDK for PHP Versão 3, os objetos Aws\ResultPaginator
são usados para gerar resultados de uma operação de API paginável. O AWS SDK for PHP permite que você extraia e itere em dados filtrados de objetos Aws\ResultPaginator
, essencialmente implementando um mapa plano
Vamos supor que você queira criar um iterator
que produza apenas objetos de um bucket maior que um MB. Isso pode ser obtido criando um paginador ListObjects
primeiro e, em seguida, aplicando uma função search()
ao paginador, criando um iterador com mapa plano sobre os dados paginados.
$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); }