使用 aws-cli 获取 AWS ReplicationGroup DNS

Fetch AWS ReplicationGroup DNS using aws-cli

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

我们使用 ansible playbook 来自动部署我们的服务,包括通过 aws-cli 获取诸如 Redis dns 条目之类的东西。

问题是,aws-cli 能够通过 ID (aws-cli docs) 查找 ReplicationGroup,但 CloudFormation 没有能力实际 set id,而是将 id 设置为随机唯一值:

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

您的 EC2 实例将没有 "current replication group" 的概念。因此,在不知道复制组 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:

这不是单个命令,但您可以"find"复制组:

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

在与我们的 devops 团队进行大量挖掘和讨论之后,我找到了一种方法来执行此操作,该方法将使用单个 aws-cli 命令。

首先,在您的 Redis 配置中添加一个 Outputs 块,与 "Resources" 块(在其外部)处于同一级别:

"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