使用boto3创建EBS卷并将其附加到EC2实例



我有一个现有的EC2实例,上面连接了两个EBS卷。我想使用boto3将第三个EBS卷添加到此EC2实例。

以下是我的想法:

  • 使用ec2.Create_volume创建卷
  • 从上面获取卷id,然后使用ec2.attach_volume附加新卷

或者有更简单的方法吗?boto3中是否有一个函数可以用于向现有EC2实例添加新的EBS卷?

试试这个。。。

'''
Creation State:
'State': 'creating'|'available'|'in-use'|'deleting'|'deleted'|'error'
Attachment State:
'State': 'attaching'|'attached'|'detaching'|'detached'
'''
#create_and_attach_volume
def create_and_attach_volume(ec2_client, availability_zone, DryRunFlag, device, 
instance_id):
try:
response= ec2_client.create_volume(
AvailabilityZone=availability_zone,
Encrypted=False,
#Iops=100,
#KmsKeyId='string',
Size=10,
#SnapshotId='string',
VolumeType='gp2',    #standard'|'io1'|'gp2'|'sc1'|'st1',
DryRun=DryRunFlag
)
#pprint(response)
if response['ResponseMetadata']['HTTPStatusCode']== 200:
volume_id= response['VolumeId']
print('***volume:', volume_id)
ec2_client.get_waiter('volume_available').wait(
VolumeIds=[volume_id],
DryRun=DryRunFlag
)
print('***Success!! volume:', volume_id, 'created...')
except Exception as e:
print('***Failed to create the volume...')
print(type(e), ':', e)
#botocore.exceptions.ClientError:
#An error occurred (InvalidParameterCombination) when calling the CreateVolume 
operation: The parameter iops is not supported for gp2 volumes.
if volume_id:
try:
print('***attaching volume:', volume_id, 'to:', instance_id)
response= ec2_client.attach_volume(
Device=device,
InstanceId=instance_id,
VolumeId=volume_id,
DryRun=DryRunFlag
)
#pprint(response)
if response['ResponseMetadata']['HTTPStatusCode']== 200:
ec2_client.get_waiter('volume_in_use').wait(
VolumeIds=[volume_id],
DryRun=False
)
print('***Success!! volume:', volume_id, 'is attached to instance:', 
instance_id)
except Exception as e:
print('***Error - Failed to attach volume:', volume_id, 'to the instance:', instance_id)
print(type(e), ':', e)
#botocore.exceptions.ClientError:
#An error occurred (IncorrectState) when calling the AttachVolume operation: vol- 
0fcc7c3319a885513 is not 'available'.
#An error occurred (InvalidParameterValue) when calling the AttachVolume operation: 
Invalid value '/dev/sdc' for unixDevice. Attachment point /dev/sdc is already in use
#__main__
session= boto3.session.Session()
region_name= session.region_name
#region_name='ap-south-1'
availability_zone='ap-south-1a'
bdm='/dev/sdc'
instance_id='i-08364669ada3804d3'
start= -perf_counter()
ec2_client= boto3.client('ec2', region_name=region_name)
create_and_attach_volume(ec2_client, availability_zone, DryRunFlag=False, bdm, 
instance_id)
print('***duration:', (start+ perf_counter()), 'secs')

没有一个"单个API调用"将两个操作结合在一起。

您可以创建卷,然后附加

试试这个。。。。

import time
import boto3
ec2 = boto3.client('ec2')
response = ec2.describe_instances()
instance_dict = {}
count = 1
print('  {0:3}    {1:30s}  {2:15s}     {3:15s}   {4:15s}   {5:10s}'.format("S No. ", "NAME", "INSTANCE ID", "IP ADDRESS",'AvailabilityZone', "STATE"))
print('----------------------------------------------------------------------------------------------------------------- n')
for reservation in response["Reservations"]:
for instance in reservation["Instances"]:
if instance['State']['Name'] == "running":
if instance.__contains__("Tags"):
print('  {0:3}    {1:30s}  {2:15s}   {3:15s}   {4:15s}   {5:10s}'.format(
count, instance["Tags"][0]["Value"], instance["InstanceId"],
instance["PublicIpAddress"], instance['Placement']['AvailabilityZone'], "RUNNING"))
instance_dict[count] = instance["InstanceId"],instance['Placement']['AvailabilityZone']
count += 1
else:
print('  {0:3}    {1:30s}  {2:15s}   {3:15s}   {4:15s}   {5:10s}'.format(
count, "No Name", instance["InstanceId"], instance["PublicIpAddress"],instance['Placement']['AvailabilityZone'], "RUNNING"))
instance_dict[count] = instance["InstanceId"],instance['Placement']['AvailabilityZone']
count += 1
elif instance['State']['Name'] == "stopped":
if instance.__contains__("Tags"):
print('  {0:3}    {1:30s}  {2:15s}   {3:15s}   {4:15s}   {5:10s}'.format(
count, instance["Tags"][0]["Value"], instance["InstanceId"], "No IP ADDRESS", instance['Placement']['AvailabilityZone'],
"STOPPED"))
instance_dict[count] = instance["InstanceId"],instance['Placement']['AvailabilityZone']
count += 1
else:
print('  {0:3}    {1:30s}  {2:15s}   {3:15s}   {4:15s}   {5:10s}'.format(
count, "No Name", instance["InstanceId"], "No IP ADDRESS", instance['Placement']['AvailabilityZone'], "STOPPED"))
instance_dict[count] = instance["InstanceId"],instance['Placement']['AvailabilityZone']
count += 1
print()
iId = int(input('On which instance you want to add Volume : '))
az = instance_dict[iId][1]
size = input("Enter Size of Volume (default: 10): ")
response= ec2.create_volume(
AvailabilityZone=az,
Encrypted=False,
#Iops=100,
#KmsKeyId='string',
Size=int(size),
#SnapshotId='string',
VolumeType='gp2',    #standard'|'io1'|'gp2'|'sc1'|'st1',
DryRun=False)
print("Volume ID : ", response['VolumeId'])
time.sleep(10)
response= ec2.attach_volume(Device="/dev/sdc", InstanceId=instance_dict[iId][0], VolumeId=response['VolumeId'])
print("State : ",response['State'])

相关内容

  • 没有找到相关文章

最新更新