【问题标题】:AWS CLI EMR get Master node Instance ID and tag itAWS CLI EMR 获取主节点实例 ID 并标记它
【发布时间】:2018-09-10 11:04:39
【问题描述】:

我想自动化集群的运行,并且可以使用标签来获取 EC2 实例的属性,例如它的 instance-id。

https://docs.aws.amazon.com/cli/latest/reference/emr/create-cluster.html 上的文档指出

--标签(列表)

与集群关联的标签列表,适用于每个 Amazon 集群中的 EC2 实例。标签是键值对,包括 最多 128 个字符的必需密钥字符串,以及 可选值字符串,最多 256 个字符。

您可以指定 key=value 格式的标签,也可以添加不带标签的标签 仅使用键名的值,例如 key 。使用空格来 分隔多个标签。

因此,这会将标签应用于每个 EC2 实例,包括主从实例。如何辨别哪个实例是主节点?

其他信息: 我正在使用以下命令根据标签从 aws cli 获取属性,您可以分别用标签键值对替换“名称”和“产品”。

aws ec2 describe-instances | jq '.Reservations[].Instances | select(.[].Tags[].Value | startswith("Prod") ) |   select(.[].Tags[].Key == "Name") |   {InstanceId: .[].InstanceId, PublicDnsName: .[].PublicDnsName, State: .[].State, LaunchTime: .[].LaunchTime, Tags: .[].Tags}   | [.]' | jq .[].InstanceId

【问题讨论】:

    标签: amazon-web-services aws-cli amazon-emr


    【解决方案1】:

    正如您在创建 EMR 集群时所指出的,所有节点(主节点、从节点、任务节点)的标签都是相同的。

    您会发现使用 AWS CLI 的这个过程很复杂。我的建议是查看下面的示例,然后编写一个 Python 程序来执行此操作。

    将您自己的标签添加到 EC2 实例的过程。

    第 1 步:列出您的 EMR 集群: aws emr list-clusters

    这将输出 JSON:

    {
        "Clusters": [
            {
                "Id": "j-ABCDEFGHIJKLM",
                "Name": "'MyCluster'",
                "Status": {
                    "State": "WAITING",
                    "StateChangeReason": {
                        "Message": "Cluster ready after last step completed."
                    },
                    "Timeline": {
                        "CreationDateTime": 1536626095.303,
                        "ReadyDateTime": 1536626568.482
                    }
                },
                "NormalizedInstanceHours": 0
            }
        ]
    }
    

    第 2 步:记下 JSON 中的集群 ID:

    "Id": "j-ABCDEFGHIJKLM",
    

    第 3 步:描述您的 EMR 集群: aws emr describe-cluster --cluster-id j-ABCDEFGHIJKLM

    这将输出 JSON(我已将此输出截断为 MASTER 部分):

    {
        "Cluster": {
            "Id": "j-ABCDEFGHIJKLM",
            "Name": "'Test01'",
    ....
            "InstanceGroups": [
                {
                    "Id": "ig-2EHOYXFABCDEF",
                    "Name": "Master Instance Group",
                    "Market": "ON_DEMAND",
                    "InstanceGroupType": "MASTER",
                    "InstanceType": "m3.xlarge",
                    "RequestedInstanceCount": 1,
                    "RunningInstanceCount": 1,
                    "Status": {
                        "State": "RUNNING",
                        "StateChangeReason": {
                            "Message": ""
                        },
                        "Timeline": {
                            "CreationDateTime": 1536626095.316,
                            "ReadyDateTime": 1536626533.886
                        }
                    },
                    "Configurations": [],
                    "EbsBlockDevices": [],
                    "ShrinkPolicy": {}
                },
    ....
            ]
        }
    }
    

    第 4 步:InstanceGroups 是一个数组。找到InstanceGroupTypeMASTER 的条目。记下Id

    "Id": "ig-2EHOYXFABCDEF",

    第 5 步:列出您的集群实例: aws emr list-instances --cluster-id j-ABCDEFGHIJKLM

    这将输出 JSON(我已经截断了输出):

    {
        "Instances": [
    ....
            {
                "Id": "ci-31LGK4KIECHNY",
                "Ec2InstanceId": "i-0524ec45912345678",
                "PublicDnsName": "ec2-52-123-201-221.us-west-2.compute.amazonaws.com",
                "PublicIpAddress": "52.123.201.221",
                "PrivateDnsName": "ip-172-31-41-111.us-west-2.compute.internal",
                "PrivateIpAddress": "172.31.41.111",
                "Status": {
                    "State": "RUNNING",
                    "StateChangeReason": {},
                    "Timeline": {
                        "CreationDateTime": 1536626164.073,
                        "ReadyDateTime": 1536626533.886
                    }
                },
                "InstanceGroupId": "ig-2EHOYXFABCDEF",
                "Market": "ON_DEMAND",
                "InstanceType": "m3.xlarge",
                "EbsVolumes": []
            }
        ]
    }
    

    第 6 步:找到匹配的 InstanceGroupId ig-2EHOYXFABCDEF。这将为您提供 MASTER 的 EC2 实例 ID:"Ec2InstanceId": "i-0524ec45912345678"

    第 7 步:标记您的 EC2 实例:

    aws ec2 create-tags --resources i-0524ec45912345678 --tags Key=EMR,Value=MASTER

    使用CLI Filters 和/或jq,上述步骤可能会更简单,但这应该足以让您知道如何查找和标记 EMR 主实例。

    【讨论】:

    • 啊,所以我从aws emr describe-cluster 得到Instance Group Id 并用它从aws emr list-instances 找到Instance ID。而且我可以在没有标签的情况下找到它,然后应用标签以供将来参考。谢谢!
    【解决方案2】:

    下面可以直接获取实例Id

    aws emr list-instances --cluster-id ${aws_emr_cluster.cluster.id} --instance- 
    group-id ${aws_emr_cluster.cluster.master_instance_group.0.id}  --query 
    'Instances[*].Ec2InstanceId' --output text
    

    【讨论】:

      【解决方案3】:

      在没有aws cli的环境中,可以cat以下文件:

      cat /mnt/var/lib/info/job-flow.json
      

      内容示例如下:

      {
        "jobFlowId": "j-0000X0X0X00XX",
        "jobFlowCreationInstant": 1579512208006,
        "instanceCount": 2,
        "masterInstanceId": "i-00x0xx0000xxx0x00",
        "masterPrivateDnsName": "localhost",
        "masterInstanceType": "m5.xlarge",
        "slaveInstanceType": "m5.xlarge",
        "hadoopVersion": "2.8.5",
        "instanceGroups": [
          {
            "instanceGroupId": "ig-0XX00XX0X0XXX",
            "instanceGroupName": "Master - 1",
            "instanceRole": "Master",
            "marketType": "OnDemand",
            "instanceType": "m5.xlarge",
            "requestedInstanceCount": 1
          },
          {
            "instanceGroupId": "ig-000X0XXXXXXX",
            "instanceGroupName": "Core - 2",
            "instanceRole": "Core",
            "marketType": "OnDemand",
            "instanceType": "m5.xlarge",
            "requestedInstanceCount": 1
          }
        ]
      

      注意:我已经省略了作业的 ID,使用 0 表示预期数字,X 表示预期 ltter。

      【讨论】:

      • 你能分享一下 json 的样例 sn-p 吗?
      【解决方案4】:

      您可以通过 3 行代码以编程方式完成此操作,而无需复制粘贴任何特定信息:

      # get cluster id
      CLUSTER_ID=$(aws emr list-clusters --active --query "Clusters[0].Id" --output text)
      
      # get instance id
      INSTANCE_ID=$(aws emr list-instances --cluster-id $CLUSTER_ID --instance-group-types MASTER --query "Instances[0].Ec2InstanceId" --output text)
      
      # tag
      aws ec2 create-tags --resources $INSTANCE_ID --tags Key=EMR,Value=MASTER
      

      【讨论】:

        【解决方案5】:

        下面的例子是Instance Fleet,它把Cluster IDInstance Fleet IDMaster IP保存为环境变量。

        将集群名称“My-Cluster”替换为实际集群名称。

        export CLUSTER_ID=$(aws emr list-clusters --active --query 'Clusters[?Name==`My-Cluster`].Id' --output text)
        export INSTANCE_FLEET=$(aws emr describe-cluster --cluster-id $CLUSTER_ID | jq -r '.[].InstanceFleets | .[] | select(.InstanceFleetType=="MASTER") | .Id')
        export PRIVATE_IP=aws emr list-instances --cluster-id $CLUSTER_ID --instance-fleet-id $INSTANCE_FLEET  --query 'Instances[*].PrivateIpAddress' --output text
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-20
          • 2018-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多