Укажите имя хоста для экземпляров реестра схемы, работающих в ECS - PullRequest
0 голосов
/ 08 ноября 2019

Я создаю избыточный реестр схем, размещенный в Amazon для нашего кластера MSK Kafka, с помощью кластера ECS.

Задаче SchemaRegistry TaskDefinition необходимо определить имя хоста, уникальное для каждой задачи при запуске.

SchemaRegistryTaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: !Ref SchemaRegistryTaskName
      RequiresCompatibilities: [ EC2 ]
      NetworkMode: bridge
      Cpu: !Ref CPUReservation
      Memory: !Ref MemoryReservation
      Volumes: []
      ContainerDefinitions:
        - Name: !Ref SchemaRegistryTaskName
          Image: !Ref SchemaRegistryTaskImage
          Essential: true
          PortMappings:
            - ContainerPort: !Ref SchemaRegistryPort
              HostPort: 0 # Randomly assigned port from the ephemeral port range.
          Environment:
            - Name: AWS_DEFAULT_REGION
              Value: !Ref AWS::Region
            - Name: SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS
              Value: !Ref MskBrokerUrls
            - Name: SCHEMA_REGISTRY_HOST_NAME
              Value: $HOSTNAME
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-group: !Ref 'CloudwatchLogsGroup'
              awslogs-region: !Ref 'AWS::Region'

Примечание: Использование $ Hostname работает при непосредственном запуске док-контейнерав экземпляре EC2 через cli, потому что оболочка подставляет полное имя хоста, которое является уникальным;но я не могу понять, как заставить это работать в ECS & CloudFormation.

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Я создал скрипт entrypoint в образе Docker, который будет искать мета в ECS и отображать значения как среду SCHEMA_REGISTRY_HOST_NAME. Ниже приведен пример сценария.

#!/bin/sh

#########
# Detect whether this is running in an ECS cluster
#########
curl --max-time 1 -s --fail -o /dev/null http://169.254.169.254/
if [[ 0 -eq $? ]]; then
    echo "AWS environment was detected - looking up HOST IP from metadata"
    SCHEMA_REGISTRY_HOST_NAME=$(curl http://169.254.169.254/latest/meta-data/local-ipv4 -s)
    export SCHEMA_REGISTRY_HOST_NAME
else
    echo "Not running in AWS environment. Will not set SCHEMA_REGISTRY_HOST_NAME"
fi

Вы также можете взглянуть на этот one о том, как выполнять локальное тестирование / разработку.

0 голосов
/ 12 ноября 2019

В итоге я пошел с кастомами Command и EntryPoint на TaskDefinition ContainerDefinitions;используя конечную точку метаданных, предложенную @Apolozeus:

EntryPoint: ["/bin/bash"]
Command: ["-c","(export SCHEMA_REGISTRY_HOST_NAME=$(wget -qO- 169.254.169.254/latest/meta-data/local-ipv4);/etc/confluent/docker/run)"]

Это гарантирует, что переменная среды для SCHEMA_REGISTRY_HOST_NAME существует в контейнере и правильно сопоставляется с ipv4 экземпляра EC2, в котором работает контейнер.

Это предпочтительнее для меня, потому что мы не контролируем выполняемый контейнер Docker (он общедоступен), и я не хочу оборачивать его контейнером Docker, который мы затем должны поддерживать.

...