为 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 密钥的权限

希望对你有所帮助:)