Как назначить EIP для группы автомасштабирования VPC в шаблоне Cloudformation

Я хочу назначить один из моих зарезервированных эластичных IP-адресов (классический IP-адрес ec2) группе 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. Если кто-то может сказать, где я ошибаюсь или что нужно добавить, чтобы все заработало?

Спасибо!


person muzafarow    schedule 18.01.2016    source источник


Ответы (4)


В моем случае мне нужно было сохранить банк неназначенных 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"
      ]
    }
  ]
}
person Steve Robbins    schedule 13.11.2018
comment
Это новее, поэтому у него нет репутации, но, IMHO, он лучший, поскольку он использует возможность хранить учетные данные вне открытого доступа и довольно легко применяется в ряде ситуаций автоматизации. - person Josiah; 27.12.2018

Вот простой скрипт на 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
person muzafarow    schedule 03.02.2016
comment
Подобный метод обсуждается на форумах AWS здесь forum.aws.amazon .com / message.jspa? messageID = 498761. - person Vorsprung; 21.09.2017

Вам необходимо явно связать эластичный IP-адрес с желаемым экземпляром EC2. Это можно сделать в сценарии пользовательских данных во время запуска или извне с помощью других сценариев или управления конфигурацией.

PropagateAtLaunch просто распространяет теги из группы автоматического масштабирования на любые экземпляры, запускаемые в результате действий автоматического масштабирования. Я не знаю никакой магии, которая привела бы к тому, что помеченный эластичный IP-адрес был бы связан с запущенным экземпляром.

Дополнительное обсуждение и примеры сценариев времени запуска с EIP см. здесь.

person jarmod    schedule 18.01.2016
comment
Без VPC его можно поместить в теги. Знаете ли вы какой-либо пример сценариев или управления конфигурацией для этой конкретной проблемы? - person muzafarow; 18.01.2016
comment
Кстати, мне интересно услышать, что это работает в EC2 Classic. Я такого раньше не видел. Вы уверены, что там, по-видимому, не происходит никаких сценариев. - person jarmod; 18.01.2016
comment
Так мы работали больше полугода. Я уверен, потому что я это написал) - person muzafarow; 18.01.2016
comment
Я не сомневаюсь в тебе; Я просто этого не видел. Например, я не вижу никакой документации, относящейся к PropagateAtLaunch и EIP, которая указывает на то, что запускаемый экземпляр будет ассоциироваться с этим EIP. Я также не понимаю, как это будет работать, если Auto Scaling запустит несколько экземпляров (будет ли последний запущенный экземпляр «выиграть» EIP?). Укажите мне любую документацию, если она у вас есть. Спасибо. - person jarmod; 18.01.2016
comment
Документация AWS ужасна. Распространение EIP при запуске, которое вы указали в параметрах, было очевидно для меня без каких-либо примеров. Здесь вы можете увидеть другие примеры: docs.aws .amazon.com / AWSCloudFormation / latest / UserGuide / И будет работать только для первого экземпляра. - person muzafarow; 18.01.2016

Я создал функцию AWS Lambda, которая автоматически привяжет эластичный IP-адрес из пула к экземпляру группы автомасштабирования. Это избавляет от необходимости захватывать адрес EIP в сценарии загрузки экземпляров. Полное описание можно найти на странице https://binx.io/blog/2019/09/02/how-to-dynamically-bind-elastic-ip-addresses-to-an-auto-scaling-group/ < / а>

person Mark van Holsteijn    schedule 19.11.2019