Как назначить EIP для Autoscaling Group VPC в шаблоне Cloudformation
Я хочу назначить один из моих зарезервированных Elastic IP (ec2 classic ip) группе Autoscaling в VPC. Используя AWS Cli, я переместил ip в vpc:
$ aws ec2 move-address-to-vpc --public-ip 23.23.23.23
И увидел в aws concole, что этот IP перешел на VPC. И назначается в тегах AutoscalingGroup в шаблоне Cloudformation в разделе Ресурсы:
"Process": {
"Type" : "AWS::AutoScaling::AutoScalingGroup",
"Properties": {
"LaunchConfigurationName": {"Ref": "PreprocessorLC"},
"LoadBalancerNames": [{"Ref": "ProcessELB"}],
"VPCZoneIdentifier" : [{ "Fn::Join" : [",", [ { "Ref" : "PublicSubnet1"}, { "Ref" : "PublicSubnet2"} ]]}],
"AvailabilityZones": {"Ref": "AZs"},
"MinSize" : "1",
"MaxSize" : "1",
"HealthCheckGracePeriod": 300,
"Tags" : [
{"Key": "Name", "Value": {"Fn::Join": ["", [{"Ref": "Env"}, "-Process"]]}, "PropagateAtLaunch": true},
{"Key": "WorkersScalingGroup", "Value": {"Fn::Join": ["", ["Offering-", {"Ref": "Env"}, "-Process-Worker"]]}, "PropagateAtLaunch": true},
{"Key": "EIP", "Value": {"Ref": "ProcessIP"}, "PropagateAtLaunch": true},
{"Key": "Environment", "Value": {"Ref": "Env"}, "PropagateAtLaunch": true}
]
}
}
И добавленная стоимость "ProcessIP" в параметрах:
"ProcessIP":{
"Description": "DEV: 23.23.23.23",
"Type": "String",
"Default": "23.23.23.23",
"AllowedValues": ["23.23.23.23"]
}
И это не сработало. Все равно получите случайный IP. Если кто-то может сказать, где я не прав или что нужно добавить, чтобы это работало?
Спасибо!
3 ответа
Вот простой скрипт bash:
#!/bin/sh
# Region in Which instance is running
EC2_REGION='us-east-1'
AWS_ACCESS_KEY='xxxxxxxxxxxx'
AWS_SECRET_ACCESS_KEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
#Instance ID captured through Instance meta data
InstanceID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id`
#Elastic IP captured through the EIP instance tag
Elastic_IP=`/opt/aws/apitools/ec2/bin/ec2-describe-tags -O $AWS_ACCESS_KEY -W $AWS_SECRET_ACCESS_KEY --filter resource-id=$InstanceID --filter key='EIP' | cut -f5`
Allocate_ID=`/opt/aws/apitools/ec2/bin/ec2-describe-tags -O $AWS_ACCESS_KEY -W $AWS_SECRET_ACCESS_KEY --filter resource-id=$InstanceID --filter key="AllocationID" | cut -f5`
#Assigning Elastic IP to Instance
aws ec2 associate-address --instance-id $InstanceID --allocation-id $Allocate_ID
В моем случае мне нужно было хранить банк неназначенных EIP и случайным образом назначать их EC2 при загрузке. Таким образом, я всегда знаю, что мои серверы будут использовать определенный список IP-адресов, которые я могу занести в белый список в других местах.
Если вы создаете несколько EIP-файлов с именем "prod-pool", вы можете использовать этот скрипт.
apt install -y jq awscli
ALLOCATION_ID=`aws ec2 describe-addresses --filters="Name=tag:Name,Values=prod-pool" | jq -r '.Addresses[] | "\(.InstanceId) \(.AllocationId)"' | grep null | awk '{print $2}' | xargs shuf -n1 -e`
if [ ! -z $ALLOCATION_ID ]; then
aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $ALLOCATION_ID --allow-reassociation
fi
Вы можете прикрепить эту политику к своему пользователю IAM
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowEIPAttachment",
"Effect": "Allow",
"Resource": [
"*"
],
"Action": [
"ec2:AssociateAddress",
"ec2:DisassociateAddress"
]
}
]
}
Вам необходимо явно связать Elastic IP-адрес с нужным вам экземпляром EC2. Вы можете сделать это в сценарии пользовательских данных во время запуска или внешне через другие сценарии или Управление конфигурацией.
PropagateAtLaunch просто распространяет теги из группы автоматического масштабирования во все экземпляры, которые запускаются в результате действий автоматического масштабирования. Я не знаю какой-либо магии, которая привела бы к тому, что помеченный IP-адрес Elastic был связан с запущенным экземпляром.
Более подробное обсуждение и примеры сценариев времени запуска с EIP можно найти здесь.
Я создал функцию AWS Lambda, которая автоматически привяжет эластичный IP-адрес из пула к экземпляру группы автомасштабирования. Это устраняет необходимость захвата адреса EIP в сценарии загрузки экземпляров. Полное описание см. На https://binx.io/blog/2019/09/02/how-to-dynamically-bind-elastic-ip-addresses-to-an-auto-scaling-group/.