【问题标题】:Assign a static elastic IP to an instance in Autoscaling Group为 Autoscaling Group 中的实例分配静态弹性 IP
【发布时间】:2020-10-29 13:14:07
【问题描述】:

我在 ASG 中有一个实例,我需要为该实例分配一个弹性 IP。现在当实例健康检查失败时,新启动的实例应该具有相同的弹性 IP。 IAM 角色和所有内容的顺序都正确。

【问题讨论】:

  • 有很多关于如何做的教程(例如herehere)。因此,问题究竟是什么?你有没有尝试过?
  • 是的,我创建了一个 Cloudformation 模板,其中执行了一些 bash 脚本作为用户数据。现在我正在模板本身中创建一个弹性 ip。不确定如何从资源本身获取该 IP 并将其作为用户数据传递给 Launch 配置。
  • 这里有一个类似的方法,但是使用一个带有 Route 53 的域名:Amazon Route 53: How to automatically update IP addresses without using Elastic IPs - DEV Community
  • 感谢 John Rotenstein 的回答。

标签: amazon-web-services amazon-ec2 amazon-cloudformation amazon-vpc


【解决方案1】:

不确定如何从资源本身获取该 IP 并将其作为启动配置中的用户数据传递。

在 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}时使用:

当您将此资源的逻辑 ID 传递给内部 Ref 函数时,Ref 返回弹性 IP 地址

【讨论】:

  • 角色不是问题
  • @GovindKumar 很高兴听到角色是正确的。但是为了将来参考,如果其他人阅读了这个问题,最好也提及它。
  • 我的IP会返回一个分配ID?
  • 你测试过这个sn-p吗?你能确认一下吗?
  • @GovindKumar 我现在无法测试它。我提供的模板是pseudo-type 示例。仅可悲地复制和粘贴是行不通的。您需要将其修改为您的用例。
【解决方案2】:
            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

【讨论】:

    【解决方案3】:

    使用 EC2 和 Auto Scaling,您需要在 EC2 中使用 user data 将弹性 IP 自动附加到 EC2 实例以进行 Auto Scaling

    #!/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 只有权限关联地址才能创建/获取 aws 密钥

    希望对你有所帮助:)

    【讨论】:

      猜你喜欢
      • 2021-08-20
      • 1970-01-01
      • 2018-11-01
      • 2020-11-17
      • 2022-12-03
      • 2021-10-02
      • 2019-02-18
      • 2015-11-16
      • 2016-05-25
      相关资源
      最近更新 更多