使用Python和Boto3自动化AWS

介绍

在本教程中,我们将研究如何使用Python脚本与Amazon Web Services(AWS)提供的基础架构进行交互。您将学习使用Python和Boto3库配置工作站。然后,您将学习如何以编程方式创建和操作:

Elastic Compute Cloud(EC2)中的虚拟机

Simple Storage Service(S3)中的存储桶和文件

关系数据库服务(RDS)中的数据库

要求

在开始之前,您需要完成几件事:

具有管理员或超级用户特权的AWS账户。由于本练习将创建,修改和删除内容,因此该帐户应为沙箱帐户,该帐户无权访问生产VM,文件或数据库。

通过活动的Internet连接访问Linux Shell环境。

有使用Python和Bash命令行界面的经验。

进行配置

让我们为我们的工作站配置Python,Boto3和AWS CLI工具。虽然本教程的重点是使用Python,但我们将需要AWS CLI工具来设置一些内容。

在命令行上使用工具设置好之后,我们将转到AWS控制台设置用户并授予访问与之交互所需服务的权限。

Python和Pip

首先,检查是否已安装Python。您可以通过在shell中键入哪个python来做到这一点。如果安装了Python,则响应将是Python可执行文件的路径。如果未安装Python,请访问Python.org网站,以获取有关为特定操作系统下载和安装Python的信息。

本教程将使用Python 2.7.10。通过输入python -V检查您的Python版本。只要版本为2.6或更高,您的安装就可以正常工作。

接下来我们需要的是pip,Python软件包管理器。我们将使用pip安装Boto3库和AWS CLI工具。您可以通过键入哪个点来检查。如果安装了pip,则响应将是pip可执行文件的路径。如果未安装pip,请按照pip.pypa.io的说明在系统上安装pip。

通过输入“ pip -V”来检查您的pip版本。您的pip版本应为9.0.1或更高。

现在,在安装了Python和pip之后,我们可以安装脚本访问AWS所需的软件包。

AWS CLI工具和Boto3

使用pip命令,安装AWS CLI和Boto3:


pipinstallawscli boto3 -U--ignore-installed six

请注意:此命令可能需要使用sudo运行,以允许以提升的特权进行安装。-U选项将升级所有已安装的软件包。在某些系统上,名为“ six”的软件包可能会出现问题。使用“ –ignore-installed六个”选项可以解决这些问题。

我们可以通过检查AWS CLI工具的版本并加载boto3库来确认已安装软件包。

运行命令“ aws –version”,应报告类似以下内容:

aws-cli / 1.11.34 Python / 2.7.10 Darwin / 15.6.0 botocore / 1.4.91

最后,运行以下命令检查boto3:python -c“ import boto3”。如果什么也没有报告,那一切都很好。如果有任何错误消息,请检查设置是否有任何遗漏的信息。

至此,在开始编写脚本之前,我们已经准备好进行最后的配置。

用户,权限和凭证

在启动并运行命令行之前,我们需要通过Web控制台转到AWS来创建用户,向用户授予与特定服务进行交互的权限,并获取用于标识该用户的凭证。

打开浏览器并导航到AWS登录页面。通常,这是https://console.aws.amazon.com/console/home

登录到控制台后,导航至“ 身份和访问管理(IAM)”控制台。选择“用户”->“添加用户”。

在“添加用户”页面上,为用户命名,然后选择“程序访问”。然后单击“下一步:权限”。在此示例中,我将用户命名为“ python-user-2”。请注意,您的用户名不得包含任何空格或特殊字符。

在“权限”页面上,我们将通过将现有策略直接附加到我们的用户来为我们的用户设置权限。点击“直接附加现有政策”。在“过滤器”旁边,选择“ AWS管理”。现在搜寻


AmazonEC2FullAccess。输入搜索词后,单击“ AmazonEC2FullAccess”列表旁边的框。对S3和RDS重复此步骤,搜索并选择AmazonS3FullAccess和AmazonRDSFullAccess。选择全部三个选项后,单击“下一步:查看”。



在查看屏幕上,检查您的用户名,AWS访问类型和权限摘要。它应该类似于下图。如果您需要修复任何问题,请单击“上一步”按钮以返回到先前的屏幕并进行更改。如果一切正常,请单击“创建用户”。



在最终用户创建屏幕上,将为您提供用户的访问密钥ID和秘密访问密钥。单击“下载.csv”按钮以使用这些凭据保存文本文件,或单击秘密访问密钥旁边的“显示”链接。重要信息:将凭据保存在文件中或记在安全的地方,因为这是很容易捕获的唯一一次。保护这些凭据,就像保护用户名和密码一样!

现在我们有了用户和凭证,我们终于可以使用AWS CLI工具配置脚本环境。

返回终端,输入aws configure。系统将提示您输入AWS访问密钥ID,AWS秘密访问密钥,默认区域名称和默认输出格式。使用用户创建步骤中的凭据,输入访问密钥ID和秘密访问密钥。

对于默认的区域名称,请输入适合您的区域。您输入的区域将确定脚本创建的任何资源所在的位置。您可以在AWS文档中找到区域列表。在下面的示例中,我正在使用us-west-2。

默认输出格式的选项是text,json和table。现在输入“文本”。

AWS Access Key ID [None]: AKIAJFUD42GXIN4SQRKAAWS Secret Access Key [None]: LLL1tjMJpRNsCq23AXVtZXLJhvYkjHeDf4UO9zzzDefault region name [None]: us-west-2Default output format [None]: text

现在您的环境已全部配置完毕,让我们在继续之前使用AWS CLI工具进行快速测试。在外壳程序中,输入:


aws ec2 describe-instances


如果您已经在运行实例,则将看到这些实例的详细信息。如果没有,您应该会看到一个空的响应。如果看到任何错误,请按照前面的步骤操作,以查看是否忽略或输入了错误的内容,尤其是访问密钥ID和秘密访问密钥。

哇!设置起来很多,但是我们终于准备好进行脚本编写了。让我们开始使用一些可用于EC2,S3和RDS的基本脚本。

脚本EC2

Elastic Compute Cloud(EC2)是用于管理在AWS中运行的虚拟机的服务。让我们看看如何在EC2中使用Python和boto3库。

列出实例

对于我们的第一个脚本,让我们列出在EC2中运行的实例。我们仅需几行代码即可获得此信息。

首先,我们将导入boto3库。使用该库,我们将创建一个EC2资源。这就像我们可以在脚本中使用的EC2控制台的句柄。最后,我们将使用EC2资源获取所有实例,然后打印其实例ID和状态。脚本如下所示:

#!/usr/bin/env pythonimport boto3ec2 = boto3.resource('ec2')for instance in ec2.instances.all():print instance.id, instance.state

将上面的行保存到名为list_instances.py的文件中,并将模式更改为可执行文件。这样您就可以直接从命令行运行脚本。还要注意,您还需要编辑和chmod + x其余脚本以使其也运行。在这种情况下,过程如下所示:

$ vi list_instances.py$ chmod +x list_instances.py$ ./list_instances.py

如果您尚未创建任何实例,则运行此脚本不会产生任何输出。因此,让我们继续进行下一步并创建一些实例,以解决此问题。

创建一个实例

编写EC2脚本所需的关键信息之一是Amazon Machine Image(AMI)ID。这将使我们告诉脚本创建哪种类型的EC2实例。虽然可以通过编程方式获得AMI ID,但这是本教程讨论范围之外的高级主题。现在,让我们回到AWS控制台并从那里获取ID。

在AWS控制台中,转到EC2服务,然后单击“启动实例”按钮。在下一个屏幕上,将显示可用于创建实例的AMI列表。让我们专注于列表顶部的Amazon Linux AMI。在名称右侧记下AMI ID。在此示例中,其为“ ami-1e299d7e”。这就是我们脚本所需的价值。请注意,AMI ID在不同地区之间有所不同,并且会经常更新,因此对于您而言,Amazon Linux AMI的最新ID可能会有所不同。


获取AMI ID


现在有了AMI ID,我们可以完成脚本。按照上一个脚本中的模式,我们将导入boto3库并使用它来创建EC2资源。然后,我们将调用create_instances()函数,传入图像ID,最大和最小计数以及实例类型。我们可以捕获作为实例对象的函数调用的输出。作为参考,我们可以打印实例的ID。

#!/usr/bin/env pythonimport boto3ec2 = boto3.resource('ec2')instance = ec2.create_instances(ImageId='ami-1e299d7e',MinCount=1,MaxCount=1,InstanceType='t2.micro')print instance[0].id

尽管该命令将快速完成,但是创建实例需要一些时间。多次运行list_instances.py脚本,以查看实例的状态从挂起更改为正在运行。

终止实例

现在,我们可以以编程方式创建和列出实例了,我们还需要一种终止它们的方法。

对于此脚本,我们将遵循与之前相同的模式来导入boto3库并创建EC2资源。但是,我们还将采用一个参数:要终止的实例的ID。为简单起见,我们将脚本的任何参数视为实例ID。我们将使用该ID从EC2资源获取到该实例的连接,然后在该实例上调用Terminate()函数。最后,我们打印来自terminate函数的响应。脚本如下所示:

#!/usr/bin/env pythonimport sysimport boto3ec2 = boto3.resource('ec2')for instance_id in sys.argv[1:]:instance = ec2.Instance(instance_id)response = instance.terminate()print response

运行list_instances.py脚本以查看可用的实例。请注意实例ID之一,以用作terminate_instances.py脚本的输入。运行终止脚本后,我们可以运行列表实例脚本以确认所选实例已终止。该过程如下所示:

$ ./list_instances.pyi-0c34e5ec790618146 {u'Code': 16, u'Name': 'running'}

$ ./terminate_instances.py i-0c34e5ec790618146

{u'TerminatingInstances': [{u'InstanceId': 'i-0c34e5ec790618146', u'CurrentState': {u'Code': 32, u'Name': 'shutting-down'}, u'PreviousState': {u'Code': 16, u'Name': 'running'}}], 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': '55c3eb37-a8a7-4e83-945d-5c23358ac4e6', 'HTTPHeaders': {'transfer-encoding': 'chunked', 'vary': 'Accept-Encoding', 'server': 'AmazonEC2', 'content-type': 'text/xml;charset=UTF-8', 'date': 'Sun, 01 Jan 2017 00:07:20 GMT'}}}


$ ./list_instances.pyi-0c34e5ec790618146 {u'Code': 48, u'Name': 'terminated'}

脚本S3

AWS简单存储服务(S3)提供类似于文件系统的对象存储。文件夹表示为存储桶,存储桶的内容称为键。当然,所有这些对象都可以使用Python和boto3库进行管理。

列出存储桶及其内容

我们的第一个S3脚本将使我们看到帐户中当前存在哪些存储桶以及这些存储桶中的所有密钥。

当然,我们将导入boto3库。然后,我们可以创建一个S3资源。请记住,这使我们能够处理S3控制台提供的所有功能。然后,我们可以使用资源遍历所有存储桶。对于每个存储桶,我们将打印该存储桶的名称,然后遍历该存储桶中的所有对象。对于每个对象,我们将打印对象的键或对象的名称。代码如下:

#!/usr/bin/env pythonimport boto3s3 = boto3.resource('s3')for bucket in s3.buckets.all():print bucket.nameprint "---"for item in bucket.objects.all():print "\t%s" % item.key

如果运行此脚本时没有任何存储桶,则不会看到任何输出。让我们创建一个或两个存储桶,然后将一些文件上传到其中。

创建一个桶

在我们的存储桶创建脚本中,让我们导入boto3库(以及用于命令行参数的sys库),并创建一个S3资源。我们将每个命令行参数都视为存储桶名称,然后为每个参数创建一个具有该名称的存储桶。

通过使用Python的tryexcept功能,我们可以使脚本更加健壮。如果将对create_bucket()函数的调用包装在try:块中,则可以捕获可能发生的任何错误。如果我们的存储桶创建顺利,我们只需打印响应即可。如果遇到错误,我们可以打印错误消息并正常退出。该脚本如下所示:

#!/usr/bin/env pythonimport sysimport boto3s3 = boto3.resource("s3")for bucket_name in sys.argv[1:]:try:response = s3.create_bucket(Bucket=bucket_name)print responseexcept Exception as error:print error

创建存储桶很容易,但是有一些规则和限制。要获取完整的摘要,请阅读S3文档中的“ 存储桶限制和限制”部分。此示例需要强调的两个规则是:1)存储桶名称必须是全局唯一的,以及2)存储桶名称必须遵循DNS命名约定。

基本上,在选择存储桶名称时,请选择一个您之前从未使用过的存储桶名称,并且仅使用小写字母,数字和连字符。

由于通常无法使用诸如“ my_bucket”之类的简单存储桶名称,因此,获取唯一存储桶名称的一种好方法是使用名称,数字和日期。例如:

$ ./create_bucket.py projectx-bucket1-$(date +%F-%s)s3.Bucket(name='projectx-bucket1-2017-01-01-1483305884')

现在,我们可以再次运行list_buckets.py脚本以查看我们创建的存储桶。

$ ./list_buckets.pyprojectx-bucket1-2017-01-01-1483305884

好!我们的存储桶已创建,但它们为空。让我们将一些文件放入这些存储桶中。

将文件放入存储桶

与存储桶创建脚本类似,我们通过导入sys和boto3库然后创建S3资源来启动put脚本。现在,我们需要捕获将文件放入其中的存储桶的名称以及文件的名称。我们将第一个参数作为存储区名称,第二个参数作为文件名。

为了保持脚本的健壮性,我们将尝试包装对put()函数的调用;如果一切顺利,请阻止并打印响应。如果失败,我们将打印错误消息。该脚本如下所示:

#!/usr/bin/env pythonimport sysimport boto3s3 = boto3.resource("s3")bucket_name = sys.argv[1]object_name = sys.argv[2]try:response = s3.Object(bucket_name, object_name).put(Body=open(object_name, 'rb'))print responseexcept Exception as error:print error

为了进行测试,我们可以创建一些空文件,然后使用put_bucket.py脚本将每个文件上传到目标存储桶中。

$ touch file{1,2,3,4}.txt

$ ./put_bucket.py projectx-bucket1-2017-01-01-1483305884 file1.txt{u'ETag': '"d41d8cd98f00b204e9800998ecf8427e"', 'ResponseMetadata': {'HTTPStatusCode': 200, 'RetryAttempts': 0, 'HostId': 'Zf7Ti20qpyBr/ssSOYVDzc3501dDuSApWJzqnq/bhfGzPWbEqnyI7I2pLoMbRbtl2ltMlNXg5Zo=', 'RequestId': '1EDAE2B1F66C693D', 'HTTPHeaders': {'content-length': '0', 'x-amz-id-2': 'Zf7Ti20qpyBr/ssSOYVDzc3501dDuSApWJzqnq/bhfGzPWbEqnyI7I2pLoMbRbtl2ltMlNXg5Zo=', 'server': 'AmazonS3', 'x-amz-request-id': '1EDAE2B1F66C693D', 'etag': '"d41d8cd98f00b204e9800998ecf8427e"', 'date': 'Sun, 01 Jan 2017 21:45:28 GMT'}}}


$ ./put_bucket.py projectx-bucket1-2017-01-01-1483305884 file2.txt...$ ./put_bucket.py projectx-bucket1-2017-01-01-1483305884 file3.txt...$ ./put_bucket.py projectx-bucket1-2017-01-01-1483305884 file4.txt...$ ./list_buckets.pyprojectx-bucket1-2017-01-01-1483305884---file1.txtfile2.txtfile3.txtfile4.txt

成功!我们创建了一个存储桶,并将一些文件上传到其中。现在让我们朝相反的方向前进,先删除对象,最后再删除存储桶。

删除存储桶内容

对于我们的删除脚本,我们将以与创建脚本相同的方式开始:导入所需的库,创建S3资源,并将存储桶名称作为参数。

为简单起见,我们将删除作为参数传入的每个存储桶中的所有对象。我们将把对delete()函数的调用包装在try:块中,以确保我们捕获到任何错误。我们的脚本如下所示:

#!/usr/bin/env pythonimport sysimport boto3s3 = boto3.resource('s3')for bucket_name in sys.argv[1:]:bucket = s3.Bucket(bucket_name)for key in bucket.objects.all():try:response = key.delete()print responseexcept Exception as error:print error

如果将其另存为./delete_contents.py并在示例存储桶中运行脚本,则输出应如下所示:

$ ./delete_contents.py projectx-bucket1-2017-01-01-1483305884

{'ResponseMetadata': {'HTTPStatusCode': 204,'RetryAttempts': 0,'HostId':'+A4vDhUEyZgYUGSDHELJHWPt5xmZE2WNI/eqJVjYEsB6wCLU/i6a65sUSPK6x8PcoJXN/2oBmlQ=','RequestId':'A097DD4C0413AF12','HTTPHeaders': {'x-amz-id-2':'+A4vDhUEyZgYUGSDHELJHWPt5xmZE2WNI/eqJVjYEsB6wCLU/i6a65sUSPK6x8PcoJXN/2oBmlQ=','date':'Sun, 01 Jan 2017 22:09:05 GMT','x-amz-request-id':'A097DD4C0413AF12','server':'AmazonS3'}}}...

现在,如果再次运行list_buckets.py脚本,我们将看到我们的存储桶确实为空。

$ ./list_buckets.py

projectx-bucket1-2017-01-01-1483305884---

删除存储桶

我们的删除存储区脚本看起来很像我们的删除对象脚本。导入相同的库,并将参数视为存储区名称。我们使用S3资源将其附加到具有特定名称的存储桶,然后在try:块中,对该存储桶调用delete()函数,以捕获响应。如果删除有效,我们将打印响应。如果没有,我们将打印错误消息。这是脚本:

#!/usr/bin/env pythonimportsysimportboto3s3 = boto3.resource('s3')forbucket_nameinsys.argv[1:]:bucket = s3.Bucket(bucket_name)try:response = bucket.delete() printresponseexceptExceptionaserror: printerror

尝试删除存储桶时要注意的一件事是该存储桶必须首先为空。如果您在尝试删除存储桶时仍然有其他对象,则会报告错误,并且不会删除存储桶。

在目标存储桶上运行我们的delete_buckets.py脚本会产生以下输出:

$ ./delete_buckets.py projectx-bucket1-2017-01-01-1483305884

{'ResponseMetadata': {'HTTPStatusCode': 204,'RetryAttempts': 0,'HostId':'LrM1/W6tlGPiB1FQyDQ4lKWndzXkK1joo2PZUtFPWqtz7CjEIzFttaANM6lLK5Zbk4+6O2qDwqc=','RequestId':'DEBF57021D1AD121','HTTPHeaders': {'x-amz-id-2':'LrM1/W6tlGPiB1FQyDQ4lKWndzXkK1joo2PZUtFPWqtz7CjEIzFttaANM6lLK5Zbk4+6O2qDwqc=','date':'Sun, 01 Jan 2017 22:27:51 GMT','x-amz-request-id':'DEBF57021D1AD121','server':'AmazonS3'}}}

我们可以再次运行list_buckets.py来查看我们的存储桶确实已被删除。

脚本化RDS

关系数据库服务(RDS)简化了对各种数据库类型的管理,包括MySQL,Oracle,Microsoft SQL和Amazon自己的Aurora DB。让我们看一下如何使用Python和boto3检查,创建和删除RDS实例。

在这个高级示例中,我们将仅查看承载数据库而不是数据库本身的实例(虚拟机)。

列出数据库实例

让我们从RDS开始,获取我们帐户中当前正在运行的数据库实例的列表。

当然,我们需要导入boto3库并创建与RDS的连接。不过,我们将创建一个RDS客户端,而不是使用资源。客户端与资源相似,但是在较低的抽象级别上运行。

使用客户端,我们可以调用describe_db_instances()函数列出我们帐户中的数据库实例。使用每个数据库实例的句柄,我们可以打印详细信息,例如主用户名,用于连接到该实例的端点,该实例正在侦听的端口以及实例的状态。该脚本如下所示:

#!/usr/bin/env pythonimportboto3rds = boto3.client('rds')try:# get all of the db instancesdbs = rds.describe_db_instances()fordbindbs['DBInstances']: print("%s@%s:%s %s") % (db['MasterUsername'],db['Endpoint']['Address'],db['Endpoint']['Port'],db['DBInstanceStatus'])exceptExceptionaserror: printerror

如果运行此脚本但尚未创建任何数据库实例,则输出将是预期的空响应。如果您看到任何错误,请返回并检查脚本中是否有任何故障。

创建数据库实例

创建数据库实例需要大量输入。至少需要以下信息:

实例的名称或标识符;用户帐户在每个区域中必须唯一

管理员或root帐户的用户名

管理员帐户的密码

实例的类或类型将被创建为

实例将使用的数据库引擎

实例将为数据库分配的存储量

在以前的脚本中,我们使用sys.argv从命令行捕获所需的输入。对于此示例,让我们仅预填充脚本中的输入以使事情尽可能简单。

同样在这种情况下,我们将使用db.t2.micro作为实例类,并使用mariadb作为数据库引擎,以确保我们的数据库实例在适用的AWS免费套餐中运行。有关数据库实例类和每个类可以运行的数据库引擎的完整列表,请查看RDS文档以获取更多信息。

继续执行脚本,我们将导入boto3库并创建一个RDS客户端。使用客户端,我们可以调用create_db_instance()函数并传入创建实例所需的参数。如果一切顺利,我们将保存并打印响应。因为create函数包装在try:块中,所以如果发生任何错误的转弯,我们还可以捕获并打印错误消息。这是代码:

#!/usr/bin/env pythonimportboto3rds = boto3.client('rds')try:response = rds.create_db_instance(DBInstanceIdentifier='dbserver',MasterUsername='dbadmin',MasterUserPassword='abcdefg123456789',DBInstanceClass='db.t2.micro',Engine='mariadb',AllocatedStorage=5) printresponseexceptExceptionaserror: printerror

我们可以将其另存为create_db_instance.py并直接运行脚本,而无需传递任何参数。如果一切顺利,我们应该会看到与下面的响应类似的响应(为简洁起见被截断)。

$ ./create_db_instance.py{u'DBInstance': {u'PubliclyAccessible':True,u'MasterUsername':'dbadmin',u'MonitoringInterval':0,u'LicenseModel':'general-public-license',u'VpcSecurityGroups': [{u'Status':'active',u'VpcSecurityGroupId':'sg-2950f150'}], ....

即使我们的脚本可能已成功完成,创建数据库实例仍需要花费一些时间(最多5分钟或更长时间)。在尝试任何进一步的操作之前,请给RDS基础结构一定的时间来使我们的实例启动并运行非常重要,否则这些后续操作可能会失败。

因此,在稍等片刻之后,我们可以运行list_db_instances.py脚本来查看刚刚创建的数据库实例的详细信息。

$ ./list_db_instances.pydbadmin@dbserver.co2fg22sgwmb.us-west-2.rds.amazonaws.com:3306available

在这种情况下,我们会看到我们的管理员帐户名称,实例标识符以及分配给它的RDS端点,以及数据库实例正在侦听的端口。太棒了!这些都与我们在脚本中指定的输入匹配。

现在我们知道数据库实例已启动并正在运行,我们可以继续连接到它,在数据库中创建用户帐户,数据库和表。当然,所有这些事情都可以使用Python以编程方式完成,但它们也超出了本教程的范围。请参阅《 The Hitchhiker's Python指南》,以获取有关通过Python使用数据库的更多信息。

删除数据库实例

一旦我们不再需要数据库实例,就可以删除它。当然,这次我们还将导入boto3库和sys库。我们需要获取要删除的实例的名称作为参数。创建RDS客户端后,我们可以将对delete_db_instance()的调用包装在try:块中。我们捕获并打印响应。如果有任何例外情况,我们将打印错误以进行分析。这是脚本:


#!/usr/bin/env pythonimportsysimportboto3db = sys.argv[1]rds = boto3.client('rds')try:response = rds.delete_db_instance(DBInstanceIdentifier=db,SkipFinalSnapshot=True) printresponseexceptExceptionaserror: printerror


在尝试删除任何内容之前,让我们运行list_db_instances.py以获取可用的数据库实例的名称。然后,我们可以对其中一个名称运行delete_db_instance.py。与创建步骤一样,删除数据库也需要一些时间。但是,如果立即运行list_db_instances.py,我们将看到实例的状态更改为“正在删除”。该过程如下所示:


$ ./list_db_instances.pydbadmin@dbserver.co2fg22sgwmb.us-west-2.rds.amazonaws.com:3306available$ ./delete_db_instance.py dbserver{u'DBInstance': {u'PubliclyAccessible':True,u'MasterUsername':'dbadmin',u'MonitoringInterval':0,u'LicenseModel':'general-public-license',u'VpcSecurityGroups': [{u'Status':'active',u'VpcSecurityGroupId':'sg-2950f150'}],…$ ./list_db_instances.pydbadmin@dbserver.co2fg22sgwmb.us-west-2.rds.amazonaws.com:3306deleting


实例完全删除后,再次运行列表脚本应返回一个空列表。

总结和后续步骤

在本教程中,我们涵盖了很多内容!如果从头开始,那么您已经配置了运行Python的环境并安装了boto3库。您创建并配置了一个帐户以从命令行访问AWS资源。您还编写并使用了Python脚本来列出,创建和删除EC2,S3和RDS中的对象。那是相当的成就。

尽管如此,还有更多的东西要学习。本教程使用的示例只是对使用Python在AWS中可以完成的工作进行了了解。此外,这些示例仅在服务配置和安全性方面使用了最低限度的要求。我鼓励您浏览每个服务的文档,以了解如何在将这些示例应用于开发和生产工作流之前使其变得更加健壮和安全。

如果您对本教程有任何反馈或疑问,请在下面的评论中保留。我还鼓励您在探索和掌握使用Python自动化AWS时分享您的成功。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342