为 Autoscaling Group 中的实例分配静态弹性 IP
Assign a static elastic IP to an instance in Autoscaling Group
我在ASG中有一个实例,我需要为该实例分配一个弹性IP。现在,当实例健康检查失败时,新启动的实例应该具有相同的弹性 IP。 IAM 角色和所有内容都按正确顺序排列。
Not sure how to take that IP from the resource itself and pass it as a user data in Launch configuration.
在 CFN 中,它类似于以下内容:
Resources:
MyEIP:
Type: AWS::EC2::EIP
Properties: {}
MyLaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
UserData:
Fn::Base64: !Sub |
#!/bin/bash -xe
EIP_IP=${MyEIP}
echo ${!EIP_IP}
# use aws cli to attach EIP_IP to the instance
实例角色 还需要具有附加 EIP 的权限。
来自docs 关于!Ref
将在EIP_IP=${MyEIP}
:
时使用
When you pass the logical ID of this resource to the intrinsic Ref function, Ref returns the Elastic IP address.
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
MAXWAIT=3
ALLOC_ID=${IPAddresses}
echo "Checking if EIP with ALLOC_ID[$ALLOC_ID] is free...."
ISFREE=$(aws ec2 describe-addresses --allocation-ids $ALLOC_ID --query Addresses[].InstanceId --output text --region ${AWS::Region})
STARTWAIT=$(date +%s)
while [ ! -z "$ISFREE" ]; do
if [ "$(($(date +%s) - $STARTWAIT))" -gt $MAXWAIT ]; then
echo "WARNING: We waited 30 seconds, we're forcing it now."
ISFREE=""
else
echo "Waiting for EIP with ALLOC_ID[$ALLOC_ID] to become free...."
sleep 3
ISFREE=$(aws ec2 describe-addresses --allocation-ids $ALLOC_ID --query Addresses[].InstanceId --output text --region ${AWS::Region})
fi
done
echo Running: aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $ALLOC_ID --allow-reassociation --region ${AWS::Region}}
aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $ALLOC_ID --allow-reassociation --region ${AWS::Region}
yum install jq -y
使用 EC2 和自动缩放,您需要在 EC2 中使用 user data
将弹性 IP 自动附加到 EC2 实例以进行自动缩放
#!/bin/bash
aws configure set aws_access_key_id "XYZ..."
aws configure set aws_secret_access_key "ABC..."
aws configure set region "ap-..."
aws ec2 associate-address --instance-id "$(curl -X GET "http://169.254.169.254/latest/meta-data/instance-id")" --public-ip your_elastic_IP
注意:您应该创建新用户 & IAM 仅具有关联地址到 create/get aws 密钥的权限
希望对你有所帮助:)
我在ASG中有一个实例,我需要为该实例分配一个弹性IP。现在,当实例健康检查失败时,新启动的实例应该具有相同的弹性 IP。 IAM 角色和所有内容都按正确顺序排列。
Not sure how to take that IP from the resource itself and pass it as a user data in Launch configuration.
在 CFN 中,它类似于以下内容:
Resources:
MyEIP:
Type: AWS::EC2::EIP
Properties: {}
MyLaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
UserData:
Fn::Base64: !Sub |
#!/bin/bash -xe
EIP_IP=${MyEIP}
echo ${!EIP_IP}
# use aws cli to attach EIP_IP to the instance
实例角色 还需要具有附加 EIP 的权限。
来自docs 关于!Ref
将在EIP_IP=${MyEIP}
:
When you pass the logical ID of this resource to the intrinsic Ref function, Ref returns the Elastic IP address.
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
MAXWAIT=3
ALLOC_ID=${IPAddresses}
echo "Checking if EIP with ALLOC_ID[$ALLOC_ID] is free...."
ISFREE=$(aws ec2 describe-addresses --allocation-ids $ALLOC_ID --query Addresses[].InstanceId --output text --region ${AWS::Region})
STARTWAIT=$(date +%s)
while [ ! -z "$ISFREE" ]; do
if [ "$(($(date +%s) - $STARTWAIT))" -gt $MAXWAIT ]; then
echo "WARNING: We waited 30 seconds, we're forcing it now."
ISFREE=""
else
echo "Waiting for EIP with ALLOC_ID[$ALLOC_ID] to become free...."
sleep 3
ISFREE=$(aws ec2 describe-addresses --allocation-ids $ALLOC_ID --query Addresses[].InstanceId --output text --region ${AWS::Region})
fi
done
echo Running: aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $ALLOC_ID --allow-reassociation --region ${AWS::Region}}
aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $ALLOC_ID --allow-reassociation --region ${AWS::Region}
yum install jq -y
使用 EC2 和自动缩放,您需要在 EC2 中使用 user data
将弹性 IP 自动附加到 EC2 实例以进行自动缩放
#!/bin/bash
aws configure set aws_access_key_id "XYZ..."
aws configure set aws_secret_access_key "ABC..."
aws configure set region "ap-..."
aws ec2 associate-address --instance-id "$(curl -X GET "http://169.254.169.254/latest/meta-data/instance-id")" --public-ip your_elastic_IP
注意:您应该创建新用户 & IAM 仅具有关联地址到 create/get aws 密钥的权限
希望对你有所帮助:)