0

运行使用 CloudFormation 设计的系统,该系统最近经历了一系列不幸的硬件故障。为了这个不经常使用的系统的成本效益,它仅由单个实例支持,并且不使用负载均衡器。我想向它添加一个自动缩放组,以确保至少不需要手动干预来对未来的类似故障做出反应。但是,由于系统是可公开访问的,因此实例需要关联一个弹性 IP,这正是我苦苦挣扎的地方。我的想法是 IP 在启动后将简单地重新关联到一个新实例。这里不需要关心用户会话等。

据我所知,不可能将单个弹性 IP 配置为在自动缩放组中重用(据我所知,我知道这是一个利基用例)。因此,我最终尝试在 CloudFormation::Init 期间重新关联 IP。有没有更优雅的解决方案?

4

1 回答 1

1

正如您所指出的,您可以在启动配置中使用用户数据脚本,以便在 Auto Scaling 启动新实例时,该脚本重新附加弹性 IP 地址或更新 Route 53 DNS 名称。

要附加弹性 IP 地址,脚本需要获取其自己的实例 ID,然后运行附加命令:

#!/bin/bash
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id/)

aws ec2 associate-address --allocation-id xxx --instance-id $INSTANCE_ID

或者,您可以有一个与实例关联的 DNS 名称,并在实例启动时更新 DNS 名称以指向该实例。

来自Amazon Route 53:如何在不使用弹性 IP 的情况下自动更新 IP 地址 - 开发社区

#!/bin/bash
# Extract information about the Instance
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id/)
AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone/)
MY_IP=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4/)

# Extract tags associated with instance
ZONE_TAG=$(aws ec2 describe-tags --region ${AZ::-1} --filters "Name=resource-id,Values=${INSTANCE_ID}" --query 'Tags[?Key==`AUTO_DNS_ZONE`].Value' --output text)
NAME_TAG=$(aws ec2 describe-tags --region ${AZ::-1} --filters "Name=resource-id,Values=${INSTANCE_ID}" --query 'Tags[?Key==`AUTO_DNS_NAME`].Value' --output text)

# Update Route 53 Record Set based on the Name tag to the current Public IP address of the Instance
aws route53 change-resource-record-sets --hosted-zone-id $ZONE_TAG --change-batch '{"Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"'$NAME_TAG'","Type":"A","TTL":300,"ResourceRecords":[{"Value":"'$MY_IP'"}]}}]}'

没有“优雅”的方式可以为 Auto Scaling 组自动执行此类操作。

于 2020-03-13T07:35:25.023 回答