Скрипт пользовательских данных AWS EC2 для выделения эластичного IP - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь создать свой собственный хост-бастион для VPC и создал группу автоматического масштабирования с минимальными / максимальными значениями 1. В моих конфигурациях запуска я указываю следующее для пользовательских данных ec2:

#!

INSTANCE_ID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id`

aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id eipalloc-my-eip-id --allow-reassociation

Цель этих пользовательских данных - немедленно связать Elastic IP-адрес с моим недавно созданным экземпляром EC2 - Я прочитал из других сообщений StackOverflow , что это должно быть явно сделано при использовании ASG.

Однако после того, как экземпляр ASG запускается и завершает инициализацию, я все еще не вижу Elastic IP в выводе моей консоли для экземпляра:

enter image description here

Я подтвердил, что пользовательские данные действительно используются экземпляром: enter image description here

Я попытался заглянуть в системный журнал, чтобы увидеть, есть ли какие-либосообщения об ошибках во время инициализации, но сначала я не увидел ничего, что указывало бы на ошибку команды associate-address (внутри /var/log/cloud-init-output).

Edit: попытка отладки:

Однако затем я вручную связал Elastic IP с моим экземпляром, SSHed, и попытался выполнить команды пользовательских данных выше.Интересно, что когда я добрался до части aws ec2 associate-address, я столкнулся с

Невозможно найти учетные данные.Вы можете настроить учетные данные, запустив «aws configure».

Это, как представляется, является корнем проблемы - мой профиль AWS не настроен.Однако у меня всегда было впечатление, что профиль экземпляра AWS по умолчанию настроен для вас с доступом к интерфейсу командной строки AWS, когда экземпляр завершает инициализацию.

Может ли кто-нибудь указать мне, почему мой пользовательданные для связывания эластичных IP-адресов могут работать неправильно?

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Похоже, что профиль экземпляра, прикрепленный к этому экземпляру EC2, не имеет разрешения для выполнения вышеуказанной задачи.

Ссылаясь на https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-ec2-console.html#ex-eip,

Можете ли вы убедиться, что ваш профиль экземпляра имеет следующеедействие разрешено?

ec2:AllocateAddress: To allocate an Elastic IP address.

ec2:ReleaseAddress: To release an Elastic IP address.

ec2:AssociateAddress: To associate an Elastic IP address with an instance or a network interface.

ec2:DescribeNetworkInterfaces and ec2:DescribeInstances: To work with the Associate address screen. The screen displays the available instances or network interfaces to which you can associate an Elastic IP address.

ec2:DisassociateAddress: To disassociate an Elastic IP address from an instance or a network interface.

Пример политики будет выглядеть следующим образом:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "ec2:DescribeAddresses",
            "ec2:AllocateAddress",
            "ec2:DescribeInstances",
            "ec2:AssociateAddress"
        ],
        "Resource": "*"
    }
]

}

Надеюсь, это поможет.

0 голосов
/ 25 декабря 2018

Вы используете свой экземпляр EC2 с AMI, предоставляемым amazon?

Если это так, профиль должен быть действительно настроен.Однако мы заметили, что регион по умолчанию не установлен в вашем профиле.Поэтому при выполнении команд aws cli вам нужно либо указать регион с помощью --region <your region>, либо установить переменную окружения AWS_DEFAULT_REGION.

Мы используем следующий скрипт для обеспечения наших серверов EIP при запускекак часть нашего шаблона CloudFormation:

#!/bin/bash
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
MAXWAIT=3
ALLOC_ID=<your eip allocation id>
AWS_DEFAULT_REGION=<your region>

# Make sure the EIP is free
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)
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)
    fi
done

# Now we can associate the address
echo Running: aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $ALLOC_ID --allow-reassociation}
aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $ALLOC_ID --allow-reassociation}

Мы добавили часть, в которой мы проверяем, свободен ли EIP, поскольку это используется внутри группы автоматического масштабирования, и мы заметили, что иногда EIP все еще используетсядаже если старый экземпляр уже завершен, а новый экземпляр находится в точке запуска сценария пользовательских данных.

0 голосов
/ 25 декабря 2018

Сценарий пользовательских данных должен начинаться с #!, чтобы быть распознанным как сценарий.Например:

#!
INSTANCE_ID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id`

aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id eipalloc-xxx --allow-reassociation

Вы можете просмотреть полученный логин: /var/log/cloud-init-output.log

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...