首页 > 解决方案 > 为在 ECS 中运行的 Schema Registry 实例提供主机名

问题描述

我正在使用 ECS 集群为我们的 MSK Kafka 集群构建在 Amazon 中托管的冗余模式注册表。

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'

注意:当通过 cli 直接在 EC2 实例中运行 docker 容器时,使用 $Hostname 有效,因为 shell 替换为唯一的完全限定主机名;但我很难弄清楚如何在 ECS 和 CloudFormation 中进行这项工作。

标签: amazon-cloudformationconfluent-schema-registryaws-msk

解决方案


最后我带着一个习惯CommandEntryPointTaskDefinition 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容器上存在环境变量,并正确映射到容器运行的 EC2 实例的 ipv4。

这对我来说更可取,因为我们不控制正在运行的 Docker 容器(它是公开可用的),而且我不想用我们必须维护的 Docker 容器来包装它。


推荐阅读