【问题标题】:List all AWS Elasticache snapshots taken after a specified date列出在指定日期之后拍摄的所有 AWS Elasticache 快照
【发布时间】:2022-11-17 03:56:45
【问题描述】:

我正在尝试在 AWS CLI 中编写一个查询,该查询将提供早于特定创建日期的 elasticache 快照名称。

我尝试使用 JMESPath 查询,例如:

aws elasticache describe-snapshots \
  --region ap-southeast-1 \
  --snapshot-source "manual" \
  --query 'Snapshots[*].NodeSnapshots[?SnapshotCreateTime >`2022-10-01`] | [?not_null(node)]'

但是,这给了我一个空洞的结果。

aws elasticache describe-snapshots的片段:

{
    "Snapshots": [{
        "SnapshotName": "snapshot-name",
        "ReplicationGroupId": "rep-id",
        "ReplicationGroupDescription": "redis  cluster",
        "CacheClusterId": null,
        "SnapshotStatus": "available",
        "SnapshotSource": "automated",
        "CacheNodeType": "cache.r6g.large",
        "Engine": "redis",
        "EngineVersion": "6.0.5",
        "NumCacheNodes": null,
        "PreferredAvailabilityZone": null,
        "CacheClusterCreateTime": null,
        "PreferredMaintenanceWindow": "sun:20:00-sun:20:00",
        "TopicArn": null,
        "Port": "6379",
        "CacheParameterGroupName": "default.redis6.x.cluster.on",
        "CacheSubnetGroupName": "redis-group",
        "VpcId": "vpc-01bcajghfghj",
        "AutoMinorVersionUpgrade": "true",
        "SnapshotRetentionLimit": "18",
        "SnapshotWindow": "20:00-21:00",
        "NumNodeGroups": "1",
        "AutomaticFailover": "enabled",
        "NodeSnapshots": [{
            "CacheClusterId": "redis-cluster-01",
            "NodeGroupId": "001",
            "CacheNodeId": "001",
            "NodeGroupConfiguration": null,
            "CacheSize": "20 GB",
            "CacheNodeCreateTime": "1632909889675",
            "SnapshotCreateTime": "1667246439000"
        }],
        "KmsKeyId": "kms-id.."
    }]
}

【问题讨论】:

    标签: amazon-web-services redis amazon-elasticache jmespath


    【解决方案1】:

    如果我们以给定in the documentation的JSON为例:

    {
        "Snapshots": [
            {
                "SnapshotName": "automatic.my-cluster2-002-2019-12-05-06-38",
                "NodeSnapshots": [
                    {
                        "CacheNodeId": "0001",
                        "SnapshotCreateTime": "2019-12-05T06:38:23Z"
                    }
                ]
            },
            {
                "SnapshotName": "myreplica-backup",
                "NodeSnapshots": [
                    {
                        "CacheNodeId": "0001",
                        "SnapshotCreateTime": "2019-11-26T00:25:01Z"
                    }
                ]
            },
            {
                "SnapshotName": "my-cluster",
                "NodeSnapshots": [
                    {
                        "CacheNodeId": "0001",
                        "SnapshotCreateTime": "2019-11-26T03:08:33Z"
                    }
                ]
            }
        ]
    }
    

    然后,您会意识到需要对嵌套在数组NodeSnapshots 下的SnapshotCreateTime 进行过滤。

    所以,你在这里需要的是一个双重过滤器:

    • 一个按日期过滤:
      [?SnapshotCreateTime > `2022-10-01`]
      
    • 然后,排除 NodeSnapshots 数组已被前一个过滤器清空的所有快照:
      [?NodeSnapshots[?SnapshotCreateTime > `2022-10-01`]]
      

    因此,如果您只关心快照的名称,则可以使用以下查询:

    Snapshots[?NodeSnapshots[?SnapshotCreateTime > `2022-10-01`]].SnapshotName
    

    所以,你的命令最终是:

    aws elasticache describe-snapshots 
      --region ap-southeast-1 
      --snapshot-source "manual" 
      --query 'Snapshots[?
          NodeSnapshots[?SnapshotCreateTime > `2022-10-01`]
        ].SnapshotName'
    

    现在,根据您在问题中显示的输出,您的问题也来自于您的SnapshotCreateTime 以毫秒为单位的epoch format,因此您只需以正确的格式转换2022-10-01

    如果您使用的是 Linux,则可以在命令中使用 date 执行此操作:

    aws elasticache describe-snapshots 
      --region ap-southeast-1 
      --snapshot-source "manual" 
      --query "Snapshots[?
          NodeSnapshots[?
            SnapshotCreateTime > `$(date --date='2022-10-01' +'%s')000`
          ]
        ].SnapshotName"
    

    【讨论】:

    • 谢谢回复。我尝试使用上面提到的命令,但它没有按提到的日期过滤快照。运行查询后它仍然显示空白,但我在提到的日期之后有快照。
    • 我假设问题出在日期过滤上,因为 JSON 没有日期/时间值的内置类型。普遍的共识是将日期/时间值存储为字符串。请帮助可能的解决方案..
    • JSON 确实没有日期或日期时间类型。这就是说,这里使用的字符串表示的好处是它也可以作为字符串使用:"2022-10-01" > "2022-10-05" 是真的。您可以尝试执行 NodeSnapshots[?SnapshotCreateTime > `2022-10-01T00:00:00Z` 以更加确定,但这应该有效。
    • 为了进一步帮助您,您应该在问题的 edit 中提供 aws elasticache describe-snapshots 命令的匿名 JSON 输出,无需任何查询。
    • 我已经用 JSON 输出更新了问题。
    猜你喜欢
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2014-12-03
    相关资源
    最近更新 更多