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。
如果有人能告诉我哪里错了或者应该添加什么才能让它起作用?
谢谢!
您需要明确地将弹性 IP 地址与所需的 EC2 实例相关联。您可以在启动时在用户数据脚本中执行此操作,或者通过其他脚本或配置管理在外部执行此操作。
PropagateAtLaunch 只是将标签从 Auto Scaling 组传播到因 Auto Scaling 操作而启动的任何实例。我不知道有什么魔法会导致标记的弹性 IP 地址与已启动的实例相关联。
查看有关使用 EIP 编写启动时间脚本的更多讨论和示例 here。
这是简单的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
就我而言,我需要保留一组未分配的 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 }' | 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"
]
}
]
}
我创建了一个 AWS Lambda 函数,它会自动将池中的弹性 IP 地址绑定到自动缩放组的实例。这减少了在实例的引导脚本中获取 EIP 地址的需要。如需完整说明,请查看
https://binx.io/blog/2019/09/02/how-to-dynamically-bind-elastic-ip-addresses-to-an-auto-scaling-group/
我想将我保留的弹性 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。 如果有人能告诉我哪里错了或者应该添加什么才能让它起作用?
谢谢!
您需要明确地将弹性 IP 地址与所需的 EC2 实例相关联。您可以在启动时在用户数据脚本中执行此操作,或者通过其他脚本或配置管理在外部执行此操作。
PropagateAtLaunch 只是将标签从 Auto Scaling 组传播到因 Auto Scaling 操作而启动的任何实例。我不知道有什么魔法会导致标记的弹性 IP 地址与已启动的实例相关联。
查看有关使用 EIP 编写启动时间脚本的更多讨论和示例 here。
这是简单的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
就我而言,我需要保留一组未分配的 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 }' | 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"
]
}
]
}
我创建了一个 AWS Lambda 函数,它会自动将池中的弹性 IP 地址绑定到自动缩放组的实例。这减少了在实例的引导脚本中获取 EIP 地址的需要。如需完整说明,请查看 https://binx.io/blog/2019/09/02/how-to-dynamically-bind-elastic-ip-addresses-to-an-auto-scaling-group/