如何在自动缩放中放置NAT实例?

时间:2018-01-21 02:29:17

标签: amazon-web-services amazon-ec2 nat aws-vpc

我想创建一个容错网站,并尝试创建一个自动扩展组。使用NAT-instance而不是NAT-Gateway。我遇到了以下问题。

当NAT实例因[某种原因]被终止时。自动缩放组将启动相应的NAT映像,但它不会禁用源/目标检查。这必须手动完成,因此,连接到nat-i​​nstance的私有子网将具有状态消息" Black-hole"。除非手动更改源目标检查,否则私有子网甚至不会显示新的NAT实例。

有没有人能解决这个问题?

2 个答案:

答案 0 :(得分:2)

一种选择是使用Instance Recovery而不是自动缩放。它替换实例而不更改任何(即使实例ID保持不变)。

当然,与NAT实例相比,NAT网关具有固有的容错能力,因为它们不是单个物理位置中的单个物理内容,与实例的意义相同。

答案 1 :(得分:1)

您可以使用AWS CLI修改网络接口的sourceDestCheck属性。您可以从实例的用户数据启动它。其他方法是自定义python程序甚至PowerShell(包含在下面)。

aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --source-dest-check "{\"Value\": true}"

或者通过改变网络interace。

aws ec2 modify-network-interface-attribute --network-interface-id eni-686ea200 --no-source-dest-check

这个Stack Overflow问题涉及在Python中做同样的事情。

Disable Source/Destination Check AWS Python Boto

本文档介绍了如何在PowerShell中执行此操作。

Edit-EC2NetworkInterfaceAttribute Cmdlet

我首选的方法是Python或PowerShell。这些方法是获取所需参数的最简单方法(instanceId或networkId)。

[编辑:示例程序]

以下两个示例都要求在实例上安装凭据或IAM角色。这是修改源/目标标志所必需的。

以下是一个示例shell脚本。

EC2_INSTANCE_ID="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`"
EC2_AVAIL_ZONE="`wget -q -O - http://169.254.169.254/latest/meta-data/placement/availability-zone`"
EC2_REGION="`echo \"$EC2_AVAIL_ZONE\" | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
echo "Region:" $EC2_REGION

aws ec2 modify-instance-attribute --instance-id $EC2_INSTANCE_ID --source-dest-check "{\"Value\": false}" --region $EC2_REGION

rc=$?; if [[ $rc != 0 ]]; then echo "Failure:" $rc; exit $rc; fi

echo "Success"

以下是使用boto3的示例Python 2程序(将区域更改为您的):

#!/usr/bin/python
import boto3
import requests
import sys

# install boto3
# sudo pip install boto3

# Disable stack trace on failure
sys.tracebacklimit = 0

# Specify the URL for the instance metadata
url = 'http://169.254.169.254/latest/meta-data/instance-id'

# Specify the region where our instance is at
region = 'us-west-2'

# Make a request to get the contents of the URL
r = requests.get(url)

if r.ok != True:
    print "Error: Failed to get instance-id from metadata:", r.reason
    print "Status Code:", r.status_code
    sys.exit(1)

# Get the instance ID from the return response
instance_id = r.text

print "Instance ID:", instance_id

if instance_id[0] != 'i':
    print "Error: Does not look like a valid instance ID: ", instance_id
    sys.exit(1)

client = boto3.client('ec2', region_name=region)

r = client.modify_instance_attribute(InstanceId=instance_id, SourceDestCheck={'Value': False})

code = r['ResponseMetadata']['HTTPStatusCode']

if code != 200:
    print "Error: Cannot change SourceDestCheck: ", code
    sys.exit(1)

print "Success: SourceDestCheck disabled"