在云编队模板中更改ElastiCache节点DNS记录

时间:2016-01-26 12:37:41

标签: amazon-web-services amazon-cloudformation amazon-route53 amazon-elasticache

我需要为ElastiCache Cluster创建CNAME记录。但是,我构建了redis集群,只有一个节点。据我所知,没有 Redis集群的ConfigurationEndpoint.Address。是否有机会更改群集中节点的DNS名称以及如何操作?

目前模板如下:

  "ElastiCahceDNSRecord" : {
  "Type" : "AWS::Route53::RecordSetGroup",
  "Properties" : {
    "HostedZoneName" : "example.com.",
    "Comment" : "Targered to ElastiCache",
    "RecordSets" : [{
    "Name" : "elche01.example.com.",
    "Type" : "CNAME",
    "TTL" : "300",
    "ResourceRecords" :  [
        {
            "Fn::GetAtt": [ "myelasticache", "ConfigurationEndpoint.Address" ]
        }
    ]

    }]

  }

}

4 个答案:

答案 0 :(得分:2)

有些人来到此页面寻求解决方案。现在有一种方法可以直接从CFN中获取Redis端点。

现在可以从RedisEndpoint.Address获取AWS::ElastiCache::CacheCluster或来自PrimaryEndPoint.Address的{​​{1}}

根据文档(http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html):

  

RedisEndpoint.Address - Redis缓存群集的配置端点的DNS地址。

     

RedisEndpoint.Port - Redis缓存群集的配置终结点的端口号。

根据文档(http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html):

  

PrimaryEndPoint.Address -   主读写缓存节点的DNS地址。

     

PrimaryEndPoint.Port -   主读写缓存引擎正在侦听的端口号。

示例CFN(未包括其他位):

AWS::ElastiCache::ReplicationGroup

答案 1 :(得分:1)

看起来ConfigurationEndpoint.Address仅支持Memcached群集,而不支持Redis。请参阅AWS论坛中的this relevant discussion

此外,AWS Auto Discovery docs(静止)状态:

  

注意

     

自动发现仅适用于运行该缓存的缓存群集   Memcached引擎。因此,Redis缓存集群是单节点集群   无需识别和跟踪Redis中的所有节点   群集。

看起来您的“最佳”解决方案是查询我们中的各个端点,以便使用AWS论坛帖子中建议的AWS::CloudFormation::Init来确定要连接的地址。

更新

正如@slimdrive所指出的那样,现在可以通过AWS::ElastiCache::CacheCluster来实现这一点。请阅读下面的详细信息。

答案 2 :(得分:0)

您应该能够在提供的模板中使用PrimaryEndPoint.Address而不是ConfigurationEndpoint.Address来获取AWS::ElastiCache::ReplicationGroup page中记录的主读写缓存节点的DNS地址。

答案 3 :(得分:0)

这可能会让您感到非常困惑 - 根据您尝试做的事情,您可以使用ConfigurationEndpointPrimaryEndpoint ...我在这里添加我的发现,因为这个是我在尝试搜索时发现的第一个帖子之一。我还将详细介绍我使用CloudFormation进行ElastiCache redis引擎设置时遇到的其他一些问题。我试图设置CloudFormation类型AWS::ElastiCache::ReplicationGroup

让我先说明这一事实,我之前使用t2.micro构建类型设置了一个redis ElastiCache的集群实例,没有任何问题。事实上,我从node-redis npm包中收到一条错误,指出群集不受支持,因此我还实现了redis-clustr包装器。无论如何,一切正常。

然后我们尝试为此创建CloudFormation模板,我遇到了各种限制,aws控制台UI必须隐藏在人们面前。按照我如何遇到问题的时间顺序,这是我的挣扎:

  • t2.micro instances are not supported with auto-failover.所以我将AutomaticFailoverEnabled设置为false
      

    修复:t2.micro实例实际上可以使用自动故障转移。使用已启用集群模式的参数组。我的默认值是default.redis3.2.cluster.on(我使用的是版本3.2.6,因为这是支持静止和传输加密的最新版本)。创建实例后无法更改参数组,因此请不要忘记此部分。

  • 我们收到了redis-clustr / node-redis包裹中的错误:this instance has cluster support disabled
      

    (这就是我发现参数组需要值的方法)

  • 我们在CF模板中收到错误,如果关闭自动故障,则无法使用群集模式
      

    这就是让我尝试再次使用t2.micro实例的原因,因为我知道我在其他实例中启用了自动故障转移并使用了t2.micro实例。果然,这种组合确实可以合作。

  • 我有输出到堆栈并在连接URL和端口的参数存储中创建参数。复制组中不存在x属性/属性失败。
      

    修复:事实证明,如果禁用群集模式(例如,使用参数组default.redis3.2),则必须使用PrimaryEndPoint.AddressPrimaryEndPoint.Port值。如果启用了群集模式,请使用ConfigurationEndPoint.AddressConfigurationEndPoint.Port。我曾尝试使用RedisEndpoint.AddressRedisEndpoint.Port但没有运气,虽然这可能适用于没有副本的单个redis节点(我也可能有错误的外壳 - 请参阅下面的注释)。 / p>

注意 此外,影响我的一个主要问题是大写:P中的EndPoint必须在PrimaryEndPointConfigurationEndPoint变体中大写,如果您要创建AWS::ElastiCache::ReplicationGroup ,但如果您要创建pAWS::ElastiCache::CacheClusterRedisEndpoint,则ConfigurationEndpoint为小写。我不确定为什么会出现这种差异,但这可能是造成某些问题的原因。

Link to AWS docs for GetAtt, which lists available attributes for different CloudFormation resources