【发布时间】:2019-07-26 17:25:46
【问题描述】:
我需要实现的是拥有创建 EBS 卷、将其附加到 EC2 实例、对其进行格式化并将其挂载到 /data 目录下的 Lambda 函数。
我正在使用ssm:RunCommand (client.send_command) 执行应该格式化和挂载卷的 shell 脚本,但代码失败,因为在我调用 RunCommand 时卷尚未附加到实例。
我正在使用EC2.Waiter.VolumeInUse 等到附加卷,但它似乎无法正常工作。
这是我的代码
import boto3
# HARDCODED VALUES FOR TESTING
AVAILABILITY_ZONE = 'us-east-1d'
INSTANCE_ID = 'i-0bd640b495fd7d77c'
ec2_client = boto3.client('ec2')
ssm_client = boto3.client('ssm')
volume_available_waiter = ec2_client.get_waiter('volume_available')
volume_attached_waiter = ec2_client.get_waiter('volume_in_use')
def lambda_handler(event, context):
try:
# create 8 GB general purpose volume in given AZ
create_volume_response = ec2_client.create_volume(
AvailabilityZone=AVAILABILITY_ZONE,
Size=8,
VolumeType='gp2'
)
# retrieve volume id and wait till it is available
volume_id = create_volume_response['VolumeId']
volume_available_waiter.wait(
VolumeIds=[volume_id]
)
# attach newly created volume to a given instance
ec2_client.attach_volume(
Device='/dev/xvdh',
InstanceId=INSTANCE_ID,
VolumeId=volume_id
)
# wait till the volume is properly attached to EC2 instance
volume_attached_waiter.wait(
VolumeIds=[volume_id]
)
# use SSM RunCommand to format and mount volume
ssm_client.send_command(
InstanceIds=[INSTANCE_ID],
DocumentName='AWS-RunShellScript',
Parameters={
'commands': [
'echo "STARTING MOUNT SEQUENCE"'
'echo $(lsblk)'
'mkfs -t xfs /dev/xvdh',
'mkdir /data',
'mount /dev/xvdh /data'
]
}
)
except Exception as e:
print(e)
return 0
在查看日志cat /var/log/messages 时,我可以清楚地看到echo $(lsblk) 的输出尚未附加新卷。
等待卷附加到 EC2 实例的正确方法是什么?
【问题讨论】:
标签: python amazon-web-services aws-lambda boto3