Как получить идентификатор экземпляра контейнера локального экземпляра ec2 - PullRequest
0 голосов
/ 07 мая 2018

Я запускаю следующую команду оболочки, чтобы слить мой экземпляр ECS перед перезагрузкой:

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

Это дает мне следующую ошибку:

Произошла ошибка (InvalidParameterException) при вызове операции UpdateContainerInstancesState: instanceId короче 36.

Очевидно, это потому, что он хочет ECS containerInstanceId, который отличается от ec2InstanceId. Каков наилучший способ узнать идентификатор контейнера локальной машины?

Насколько я понял, пока

  1. используйте aws ecs list-container-instances, чтобы получить все идентификаторы экземпляра контейнера в кластере
  2. используйте aws ecs describe-container-instances, чтобы получить соответствующие идентификаторы экземпляра EC2
  3. использовать метаданные экземпляра (http://169.254.169.254/latest/meta-data/instance-id), чтобы узнать локальный идентификатор экземпляра EC2
  4. Используйте jq в сочетании с grep или другим инструментом для фильтрации

Это кажется немного сложным. Есть ли более простой способ?

Ответы [ 3 ]

0 голосов
/ 14 августа 2018

Другим вариантом является заполнение пользовательского атрибута в экземпляре, содержащем идентификатор экземпляра. Например, в вашем / etc / ecs / ecs.config вы можете указать следующее:

ECS_INSTANCE_ATTRIBUTES={\"ec2_instance\":\"i-0000000000000000000\"}

Затем его можно использовать вместе с параметром - filter list-container-instance , чтобы найти связанный экземпляр контейнера.

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

Если вы используете сценарий cfn-init и CloudFormation, то это можно автоматизировать при создании экземпляра EC2.

....
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
...

Ссылки

0 голосов
/ 10 ноября 2018

С установленной jq это довольно просто.

Используя конечную точку ECS Container Introspection, вы получаете эти значения и передаете их в команду aws ecs update-container-instances-state.

Может быть полезно сделать это в пользовательских данных и добавить результаты в /etc/environment, чтобы они всегда были легко доступны.

#!/usr/bin/env bash
set -euo pipefail

CONTAINER_INSTANCE_ARN="$(curl -s --fail http://localhost:51678/v1/metadata | jq -er '.ContainerInstanceArn')"
CLUSTER="$(curl -s --fail http://localhost:51678/v1/metadata | jq -er '.Cluster')"

aws ecs update-container-instances-state --cluster "$CLUSTER" \
    --container-instances "$CONTAINER_INSTANCE_ARN" --status "DRAINING"

Добавление их в /etc/environment через данные пользователя:

cat<<-EOF>>/etc/environment
CONTAINER_INSTANCE_ARN="$(curl -s --fail http://localhost:51678/v1/metadata | jq -er '.ContainerInstanceArn')"
CLUSTER="$(curl -s --fail http://localhost:51678/v1/metadata | jq -er '.Cluster')"
EOF
source /etc/environment

Примечания:

  • jq -e флажок означает установить код выхода, если ключ не найден.
  • jq -r флаг означает выводить вывод в виде необработанного текста вместо json.
0 голосов
/ 07 мая 2018

Если вы запускаете сценарий для экземпляра, вы можете найти идентификатор экземпляра контейнера из API-интерфейса самоанализа агента ECS .

Если вы запускаете сценарий из задачи ECS, вы можете использовать файл метаданных контейнера .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...