AWS云平台SDK boto3(python)--自动化创建实例、创建挂载卷以及远程操作

1 介绍

Boto3是AWS python版的SDK,可以向python开发者在编写程序过程中使用Amazon S3和 Amazon EC2等服务。

Boto提供了简单的面向对象的API和基本的AWS相关服务。Boto3是最新版本,老版本例如boto2不建议使用。

这篇文章介绍了如何在本地windows环境下,进行AWS云服务的一些基本操作,例如创建实例创建、
卷创建和挂载、资源状态查询、资源使用后的清理回收,以及通过paramiko远程操作实例。

2 安装环境

  1. 安装AWS CLI(Command Line Interface)
    AWS命令行接口(CLI)是一个统一的工具来管理的AWS服务。只需下载并完成配置,便可以从命令行控制多个AWS服务,并通过脚本实现对AWS云服务的自动化操作。

    下载链接:https://aws.amazon.com/cli/

    可参考 https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html#guide-configuration
    主要配置修改:

    1
    2
    3
    4
    5
    6
    7
    8
    ## 修改 ~/.aws/credentials
    [default]
    aws_access_key_id = YOUR_KEY # 你的
    aws_secret_access_key = YOUR_SECRET

    ## 修改 ~/.aws/config
    [default]
    region=cn-north-1a #
  2. 安装Boto3

    1
    2
    ## python3
    pip install boto3

    3 基本命令

    3.1 操作流程

    基本操作流程示例:

  • 创建实例
  • 查询实例状态
  • 创建卷
  • 查看卷状态
  • 若实例与卷均已创建完成并可以使用,挂载卷到已创建的云主机
  • 资源使用完毕,清理回收

    3.2 客户端和资源

  1. boto3.client(“ec2”)

    该命令主要可以进行EC2客户端的一些基本操作。例如:关联、挂载、创建、查询,取消、删除、修改等。

  2. boto3.resource(“ec2”)

    该命令主要可以进行EC2云服务中的各类资源的相关操作。该命令与client有交集的部分也有独立的一部分。

3.3 控制AWS代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import boto3

# 先调用以下两个
ec2 = boto3.client("ec2")
ec2_resource = boto3.resource("ec2")

## 创建实例,返回的是实例的详细信息
createInstance = ec2_resource.create_instances(
Placement={
"AvailabilityZone": "cn-north-1b",
},
ImageId="ami-0c52e2685c7218558", # 可先从AWS console上查看
InstanceType="t2.micro",
MaxCount=1, # 可同时创建多个,
MinCount=1,
KeyName="gsz", # 实现创建好的key pairs
)

instanceID = createInstance[0].id # 从返回的数据中得到实例的ID

## 状态查询,是为了等待创建成功,状态可使用情况下进行下一步操作
instance_state = ec2_resource.Instance(instanceID).state["Name"] # 根据实例ID查询状态

## 创建卷,此处貌似"ec2"和"ec2_resource"都具有创建卷的方法
snap2vol = ec2.create_volume(
AvailabilityZone= "cn-north-1b", # 要与创建的实例相同
Encrypted=True,
Size = 100, # 单位GiBs
SnapshotId = "snap-096b5af48e45fe262" # 通过某个快照ID创建,如无则为常规卷
)

## 挂载卷
volID = create_vol['VolumeId'] # 获取卷ID
attach_vol2 = ec2.attach_volume(
ice=Device2, # 挂载路径 /dev/sdf
InstanceId=InstanceID, # 实例ID
VolumeId=volID, #卷ID
)
attach_state = ec2_resource.Volume(datavolID).attachments[0]['State']

## 删除资源
instance = ec2_resource.Instance(instanceID)
instance.terminate()
volume = ec2_resource.Volume(vol_id)
volume.delete()

3.4 远程操作云主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import paramiko
## 实例化SSHClinet
sshc = paramiko.SSHClient()
sshc.set_missing_host_key_policy(paramiko.AutoAddPolicy())
sshc.connect(host, username=username,port=port,pkey=key)

## 传文件
sftp = sshc.open_sftp()
localfile1 = "path to your locoal file"
remotepath1 = "path/file.name"
sftp.put(localfile1, remotepath1)
sftp.close()

commands = [
"shell command list"
]
for command in commands:
stdin, stdout, stderr = sshc.exec_command(command)

参考资料

Paramiko: https://www.cnblogs.com/xiao-apple36/p/9144092.html

Boto3: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#ec2