【问题标题】:How to search resources without a specific tag如何在没有特定标签的情况下搜索资源
【发布时间】:2018-07-20 16:33:10
【问题描述】:

我正在使用 AWS Javascript SDK 通过 AWS API 查询我的云基础设施。

我可以通过在过滤器中指定 key=value 对的标签来查询资源,例如“Environment=Production”。我找不到的是如何查询空值标签或不存在的标签。例如,我想查询所有没有定义特定标签的 EC2 实例,比如说,所有没有“环境”标签的 EC2 实例。

SDK 可以做到吗?

【问题讨论】:

  • 不知道您可以使用 SDK 执行此操作(而不是执行客户端过滤),但 AWS 控制台提供了类似的功能 (docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/…)
  • 感谢@jarmod,但我需要使用 sdk,因为我希望在这里自动执行任务。
  • 有道理。那么我认为你最好的办法是描述所有资源并应用客户端过滤器。您还可以在此处潜在地执行其他主动操作,例如编写要求以某种方式标记实例的 IAM 策略,或编写 CloudTrail Log 事件处理以响应没有必要标签集的实例启动。
  • 准确地说,作为第一步,我想尽可能地自动修复所有丢失的标签。如果没有其他办法,将使用客户端过滤。谢谢!

标签: javascript amazon-web-services amazon-ec2 aws-sdk aws-sdk-js


【解决方案1】:

其中一种方法是使用describeInstances()

const ec2 = new AWS.EC2({
    region: "us-west-2"
});
var clearThese = [];
ec2.describeInstances(function (err, data) {
    if (err) return err;

    data.Reservations.forEach(function (reservation) {
        reservation.Instances.forEach(function (instance) {
            //console.log(instance.Tags);
            let temp = instance.Tags.filter(function (arr) { return arr.Key === 'Environment' })[0];
            if (temp !== "undefined") {
                clearThese.push(instance.InstanceId);
            }

        });

    });
    console.log(clearThese);
});

因此,您将在clearThese 数组中拥有您的Instance IDs,您可以将其传递给stopInstances() 函数来停止VM 或terminateInstances() 以直接终止它们。

此外,您可以使用区域数组在所有区域中运行此代码。

【讨论】:

    【解决方案2】:

    您可以将 nodejs 子进程与 aws-cli 结合使用,例如:

    const { exec } = require('child_process');
    
    exec(`aws ec2 describe-instances --profile dev --query "Reservations[].Instances[].[InstanceId, Tags]" --output text | grep None | awk '{print $1}'`, (error, stdout, stderr) => {
        console.log(`stdout: ${stdout}`);
    });
    

    【讨论】:

    • 谢谢,但如果可能的话,我更喜欢 JS 解决方案。不过,您的可能是一种解决方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多