amazon-cloudformation - 为在 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 中进行这项工作。
解决方案
最后我带着一个习惯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
容器上存在环境变量,并正确映射到容器运行的 EC2 实例的 ipv4。
这对我来说更可取,因为我们不控制正在运行的 Docker 容器(它是公开可用的),而且我不想用我们必须维护的 Docker 容器来包装它。
推荐阅读
- angularjs - 如何使指令使用指令属性中指定的控制器?
- python - 创建带有循环的json文件以获取工件列表python
- sql - 如何在一个查询SQL中更新一列中的多行
- c - 如何在C中获取子进程PID
- javascript - 使用一个全局函数检查多个复选框
- javascript - 检查是否至少选中了一个 RADIO BUTTON
- spring - 如何使用 Spring Security 读取 CAS 票证验证 XML?
- rcpp - 在 Rcpp 函数中将类作为参数传递
- python - 如何在kivy中制作和设计我们的自定义数据表
- .net - 使用 XmlSerializer.Serialize 时是否可以丢弃在序列化期间引发错误的元素?