2016-08-02 59 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