2016-08-02 62 views
1

我们使用cloudformation在aws中部署服务实例。我们的堆栈的一部分目前是一个弹性缓存redis集群,但我们试图转换到redis ReplicationGroup以获得一些额外的冗余。使用aws-cli提取AWS ReplicationGroup DNS

我们使用安全的操作手册来自动部署我们的服务,包括通过aws-cli获取Redis dns条目等内容。

的问题是,AWS-CLI有通过ID查找一个ReplicationGroup的能力(aws-cli docs),但CloudFormation没有实际设置的ID的能力,而不是ID设置为一个随机的独特价值:

Elasticache replication group id in CloudFormation template

所以长话短说,有没有一个单一的命令,我可以用它来查询我的ReplicationGroup得到它的主DNS记录?

+0

你检查这个指南是你在找什么https://docs.aws .amazon.com/ AmazonElastiCache/latest/UserGuide/Replication.Endpoints.html#Replication.Endpoints.Finding.CLI – error2007s

+0

是的,我已经看过那里。这需要ReplicationGroupId,正如我在我的问题中所解释的那样,我没有。我只有ReplicationGroup的描述 – StormeHawke

+0

我不认为这是可能的,因为复制组由iD使用CLI标识,不存在描述,但不确定是否有任何其他方式。 – error2007s

回答

0

在与我们的devops团队进行了大量的挖掘和讨论之后,我找到了一种方法来实现这一点,它将与单个aws-cli命令一起工作。

首先,输出模块添加到您的Redis的配置,在同级别的(外)的“资源”块:

"Outputs" : { 
     "RedisReplicationGroupDnsName" : { 
      "Description" : "DNS entry for the redis replication group", 
      "Value" : { "Fn::GetAtt" : [ "<your replication group's json key>", "PrimaryEndPoint.Address" ] } 
     } 
    }, 

接下来,你需要建立一个IAM政策允许您的实例描述自己的堆栈。

最后,使用AWS-CLI你可以得到复制组的主DNS端点使用此命令:

aws cloudformation describe-stacks --region {{ ansible_ec2_placement_region }} --stack-name <your stack name> --query 'Stacks[0].Outputs[?OutputKey==`RedisReplicationGroupDnsName`]|[0].OutputValue' --output text 
1

您的EC2实例不会有“当前复制组”的概念。因此,在不知道复制组ID的情况下,您必须自己确定。有几个不同的做这件事的方法:

选项1:

在你的CloudFormation模板,通过复制组ID到您的EC2实例通过它的用户数据。

在您的CloudFormation模板中,您可以使用{ "Ref" : "MyReplicationGroup" }获取要传递到用户数据的组的复制ID。

或者您可以使用{ "Fn::GetAtt" : [ "MyReplicationGroup", "PrimaryEndPoint.Address" ] }来获取主要端点的地址。

如果你不以其他方式使用您的启动配置的用户数据字段,您可以直接引用的ID或端点地址属性:

"Properties" : { 
    "UserData" : { "Ref" : "MyReplicationGroup" }, 
} 

然后EC2实例中,获取用户数据从实例元数据:

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-user-data-retrieval

$ curl http://169.254.169.254/latest/user-data 

选项2:

这不是一个简单的命令,但你可以“找到”复制组:

  1. 从实例元数据,获取实例ID
  2. 使用AWS CLI describe-instances命令来获取标签为实例。
  3. 其中的标签将是一个aws:cloudformation:stack-name标签,它将标识您的CloudFormation堆栈。
  4. 使用AWS CLI describe-stack-resources命令获取堆栈的资源。在那里,从它的逻辑CloudFormation ID中找到您的复制组ID。
+0

有趣。你能否详述一下选项1?我将如何通过它,以及如何访问ec2实例的值? – StormeHawke

+0

在EC2实例的启动配置中,有一个'UserData'属性。该属性将数据传递到EC2实例。它可以是数据,也可以是脚本。目前,它可能运行一个脚本来引导Ansible。如果是这样,您还需要传入复制组(以某种方式)。在EC2实例中读取它取决于你如何将它写入用户数据。 –

+0

我们的构建过程使用ssh来启动ansible,在其他一些与业务逻辑相关的事情中,我们目前并没有使用userData – StormeHawke