我正在开发一个AWS VPC,它有一个子网,默认情况下不会自动分配公共IP。我想使用boto3来创建实例并自动分配公共IP。目前尚不清楚如何从boto3文档中做到这一点。
我得到的最接近的是以下内容,但仍有错误:
self._ec2.create_instances(
ImageId=self._cluster._image,
KeyName="key_pair_1",
InstanceType="t2.micro",
MinCount=1,
MaxCount=1,
SecurityGroupIds=["sg-someid"],
SubnetId="subnet-anotherid",
BlockDeviceMappings=[{
"DeviceName": "/dev/sda1",
"Ebs": {
"VolumeType": "gp2",
"VolumeSize": disk_size,
"DeleteOnTermination": True
},
}],
NetworkInterfaces=[{
"DeviceIndex": 0,
"AssociatePublicIpAddress": True
}]
)
答案 0 :(得分:2)
可以帮助某人: 您必须将SecurityGroupIds和subnetID作为网络接口参数,并从实例参数中删除它们,然后它将正常运行。
NetworkInterfaces=[
{
'DeviceIndex': 0,
'SubnetId' : 'subnet-xxxxxx',
'Groups': [
'sg-xxxxxx','sg-xxxx','sg-xxxxxx'
],
'AssociatePublicIpAddress': True
},
答案 1 :(得分:1)
如果您在私有的VPC子网内启动任何EC2实例(没有自动分配公共IP打开),只有两种方法可以使其准备好Internet 1.创建实例后附加弹性IP 2.创建NAT网关,将流量重新路由到允许连接到Internet的子网。
此实例网络设置永远不会覆盖VPC私有子网规则。
"AssociatePublicIpAddress": True
如果子网功能未更改为自动分配公共IP,则最简单的方法是使用弹性IP。所以只需添加2个额外的流程 1. allocate_address:获取弹性IP地址 2. associate_address:将EIP-id附加到Instance-id
答案 2 :(得分:0)
您需要在NetworkInterfaces中移动SubnetId。
应该是
NetworkInterfaces=[{
"DeviceIndex": 0,
"SubnetId": "somesubnetid",
"AssociatePublicIpAddress": True
}]
此外,您还要确保此子网ID已连接互联网网关。