使用 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 实例中,从实例元数据中获取用户数据:
$ curl http://169.254.169.254/latest/user-data
选项 2:
这不是单个命令,但您可以"find"复制组:
- 从实例元数据中获取实例 ID
- 使用 AWS CLI
describe-instances
命令获取实例的标签。
- 标签中将有一个
aws:cloudformation:stack-name
标签,用于标识您的 CloudFormation 堆栈。
- 使用 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
我们使用 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 实例中,从实例元数据中获取用户数据:
$ curl http://169.254.169.254/latest/user-data
选项 2:
这不是单个命令,但您可以"find"复制组:
- 从实例元数据中获取实例 ID
- 使用 AWS CLI
describe-instances
命令获取实例的标签。 - 标签中将有一个
aws:cloudformation:stack-name
标签,用于标识您的 CloudFormation 堆栈。 - 使用 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