我当前正在使用以下CLI命令来获取给定实例 Name 标签'myInstanceName'的实例 PublicIPAddress 和 LaunchTime :
aws ec2 describe-instances --filters 'Name=tag:Name,Values=myInstanceName' \
--region us-east-1 \
--query 'Reservations[*].Instances[*].{PublicIpAddress: PublicIpAddress, LaunchTime: LaunchTime}'
结果如下:
[
{
"LaunchTime": "2019-01-25T11:49:06.000Z",
"PublicIpAddress": "11.111.111.11"
}
]
这很好,但是如果有两个具有相同名称的实例,我将在结果JSON中得到两个结果。我需要找到一种方法来获取给定名称的最新实例。
解决方案更新
此问题非常特定于EC2实例。可以使用两种不同的方法来解决该问题,请在下面回答:
Parsing Result with jq
Using JMESPath
请参阅此related question,以获取使用JMESPath按日期进行的更一般的排序以及进一步的阅读。
答案 0 :(得分:6)
这是一种用于查找最新启动的实例并显示有关它的数据的方法:
var jsonData = JSON.parse(responseBody);
var schema = {...contains multiple error}
var results = tv4.validateMultiple(jsonData, schema);
if(results.valid){
pm.test('Response has valid schema') = true;
} else {
for (var i = 0; i < results.errors.length; i++) {
pm.test("Contract: JSON Response has invalid schema in path [" + results.errors[i].dataPath + " | " + results.errors[i]);
}
}
aws ec2 describe-instances --query 'sort_by(Reservations[].Instances[], &LaunchTime)[:-1].[InstanceId,PublicIpAddress,LaunchTime]'
将返回上一次启动的实例。然后从这些实例中检索字段。
要了解这种乐趣,请参阅:
答案 1 :(得分:5)
尝试使用jq实用程序。这是一个命令行JSON解析器。如果您不熟悉它,那么我建议您试用jq playground。
首先将awcli结果平坦化,如下所示:
<?php
//Including Database configuration file.
include "db.php";
//Getting value of "search" variable from "script.js".
if (isset($_GET['search'])) {
//Search box value assigning to $Name variable.
$Name = $_GET['search'];
//Search query.
$Query = "SELECT Name FROM search WHERE Name LIKE '$Name%' LIMIT 5";
//Query execution
$ExecQuery = MySQLi_query($con, $Query);
//Creating unordered list to display result.
if ($ExecQuery->num_rows > 0) {
echo "<ul>";
while ($Result = MySQLi_fetch_array($ExecQuery)) {
echo "<li onclick='fill".$Result['Name']."'>".$Result['Name']."
</li>";
}
echo "</ul>";
}
}
die();
?>
请注意,为简洁起见,我将aws ec2 describe-instances \
--query 'Reservations[].Instances[].{ip: PublicIpAddress, tm: LaunchTime}' \
--filters 'Name=tag:Name,Values= myInstanceName'
别名为LaunchTime
。这样会导致(未排序的)输出,如下所示:
tm
接下来,将此结果通过管道传递到[
{
"ip": "54.4.5.6",
"tm": "2019-01-04T19:54:11.000Z"
},
{
"ip": "52.1.2.3",
"tm": "2019-03-04T20:04:00.000Z"
}
]
中,并按降序排列jq
(tm
的别名)进行排序,如下所示:
LaunchTime
这将导致如下输出:
jq 'sort_by(.tm) | reverse'
最后,使用[
{
"ip": "52.1.2.3",
"tm": "2019-03-04T20:04:00.000Z"
},
{
"ip": "54.4.5.6",
"tm": "2019-01-04T19:54:11.000Z"
}
]
过滤掉除第一个结果以外的所有结果,如下所示:
jq
这将产生一个结果,即最近启动的实例:
jq 'sort_by(.tm) | reverse | .[0]'
将它们放在一起,最终命令是:
{
"ip": "52.1.2.3",
"tm": "2019-03-04T20:04:00.000Z"
}