更改云形成模板中的 ElastiCache 节点 DNS 记录

change ElastiCache node DNS record in cloud formation template

我需要为 ElastiCache 集群创建 CNAME 记录。但是,我搭建redis集群,只有一个节点。据我发现没有 ConfigurationEndpoint.Address 用于 redis 集群。是否有机会更改集群中节点的 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" ]
        }
    ]

    }]

  }

}

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

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

Note

Auto Discovery is only available for cache clusters running the Memcached engine. Redis cache clusters are single node clusters, thus there is no need to identify and track all the nodes in a Redis cluster.

看起来您的 'best' 解决方案是查询我们中的各个端点,以确定要连接的地址,使用 AWS::CloudFormation::Init AWS 论坛线程上的建议.

更新

正如下面 @slimdrive 指出的,现在可以通过 AWS::ElastiCache::CacheCluster 实现。请进一步阅读下文以了解更多详情。

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

对于访问此页面寻求解决方案的人们。现在有一种方法可以直接从 CFN 中获取 Redis 端点。

现在可以从 AWS::ElastiCache::CacheCluster 中获取 RedisEndpoint.Address 或从 AWS::ElastiCache::ReplicationGroup

中获取 PrimaryEndPoint.Address

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

RedisEndpoint.Address - The DNS address of the configuration endpoint for the Redis cache cluster.

RedisEndpoint.Port - The port number of the configuration endpoint for the Redis cache cluster.

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

PrimaryEndPoint.Address - The DNS address of the primary read-write cache node.

PrimaryEndPoint.Port - The number of the port that the primary read-write cache engine is listening on.

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

Resources:
  DnsRedis:
    Type: 'AWS::Route53::RecordSetGroup'
    Properties:
      HostedZoneName: 'a.hosted.zone.name.'
      RecordSets:
        - Name: 'a.record.set.name'
          Type: CNAME
          TTL: '300'
          ResourceRecords:
            - !GetAtt
              - RedisCacheCluster
              - RedisEndpoint.Address  
    DependsOn: RedisCacheCluster

  RedisCacheCluster:
    Type: 'AWS::ElastiCache::CacheCluster'
    Properties:
      ClusterName: cluster-name-redis
      AutoMinorVersionUpgrade: 'true'
      AZMode: single-az
      CacheNodeType: cache.t2.small
      Engine: redis
      EngineVersion: 3.2.4
      NumCacheNodes: 1
      CacheSubnetGroupName: !Ref ElastiCacheSubnetGroupId
      VpcSecurityGroupIds:
        - !GetAtt
          - elasticacheSecGrp
          - GroupId

这可能会非常令人困惑——根据您要执行的操作,您可以使用 ConfigurationEndpointPrimaryEndpoint...我在这里添加我的发现,因为这是一个我在尝试搜索时发现的第一篇文章。我还将详细说明我在使用 CloudFormation 设置 ElastiCache redis 引擎时遇到的其他一些问题。我正在尝试设置 AWS::ElastiCache::ReplicationGroup

的 CloudFormation 类型

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

然后我们继续尝试为此创建一个 CloudFormation 模板,我 运行 遇到了 aws 控制台 UI 必须向人们隐藏的各种限制。按照我如何 运行 解决问题的时间顺序,以下是我的挣扎:

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

    Fix: t2.micro instances actually can use auto-failover. Use the Parameter Group that has clustered mode enabled. The default one for me was default.redis3.2.cluster.on (I used version 3.2.6, as this is the most current that supports encryption at rest and in transit). The parameter group can not be changed after the instance is created, so don't forget this part.

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

    (This is how I found the parameter group needed the value on)

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

    This is what made me try using a t2.micro instance again, since I knew I had auto-failover turned on in my other instance and was using a t2.micro instance. Sure enough, this combination does work together.

  • 我已将输出输出到堆栈并在连接 url 和端口的参数存储中创建参数。这失败了 x attribute/property 在 ReplicationGroup 上不存在。

    Fix: It turns out that if cluster mode is disabled (using parameter group default.redis3.2, for example), you must use the PrimaryEndPoint.Address and PrimaryEndPoint.Port values. If cluster mode is enabled, use ConfigurationEndPoint.Address and ConfigurationEndPoint.Port. I had tried using the RedisEndpoint.Address and RedisEndpoint.Port with no luck, though this may work with a single redis node with no replica (I also could have had the casing wrong-- see the note below).

注意 此外,影响我的一个主要问题是大小写:如果要创建 AWS::ElastiCache::ReplicationGroupEndPoint 中的 P 必须在 PrimaryEndPointConfigurationEndPoint 变体中大写,但是如果您要创建 AWS::ElastiCache::CacheClusterRedisEndpointConfigurationEndpoint,则 p 是小写的。我不确定为什么会有差异,但这可能是某些问题的原因。

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