Amazon web services 使用AWS cli获取AWS复制组DNS

Amazon web services 使用AWS cli获取AWS复制组DNS,amazon-web-services,aws-cli,amazon-elasticache,Amazon Web Services,Aws Cli,Amazon Elasticache,我们使用cloudformation在aws中部署服务实例。我们的堆栈的一部分目前是一个elasticache redis集群,但我们正试图转换到一个redis ReplicationGroup以获得一点额外的冗余 我们使用ansible playbooks自动部署我们的服务,包括通过aws cli获取诸如Redis dns条目之类的内容 问题是,aws cli能够按id()查找ReplicationGroup,但CloudFormation无法实际设置id,而是将id设置为随机唯一值: 长话

我们使用cloudformation在aws中部署服务实例。我们的堆栈的一部分目前是一个elasticache redis集群,但我们正试图转换到一个redis ReplicationGroup以获得一点额外的冗余

我们使用ansible playbooks自动部署我们的服务,包括通过aws cli获取诸如Redis dns条目之类的内容

问题是,aws cli能够按id()查找ReplicationGroup,但CloudFormation无法实际设置id,而是将id设置为随机唯一值:


长话短说,有没有一个命令可以用来查询我的ReplicationGroup以获取其主DNS记录?

您的EC2实例没有“当前复制组”的概念。因此,在不知道复制组ID的情况下,您必须自己确定它。有两种不同的方法:

备选案文1:

在CloudFormation模板中,通过EC2实例的用户数据将复制组ID传递给EC2实例

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

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

如果您没有使用启动配置的用户数据字段,只需引用属性的ID或端点地址即可:

"Properties" : {
  "UserData" : { "Ref" : "MyReplicationGroup" },
}
然后在EC2实例内部,从实例元数据中获取用户数据:

备选案文2:

这不是单个命令,但您可以“查找”复制组:

  • 从实例元数据中,获取实例ID
  • 使用AWS CLI
    描述实例
    命令获取实例的标记
  • 在这些标记中有一个
    aws:cloudformation:stack name
    标记,它将标识您的cloudformation堆栈
  • 使用AWS CLI
    描述堆栈资源
    命令获取堆栈资源。在其中,从复制组的逻辑云信息ID中查找复制组ID

  • 在与我们的devops团队进行了大量挖掘和讨论之后,我找到了一种方法,可以使用单个aws cli命令来实现这一点

    首先,将输出块添加到redis配置中,其级别与“资源”块相同(在“资源”块之外):

    “输出”:{
    “RedisplicationGroupDNSName”:{
    “说明”:“redis复制组的DNS条目”,
    
    “值”:{“Fn::GetAtt”:["您是否查看了本指南?您正在寻找的是吗?是的,我已经查看了。这需要ReplicationGroup iD,正如我在问题中所解释的,我没有。我只有ReplicationGroup的描述。我认为这是不可能的,因为复制组是通过there iD标识的,它使用CLI,而不是there描述我不知道是否还有其他方法。很有趣。你能详细说明一下选项1吗?我如何传递它,以及如何从ec2实例访问值?在ec2实例的启动配置中,有一个
    UserData
    属性。该属性将数据传递到ec2实例。它可以是数据,也可以是It可以是脚本。当前,它可能正在运行引导Ansible的脚本。如果是这样,您还需要传入复制组(不知何故)。在EC2实例中读取它将取决于您如何将其写入用户数据。我们的构建过程使用ssh启动ansible,以及其他一些与业务逻辑相关的事情,我们目前根本没有使用userData,因此看起来这应该是填充userData并读取它的最基本情况。我是否只添加了一个将userData属性添加到我的ec2实例中,并向我的复制组中添加一个引用?或者我如何将其缩小到仅限于id?事实证明,我没有使用userData字段启动ansible构建是错误的。但我确实找到了一个选项3,它以我认为比选项2更干净的方式实现了我想要的功能,尽管它在概念上类似。Th谢谢你的帮助!
    $ curl http://169.254.169.254/latest/user-data
    
    "Outputs" : {
            "RedisReplicationGroupDnsName" : {
                "Description" : "DNS entry for the redis replication group",
                "Value" : { "Fn::GetAtt" : [ "<your replication group's json key>", "PrimaryEndPoint.Address" ] }
            }
        },
    
    aws cloudformation describe-stacks --region {{ ansible_ec2_placement_region }} --stack-name <your stack name> --query 'Stacks[0].Outputs[?OutputKey==`RedisReplicationGroupDnsName`]|[0].OutputValue' --output text