Amazon web services 如何获取本地ec2实例的容器实例id

Amazon web services 如何获取本地ec2实例的容器实例id,amazon-web-services,amazon-ec2,aws-cli,amazon-ecs,Amazon Web Services,Amazon Ec2,Aws Cli,Amazon Ecs,在重新启动ECS实例之前,我运行下面的shell命令来排空它: INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id) aws ecs update-container-instances-state \ --region eu-central-1 \ --cluster mycluster \ --status DRAINING \ --container-instances $INSTAN

在重新启动ECS实例之前,我运行下面的shell命令来排空它:

INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
aws ecs update-container-instances-state \
  --region eu-central-1 \
  --cluster mycluster \
  --status DRAINING \
  --container-instances $INSTANCE_ID
它给了我以下错误:

调用UpdateContainerInstanceState操作时出错(InvalidParameterException):instanceId小于36

显然,这是因为它需要不同于ec2InstanceId的ECS containerInstanceId。查找本地计算机的ContainerStanceID的最佳方法是什么

到目前为止我发现的是

  • 使用
    aws ecs列表容器实例
    获取集群中的所有容器实例ID
  • 使用aws ecs descripe container instances获取相应的EC2实例ID
  • 使用实例元数据(
    http://169.254.169.254/latest/meta-data/instance-id
    )以查找本地EC2实例ID
  • 使用
    jq
    结合
    grep
    或其他工具进行过滤

  • 这似乎有点复杂。有更简单的方法吗?

    如果您正在实例上运行脚本,您可以从ECS代理的目录中找到容器实例ID


    如果您正在ECS任务中运行脚本,则可以使用。

    另一个选项是在实例上填充包含实例Id的自定义属性。例如,在/etc/ECS/ECS.config中,您可能具有以下内容:

    ECS_INSTANCE_ATTRIBUTES={\"ec2_instance\":\"i-0000000000000000000\"}
    
    然后可以将其与列表容器实例的--filter参数结合使用,以查找关联的容器实例

    aws ecs list-container-instances --cluster <MY Cluster> --filter attribute:ec2_instance==i-0000000000000000000
    
    参考资料:

    安装后,这相当简单

    使用端点,可以获得这些值并将其传递给
    aws ecs update container instances state
    命令

    在中执行此操作并将结果添加到
    /etc/environment
    中非常有用,这样它们就可以随时使用

    #/usr/bin/env bash
    设置-euo管道故障
    容器\u实例\u ARN=“$(curl-s--失败http://localhost:51678/v1/metadata |jq-er'.集装箱标准“)”
    CLUSTER=“$(curl-s--失败http://localhost:51678/v1/metadata |jq-er'.Cluster')”
    aws ecs更新容器实例状态--群集“$cluster”\
    --容器实例“$container\u INSTANCE\u ARN”--状态为“DRAINING”
    
    通过用户数据将它们添加到
    /etc/environment

    cat/etc/environment
    容器\u实例\u ARN=“$(curl-s--失败http://localhost:51678/v1/metadata |jq-er'.集装箱标准“)”
    CLUSTER=“$(curl-s--失败http://localhost:51678/v1/metadata |jq-er'.Cluster')”
    EOF
    来源/etc/环境
    
    注:

    • jq
      -e
      标志意味着在找不到钥匙时设置退出代码
    • jq
      -r
      标志意味着将输出转储为原始文本,而不是json

    我认为您应该输入容器实例id,而不是EC2实例id。容器实例id如下所示:1c3be8ed-df30-47b4-8f1e-6e68ebd01f34。我是从AWSAPI指南中得出的:你完全正确。我通过使用aws ecs列表容器实例解决了这个问题,然后aws ecs描述了容器实例以及一些grepping和awking。对于这样一个简单的任务来说似乎有点复杂,因为这是发布的,注意到现在有一个“ec2InstanceId”属性自动填充并可用于列表容器实例。无需对自定义属性大惊小怪。
    ....
    MyLaunchConfiguration:
      Type: AWS::AutoScaling::LaunchConfiguration
      Metadata:
        AWS::CloudFormation::Init:
          config: 
            commands: 
              00_configure_ecs_agent:
                command: |
                  #!/bin/bash
                    echo ECS_INSTANCE_ATTRIBUTES={\"ec2_instance\":\"$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id)\"} >> /etc/ecs/ecs.config
    ...