簡體   English   中英

Cloudformation模板中如何將EIP分配給VPC的Autoscaling Group

[英]How to assign EIP to Autoscaling Group of VPC in Cloudformation template

我想將我保留的彈性 IP(ec2 經典 IP)之一分配給 VPC 中的自動縮放組。 我使用 AWS Cli 將 ip 移動到 vpc:

$ aws ec2 move-address-to-vpc --public-ip 23.23.23.23

並在 aws concole 中看到,該 IP 已傳遞給 VPC。 並在 Resources 的 Cloudformation 模板中的 AutoscalingGroup 標簽中分配:

"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。 如果有人能說出我哪里錯了或者應該添加什么才能讓它發揮作用?

謝謝!

就我而言,我需要保留一組未分配的 EIP,並在它們啟動時將它們隨機分配給 EC2。 這樣我就始終知道我的服務器將使用我可以在其他地方列入白名單的特定 IP 列表。

如果你創建了多個名為“prod-pool”的 EIP,你就可以使用這個腳本。

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"
      ]
    }
  ]
}

這是簡單的 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

您需要將彈性 IP 地址與所需的 EC2 實例明確關聯。 您可以在啟動時在用戶數據腳本中執行此操作,或者通過其他腳本或配置管理在外部執行此操作。

PropagateAtLaunch 只是將標簽從 Auto Scaling 組傳播到任何因 Auto Scaling 操作而啟動的實例。 我不知道有什么魔法會導致標記的彈性 IP 地址與已啟動的實例相關聯。

在此處查看有關使用 EIP 編寫啟動時間腳本的更多討論和示例。

我創建了一個 AWS Lambda 函數,它會自動將池中的彈性 IP 地址綁定到自動縮放組的實例。 這減少了在實例的引導腳本中獲取 EIP 地址的需要。 有關完整說明,請查看https://binx.io/blog/2019/09/02/how-to-dynamically-bind-elastic-ip-addresses-to-an-auto-scaling-group/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM