Syn*_*tax 2 aws-cloudformation confluent-schema-registry aws-msk
我正在使用 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'
Run Code Online (Sandbox Code Playgroud)
注意:当通过 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
Run Code Online (Sandbox Code Playgroud)
您还可以看看这篇文章,了解如何进行本地测试/开发。
最后我按照惯例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)"]
Run Code Online (Sandbox Code Playgroud)
SCHEMA_REGISTRY_HOST_NAME这可确保容器上存在环境变量,并正确映射到容器正在运行的 EC2 实例的 ipv4。
这对我来说更可取,因为我们不控制正在运行的 Docker 容器(它是公开可用的),而且我不想用我们必须维护的 Docker 容器来包装它。
| 归档时间: |
|
| 查看次数: |
1264 次 |
| 最近记录: |