我正在使用 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 中实现这项工作。
最佳答案
我所做的是在 Docker 镜像中添加 entrypoint
脚本,该脚本将从 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以及如何进行本地测试/开发。
关于aws-cloudformation - 为 ECS 中运行的架构注册表实例提供主机名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58763901/