使用Python和Boto3自動(dòng)化AWS

介紹

在本教程中循衰,我們將研究如何使用Python腳本與Amazon Web Services(AWS)提供的基礎(chǔ)架構(gòu)進(jìn)行交互琼牧。您將學(xué)習(xí)使用Python和Boto3庫(kù)配置工作站牺陶。然后昧甘,您將學(xué)習(xí)如何以編程方式創(chuàng)建和操作:

Elastic Compute Cloud(EC2)中的虛擬機(jī)

Simple Storage Service(S3)中的存儲(chǔ)桶和文件

關(guān)系數(shù)據(jù)庫(kù)服務(wù)(RDS)中的數(shù)據(jù)庫(kù)

要求

在開(kāi)始之前坑傅,您需要完成幾件事:

具有管理員或超級(jí)用戶特權(quán)的AWS賬戶。由于本練習(xí)將創(chuàng)建疮方,修改和刪除內(nèi)容控嗜,因此該帳戶應(yīng)為沙箱帳戶,該帳戶無(wú)權(quán)訪問(wèn)生產(chǎn)VM骡显,文件或數(shù)據(jù)庫(kù)疆栏。

通過(guò)活動(dòng)的Internet連接訪問(wèn)Linux Shell環(huán)境。

有使用Python和Bash命令行界面的經(jīng)驗(yàn)蟆盐。

進(jìn)行配置

讓我們?yōu)槲覀兊墓ぷ髡九渲肞ython承边,Boto3和AWS CLI工具遭殉。雖然本教程的重點(diǎn)是使用Python石挂,但我們將需要AWS CLI工具來(lái)設(shè)置一些內(nèi)容。

在命令行上使用工具設(shè)置好之后险污,我們將轉(zhuǎn)到AWS控制臺(tái)設(shè)置用戶并授予訪問(wèn)與之交互所需服務(wù)的權(quán)限痹愚。

Python和Pip

首先,檢查是否已安裝Python蛔糯。您可以通過(guò)在shell中鍵入哪個(gè)python來(lái)做到這一點(diǎn)拯腮。如果安裝了Python,則響應(yīng)將是Python可執(zhí)行文件的路徑蚁飒。如果未安裝Python动壤,請(qǐng)?jiān)L問(wèn)Python.org網(wǎng)站,以獲取有關(guān)為特定操作系統(tǒng)下載和安裝Python的信息淮逻。

本教程將使用Python 2.7.10琼懊。通過(guò)輸入python -V檢查您的Python版本。只要版本為2.6或更高爬早,您的安裝就可以正常工作哼丈。

接下來(lái)我們需要的是pip,Python軟件包管理器筛严。我們將使用pip安裝Boto3庫(kù)和AWS CLI工具醉旦。您可以通過(guò)鍵入哪個(gè)點(diǎn)來(lái)檢查點(diǎn)。如果安裝了pip桨啃,則響應(yīng)將是pip可執(zhí)行文件的路徑车胡。如果未安裝pip,請(qǐng)按照pip.pypa.io的說(shuō)明在系統(tǒng)上安裝pip照瘾。

通過(guò)輸入“ pip -V”來(lái)檢查您的pip版本匈棘。您的pip版本應(yīng)為9.0.1或更高。

現(xiàn)在网杆,在安裝了Python和pip之后羹饰,我們可以安裝腳本訪問(wèn)AWS所需的軟件包伊滋。

AWS CLI工具和Boto3

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


pipinstallawscli boto3 -U--ignore-installed six

請(qǐng)注意:此命令可能需要使用sudo運(yùn)行队秩,以允許以提升的特權(quán)進(jìn)行安裝笑旺。-U選項(xiàng)將升級(jí)所有已安裝的軟件包。在某些系統(tǒng)上馍资,名為“ six”的軟件包可能會(huì)出現(xiàn)問(wèn)題筒主。使用“ –ignore-installed六個(gè)”選項(xiàng)可以解決這些問(wèn)題。

我們可以通過(guò)檢查AWS CLI工具的版本并加載boto3庫(kù)來(lái)確認(rèn)已安裝軟件包鸟蟹。

運(yùn)行命令“ aws –version”乌妙,應(yīng)報(bào)告類似以下內(nèi)容:

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

最后,運(yùn)行以下命令檢查boto3:python -c“ import boto3”建钥。如果什么也沒(méi)有報(bào)告藤韵,那一切都很好。如果有任何錯(cuò)誤消息熊经,請(qǐng)檢查設(shè)置是否有任何遺漏的信息泽艘。

至此,在開(kāi)始編寫(xiě)腳本之前镐依,我們已經(jīng)準(zhǔn)備好進(jìn)行最后的配置匹涮。

用戶,權(quán)限和憑證

在啟動(dòng)并運(yùn)行命令行之前槐壳,我們需要通過(guò)Web控制臺(tái)轉(zhuǎn)到AWS來(lái)創(chuàng)建用戶然低,向用戶授予與特定服務(wù)進(jìn)行交互的權(quán)限,并獲取用于標(biāo)識(shí)該用戶的憑證务唐。

打開(kāi)瀏覽器并導(dǎo)航到AWS登錄頁(yè)面雳攘。通常,這是https://console.aws.amazon.com/console/home绍哎。

登錄到控制臺(tái)后来农,導(dǎo)航至“?身份和訪問(wèn)管理(IAM)”控制臺(tái)。選擇“用戶”->“添加用戶”崇堰。

在“添加用戶”頁(yè)面上沃于,為用戶命名,然后選擇“程序訪問(wèn)”海诲。然后單擊“下一步:權(quán)限”繁莹。在此示例中,我將用戶命名為“ python-user-2”特幔。請(qǐng)注意咨演,您的用戶名不得包含任何空格或特殊字符。

在“權(quán)限”頁(yè)面上蚯斯,我們將通過(guò)將現(xiàn)有策略直接附加到我們的用戶來(lái)為我們的用戶設(shè)置權(quán)限薄风。點(diǎn)擊“直接附加現(xiàn)有政策”饵较。在“過(guò)濾器”旁邊,選擇“ AWS管理”≡饴福現(xiàn)在搜尋


AmazonEC2FullAccess循诉。輸入搜索詞后,單擊“ AmazonEC2FullAccess”列表旁邊的框撇他。對(duì)S3和RDS重復(fù)此步驟茄猫,搜索并選擇AmazonS3FullAccess和AmazonRDSFullAccess。選擇全部三個(gè)選項(xiàng)后困肩,單擊“下一步:查看”划纽。



在查看屏幕上,檢查您的用戶名锌畸,AWS訪問(wèn)類型和權(quán)限摘要勇劣。它應(yīng)該類似于下圖。如果您需要修復(fù)任何問(wèn)題蹋绽,請(qǐng)單擊“上一步”按鈕以返回到先前的屏幕并進(jìn)行更改芭毙。如果一切正常,請(qǐng)單擊“創(chuàng)建用戶”卸耘。



在最終用戶創(chuàng)建屏幕上,將為您提供用戶的訪問(wèn)密鑰ID和秘密訪問(wèn)密鑰粘咖。單擊“下載.csv”按鈕以使用這些憑據(jù)保存文本文件蚣抗,或單擊秘密訪問(wèn)密鑰旁邊的“顯示”鏈接。重要信息:將憑據(jù)保存在文件中或記在安全的地方瓮下,因?yàn)檫@是很容易捕獲的唯一一次妇菱。保護(hù)這些憑據(jù)预鬓,就像保護(hù)用戶名和密碼一樣!

現(xiàn)在我們有了用戶和憑證,我們終于可以使用AWS CLI工具配置腳本環(huán)境骤视。

返回終端,輸入aws configure刽射。系統(tǒng)將提示您輸入AWS訪問(wèn)密鑰ID轻掩,AWS秘密訪問(wèn)密鑰,默認(rèn)區(qū)域名稱和默認(rèn)輸出格式胀葱。使用用戶創(chuàng)建步驟中的憑據(jù)漠秋,輸入訪問(wèn)密鑰ID和秘密訪問(wèn)密鑰。

對(duì)于默認(rèn)的區(qū)域名稱抵屿,請(qǐng)輸入適合您的區(qū)域庆锦。您輸入的區(qū)域?qū)⒋_定腳本創(chuàng)建的任何資源所在的位置。您可以在AWS文檔中找到區(qū)域列表轧葛。在下面的示例中搂抒,我正在使用us-west-2艇搀。

默認(rèn)輸出格式的選項(xiàng)是text,json和table∏缶В現(xiàn)在輸入“文本”中符。

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

現(xiàn)在您的環(huán)境已全部配置完畢,讓我們?cè)诶^續(xù)之前使用AWS CLI工具進(jìn)行快速測(cè)試誉帅。在外殼程序中淀散,輸入:


aws ec2 describe-instances


如果您已經(jīng)在運(yùn)行實(shí)例,則將看到這些實(shí)例的詳細(xì)信息蚜锨。如果沒(méi)有档插,您應(yīng)該會(huì)看到一個(gè)空的響應(yīng)。如果看到任何錯(cuò)誤亚再,請(qǐng)按照前面的步驟操作郭膛,以查看是否忽略或輸入了錯(cuò)誤的內(nèi)容,尤其是訪問(wèn)密鑰ID和秘密訪問(wèn)密鑰氛悬。

哇则剃!設(shè)置起來(lái)很多,但是我們終于準(zhǔn)備好進(jìn)行腳本編寫(xiě)了如捅。讓我們開(kāi)始使用一些可用于EC2棍现,S3和RDS的基本腳本。

腳本EC2

Elastic Compute Cloud(EC2)是用于管理在AWS中運(yùn)行的虛擬機(jī)的服務(wù)镜遣。讓我們看看如何在EC2中使用Python和boto3庫(kù)己肮。

列出實(shí)例

對(duì)于我們的第一個(gè)腳本,讓我們列出在EC2中運(yùn)行的實(shí)例悲关。我們僅需幾行代碼即可獲得此信息谎僻。

首先,我們將導(dǎo)入boto3庫(kù)寓辱。使用該庫(kù)艘绍,我們將創(chuàng)建一個(gè)EC2資源。這就像我們可以在腳本中使用的EC2控制臺(tái)的句柄秫筏。最后诱鞠,我們將使用EC2資源獲取所有實(shí)例,然后打印其實(shí)例ID和狀態(tài)跳昼。腳本如下所示:

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

將上面的行保存到名為list_instances.py的文件中般甲,并將模式更改為可執(zhí)行文件。這樣您就可以直接從命令行運(yùn)行腳本鹅颊。還要注意敷存,您還需要編輯和chmod + x其余腳本以使其也運(yùn)行。在這種情況下,過(guò)程如下所示:

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

如果您尚未創(chuàng)建任何實(shí)例锚烦,則運(yùn)行此腳本不會(huì)產(chǎn)生任何輸出觅闽。因此,讓我們繼續(xù)進(jìn)行下一步并創(chuàng)建一些實(shí)例涮俄,以解決此問(wèn)題蛉拙。

創(chuàng)建一個(gè)實(shí)例

編寫(xiě)EC2腳本所需的關(guān)鍵信息之一是Amazon Machine Image(AMI)ID。這將使我們告訴腳本創(chuàng)建哪種類型的EC2實(shí)例彻亲。雖然可以通過(guò)編程方式獲得AMI ID孕锄,但這是本教程討論范圍之外的高級(jí)主題。現(xiàn)在苞尝,讓我們回到AWS控制臺(tái)并從那里獲取ID畸肆。

在AWS控制臺(tái)中,轉(zhuǎn)到EC2服務(wù)宙址,然后單擊“啟動(dòng)實(shí)例”按鈕轴脐。在下一個(gè)屏幕上,將顯示可用于創(chuàng)建實(shí)例的AMI列表抡砂。讓我們專注于列表頂部的Amazon Linux AMI大咱。在名稱右側(cè)記下AMI ID。在此示例中注益,其為“ ami-1e299d7e”碴巾。這就是我們腳本所需的價(jià)值。請(qǐng)注意聊浅,AMI ID在不同地區(qū)之間有所不同餐抢,并且會(huì)經(jīng)常更新,因此對(duì)于您而言低匙,Amazon Linux AMI的最新ID可能會(huì)有所不同。


獲取AMI ID


現(xiàn)在有了AMI ID碳锈,我們可以完成腳本顽冶。按照上一個(gè)腳本中的模式,我們將導(dǎo)入boto3庫(kù)并使用它來(lái)創(chuàng)建EC2資源售碳。然后强重,我們將調(diào)用create_instances()函數(shù),傳入圖像ID贸人,最大和最小計(jì)數(shù)以及實(shí)例類型间景。我們可以捕獲作為實(shí)例對(duì)象的函數(shù)調(diào)用的輸出。作為參考艺智,我們可以打印實(shí)例的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

盡管該命令將快速完成,但是創(chuàng)建實(shí)例需要一些時(shí)間十拣。多次運(yùn)行list_instances.py腳本封拧,以查看實(shí)例的狀態(tài)從掛起更改為正在運(yùn)行志鹃。

終止實(shí)例

現(xiàn)在,我們可以以編程方式創(chuàng)建和列出實(shí)例了泽西,我們還需要一種終止它們的方法曹铃。

對(duì)于此腳本,我們將遵循與之前相同的模式來(lái)導(dǎo)入boto3庫(kù)并創(chuàng)建EC2資源捧杉。但是陕见,我們還將采用一個(gè)參數(shù):要終止的實(shí)例的ID。為簡(jiǎn)單起見(jiàn)味抖,我們將腳本的任何參數(shù)視為實(shí)例ID评甜。我們將使用該ID從EC2資源獲取到該實(shí)例的連接,然后在該實(shí)例上調(diào)用Terminate()函數(shù)非竿。最后蜕着,我們打印來(lái)自terminate函數(shù)的響應(yīng)。腳本如下所示:

#!/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

運(yùn)行list_instances.py腳本以查看可用的實(shí)例红柱。請(qǐng)注意實(shí)例ID之一承匣,以用作terminate_instances.py腳本的輸入。運(yùn)行終止腳本后锤悄,我們可以運(yùn)行列表實(shí)例腳本以確認(rèn)所選實(shí)例已終止韧骗。該過(guò)程如下所示:

$ ./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簡(jiǎn)單存儲(chǔ)服務(wù)(S3)提供類似于文件系統(tǒng)的對(duì)象存儲(chǔ)。文件夾表示為存儲(chǔ)桶零聚,存儲(chǔ)桶的內(nèi)容稱為鍵袍暴。當(dāng)然,所有這些對(duì)象都可以使用Python和boto3庫(kù)進(jìn)行管理隶症。

列出存儲(chǔ)桶及其內(nèi)容

我們的第一個(gè)S3腳本將使我們看到帳戶中當(dāng)前存在哪些存儲(chǔ)桶以及這些存儲(chǔ)桶中的所有密鑰政模。

當(dāng)然,我們將導(dǎo)入boto3庫(kù)蚂会。然后淋样,我們可以創(chuàng)建一個(gè)S3資源。請(qǐng)記住胁住,這使我們能夠處理S3控制臺(tái)提供的所有功能趁猴。然后,我們可以使用資源遍歷所有存儲(chǔ)桶彪见。對(duì)于每個(gè)存儲(chǔ)桶儡司,我們將打印該存儲(chǔ)桶的名稱,然后遍歷該存儲(chǔ)桶中的所有對(duì)象余指。對(duì)于每個(gè)對(duì)象捕犬,我們將打印對(duì)象的鍵或?qū)ο蟮拿Q。代碼如下:

#!/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

如果運(yùn)行此腳本時(shí)沒(méi)有任何存儲(chǔ)桶,則不會(huì)看到任何輸出或听。讓我們創(chuàng)建一個(gè)或兩個(gè)存儲(chǔ)桶探孝,然后將一些文件上傳到其中。

創(chuàng)建一個(gè)桶

在我們的存儲(chǔ)桶創(chuàng)建腳本中誉裆,讓我們導(dǎo)入boto3庫(kù)(以及用于命令行參數(shù)的sys庫(kù))顿颅,并創(chuàng)建一個(gè)S3資源。我們將每個(gè)命令行參數(shù)都視為存儲(chǔ)桶名稱足丢,然后為每個(gè)參數(shù)創(chuàng)建一個(gè)具有該名稱的存儲(chǔ)桶粱腻。

通過(guò)使用Python的tryexcept功能,我們可以使腳本更加健壯斩跌。如果將對(duì)create_bucket()函數(shù)的調(diào)用包裝在try:塊中绍些,則可以捕獲可能發(fā)生的任何錯(cuò)誤。如果我們的存儲(chǔ)桶創(chuàng)建順利耀鸦,我們只需打印響應(yīng)即可柬批。如果遇到錯(cuò)誤,我們可以打印錯(cuò)誤消息并正常退出袖订。該腳本如下所示:

#!/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

創(chuàng)建存儲(chǔ)桶很容易氮帐,但是有一些規(guī)則和限制。要獲取完整的摘要洛姑,請(qǐng)閱讀S3文檔中的“?存儲(chǔ)桶限制和限制”部分上沐。此示例需要強(qiáng)調(diào)的兩個(gè)規(guī)則是:1)存儲(chǔ)桶名稱必須是全局唯一的,以及2)存儲(chǔ)桶名稱必須遵循DNS命名約定楞艾。

基本上参咙,在選擇存儲(chǔ)桶名稱時(shí),請(qǐng)選擇一個(gè)您之前從未使用過(guò)的存儲(chǔ)桶名稱硫眯,并且僅使用小寫(xiě)字母蕴侧,數(shù)字和連字符。

由于通常無(wú)法使用諸如“ my_bucket”之類的簡(jiǎn)單存儲(chǔ)桶名稱两入,因此戈盈,獲取唯一存儲(chǔ)桶名稱的一種好方法是使用名稱,數(shù)字和日期谆刨。例如:

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

現(xiàn)在,我們可以再次運(yùn)行l(wèi)ist_buckets.py腳本以查看我們創(chuàng)建的存儲(chǔ)桶归斤。

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

好痊夭!我們的存儲(chǔ)桶已創(chuàng)建,但它們?yōu)榭赵嗬铩W屛覀儗⒁恍┪募湃脒@些存儲(chǔ)桶中她我。

將文件放入存儲(chǔ)桶

與存儲(chǔ)桶創(chuàng)建腳本類似,我們通過(guò)導(dǎo)入sys和boto3庫(kù)然后創(chuàng)建S3資源來(lái)啟動(dòng)put腳本。現(xiàn)在番舆,我們需要捕獲將文件放入其中的存儲(chǔ)桶的名稱以及文件的名稱酝碳。我們將第一個(gè)參數(shù)作為存儲(chǔ)區(qū)名稱,第二個(gè)參數(shù)作為文件名恨狈。

為了保持腳本的健壯性疏哗,我們將嘗試包裝對(duì)put()函數(shù)的調(diào)用;如果一切順利禾怠,請(qǐng)阻止并打印響應(yīng)返奉。如果失敗,我們將打印錯(cuò)誤消息吗氏。該腳本如下所示:

#!/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

為了進(jìn)行測(cè)試芽偏,我們可以創(chuàng)建一些空文件,然后使用put_bucket.py腳本將每個(gè)文件上傳到目標(biāo)存儲(chǔ)桶中弦讽。

$ 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

成功污尉!我們創(chuàng)建了一個(gè)存儲(chǔ)桶,并將一些文件上傳到其中⊥現(xiàn)在讓我們朝相反的方向前進(jìn)被碗,先刪除對(duì)象,最后再刪除存儲(chǔ)桶捂齐。

刪除存儲(chǔ)桶內(nèi)容

對(duì)于我們的刪除腳本蛮放,我們將以與創(chuàng)建腳本相同的方式開(kāi)始:導(dǎo)入所需的庫(kù),創(chuàng)建S3資源奠宜,并將存儲(chǔ)桶名稱作為參數(shù)包颁。

為簡(jiǎn)單起見(jiàn),我們將刪除作為參數(shù)傳入的每個(gè)存儲(chǔ)桶中的所有對(duì)象压真。我們將把對(duì)delete()函數(shù)的調(diào)用包裝在try:塊中娩嚼,以確保我們捕獲到任何錯(cuò)誤。我們的腳本如下所示:

#!/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并在示例存儲(chǔ)桶中運(yùn)行腳本滴肿,則輸出應(yīng)如下所示:

$ ./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'}}}...

現(xiàn)在岳悟,如果再次運(yùn)行list_buckets.py腳本,我們將看到我們的存儲(chǔ)桶確實(shí)為空泼差。

$ ./list_buckets.py

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

刪除存儲(chǔ)桶

我們的刪除存儲(chǔ)區(qū)腳本看起來(lái)很像我們的刪除對(duì)象腳本贵少。導(dǎo)入相同的庫(kù),并將參數(shù)視為存儲(chǔ)區(qū)名稱堆缘。我們使用S3資源將其附加到具有特定名稱的存儲(chǔ)桶滔灶,然后在try:塊中,對(duì)該存儲(chǔ)桶調(diào)用delete()函數(shù)吼肥,以捕獲響應(yīng)录平。如果刪除有效麻车,我們將打印響應(yīng)。如果沒(méi)有斗这,我們將打印錯(cuò)誤消息动猬。這是腳本:

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

嘗試刪除存儲(chǔ)桶時(shí)要注意的一件事是該存儲(chǔ)桶必須首先為空。如果您在嘗試刪除存儲(chǔ)桶時(shí)仍然有其他對(duì)象表箭,則會(huì)報(bào)告錯(cuò)誤赁咙,并且不會(huì)刪除存儲(chǔ)桶。

在目標(biāo)存儲(chǔ)桶上運(yùn)行我們的delete_buckets.py腳本會(huì)產(chǎn)生以下輸出:

$ ./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'}}}

我們可以再次運(yùn)行list_buckets.py來(lái)查看我們的存儲(chǔ)桶確實(shí)已被刪除燃逻。

腳本化RDS

關(guān)系數(shù)據(jù)庫(kù)服務(wù)(RDS)簡(jiǎn)化了對(duì)各種數(shù)據(jù)庫(kù)類型的管理序目,包括MySQL,Oracle伯襟,Microsoft SQL和Amazon自己的Aurora DB猿涨。讓我們看一下如何使用Python和boto3檢查,創(chuàng)建和刪除RDS實(shí)例姆怪。

在這個(gè)高級(jí)示例中叛赚,我們將僅查看承載數(shù)據(jù)庫(kù)而不是數(shù)據(jù)庫(kù)本身的實(shí)例(虛擬機(jī))。

列出數(shù)據(jù)庫(kù)實(shí)例

讓我們從RDS開(kāi)始稽揭,獲取我們帳戶中當(dāng)前正在運(yùn)行的數(shù)據(jù)庫(kù)實(shí)例的列表俺附。

當(dāng)然,我們需要導(dǎo)入boto3庫(kù)并創(chuàng)建與RDS的連接溪掀。不過(guò)事镣,我們將創(chuàng)建一個(gè)RDS客戶端,而不是使用資源揪胃×в矗客戶端與資源相似,但是在較低的抽象級(jí)別上運(yùn)行喊递。

使用客戶端随闪,我們可以調(diào)用describe_db_instances()函數(shù)列出我們帳戶中的數(shù)據(jù)庫(kù)實(shí)例。使用每個(gè)數(shù)據(jù)庫(kù)實(shí)例的句柄骚勘,我們可以打印詳細(xì)信息铐伴,例如主用戶名,用于連接到該實(shí)例的端點(diǎn)俏讹,該實(shí)例正在偵聽(tīng)的端口以及實(shí)例的狀態(tài)当宴。該腳本如下所示:

#!/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

如果運(yùn)行此腳本但尚未創(chuàng)建任何數(shù)據(jù)庫(kù)實(shí)例,則輸出將是預(yù)期的空響應(yīng)泽疆。如果您看到任何錯(cuò)誤即供,請(qǐng)返回并檢查腳本中是否有任何故障。

創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例

創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例需要大量輸入于微。至少需要以下信息:

實(shí)例的名稱或標(biāo)識(shí)符逗嫡;用戶帳戶在每個(gè)區(qū)域中必須唯一

管理員或root帳戶的用戶名

管理員帳戶的密碼

實(shí)例的類或類型將被創(chuàng)建為

實(shí)例將使用的數(shù)據(jù)庫(kù)引擎

實(shí)例將為數(shù)據(jù)庫(kù)分配的存儲(chǔ)量

在以前的腳本中,我們使用sys.argv從命令行捕獲所需的輸入株依。對(duì)于此示例驱证,讓我們僅預(yù)填充腳本中的輸入以使事情盡可能簡(jiǎn)單。

同樣在這種情況下恋腕,我們將使用db.t2.micro作為實(shí)例類抹锄,并使用mariadb作為數(shù)據(jù)庫(kù)引擎,以確保我們的數(shù)據(jù)庫(kù)實(shí)例在適用的AWS免費(fèi)套餐中運(yùn)行荠藤。有關(guān)數(shù)據(jù)庫(kù)實(shí)例類和每個(gè)類可以運(yùn)行的數(shù)據(jù)庫(kù)引擎的完整列表伙单,請(qǐng)查看RDS文檔以獲取更多信息。

繼續(xù)執(zhí)行腳本哈肖,我們將導(dǎo)入boto3庫(kù)并創(chuàng)建一個(gè)RDS客戶端吻育。使用客戶端,我們可以調(diào)用create_db_instance()函數(shù)并傳入創(chuàng)建實(shí)例所需的參數(shù)淤井。如果一切順利布疼,我們將保存并打印響應(yīng)。因?yàn)閏reate函數(shù)包裝在try:塊中币狠,所以如果發(fā)生任何錯(cuò)誤的轉(zhuǎn)彎游两,我們還可以捕獲并打印錯(cuò)誤消息。這是代碼:

#!/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并直接運(yùn)行腳本漩绵,而無(wú)需傳遞任何參數(shù)贱案。如果一切順利,我們應(yīng)該會(huì)看到與下面的響應(yīng)類似的響應(yīng)(為簡(jiǎn)潔起見(jiàn)被截?cái)啵?/p>

$ ./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'}], ....

即使我們的腳本可能已成功完成止吐,創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例仍需要花費(fèi)一些時(shí)間(最多5分鐘或更長(zhǎng)時(shí)間)宝踪。在嘗試任何進(jìn)一步的操作之前,請(qǐng)給RDS基礎(chǔ)結(jié)構(gòu)一定的時(shí)間來(lái)使我們的實(shí)例啟動(dòng)并運(yùn)行非常重要祟印,否則這些后續(xù)操作可能會(huì)失敗肴沫。

因此,在稍等片刻之后蕴忆,我們可以運(yùn)行l(wèi)ist_db_instances.py腳本來(lái)查看剛剛創(chuàng)建的數(shù)據(jù)庫(kù)實(shí)例的詳細(xì)信息颤芬。

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

在這種情況下,我們會(huì)看到我們的管理員帳戶名稱套鹅,實(shí)例標(biāo)識(shí)符以及分配給它的RDS端點(diǎn)站蝠,以及數(shù)據(jù)庫(kù)實(shí)例正在偵聽(tīng)的端口。太棒了卓鹿!這些都與我們?cè)谀_本中指定的輸入匹配菱魔。

現(xiàn)在我們知道數(shù)據(jù)庫(kù)實(shí)例已啟動(dòng)并正在運(yùn)行,我們可以繼續(xù)連接到它吟孙,在數(shù)據(jù)庫(kù)中創(chuàng)建用戶帳戶澜倦,數(shù)據(jù)庫(kù)和表聚蝶。當(dāng)然,所有這些事情都可以使用Python以編程方式完成藻治,但它們也超出了本教程的范圍碘勉。請(qǐng)參閱《 The Hitchhiker's Python指南》,以獲取有關(guān)通過(guò)Python使用數(shù)據(jù)庫(kù)的更多信息桩卵。

刪除數(shù)據(jù)庫(kù)實(shí)例

一旦我們不再需要數(shù)據(jù)庫(kù)實(shí)例验靡,就可以刪除它。當(dāng)然雏节,這次我們還將導(dǎo)入boto3庫(kù)和sys庫(kù)胜嗓。我們需要獲取要?jiǎng)h除的實(shí)例的名稱作為參數(shù)。創(chuàng)建RDS客戶端后钩乍,我們可以將對(duì)delete_db_instance()的調(diào)用包裝在try:塊中辞州。我們捕獲并打印響應(yīng)。如果有任何例外情況件蚕,我們將打印錯(cuò)誤以進(jìn)行分析孙技。這是腳本:


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


在嘗試刪除任何內(nèi)容之前,讓我們運(yùn)行l(wèi)ist_db_instances.py以獲取可用的數(shù)據(jù)庫(kù)實(shí)例的名稱排作。然后牵啦,我們可以對(duì)其中一個(gè)名稱運(yùn)行delete_db_instance.py。與創(chuàng)建步驟一樣妄痪,刪除數(shù)據(jù)庫(kù)也需要一些時(shí)間哈雏。但是,如果立即運(yùn)行l(wèi)ist_db_instances.py衫生,我們將看到實(shí)例的狀態(tài)更改為“正在刪除”裳瘪。該過(guò)程如下所示:


$ ./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


實(shí)例完全刪除后,再次運(yùn)行列表腳本應(yīng)返回一個(gè)空列表罪针。

總結(jié)和后續(xù)步驟

在本教程中彭羹,我們涵蓋了很多內(nèi)容!如果從頭開(kāi)始泪酱,那么您已經(jīng)配置了運(yùn)行Python的環(huán)境并安裝了boto3庫(kù)派殷。您創(chuàng)建并配置了一個(gè)帳戶以從命令行訪問(wèn)AWS資源。您還編寫(xiě)并使用了Python腳本來(lái)列出墓阀,創(chuàng)建和刪除EC2毡惜,S3和RDS中的對(duì)象。那是相當(dāng)?shù)某删汀?/p>

盡管如此斯撮,還有更多的東西要學(xué)習(xí)经伙。本教程使用的示例只是對(duì)使用Python在AWS中可以完成的工作進(jìn)行了了解。此外勿锅,這些示例僅在服務(wù)配置和安全性方面使用了最低限度的要求帕膜。我鼓勵(lì)您瀏覽每個(gè)服務(wù)的文檔枣氧,以了解如何在將這些示例應(yīng)用于開(kāi)發(fā)和生產(chǎn)工作流之前使其變得更加健壯和安全。

如果您對(duì)本教程有任何反饋或疑問(wèn)泳叠,請(qǐng)?jiān)谙旅娴脑u(píng)論中保留作瞄。我還鼓勵(lì)您在探索和掌握使用Python自動(dòng)化AWS時(shí)分享您的成功。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末危纫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乌庶,更是在濱河造成了極大的恐慌种蝶,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞒大,死亡現(xiàn)場(chǎng)離奇詭異螃征,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)透敌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)盯滚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人酗电,你說(shuō)我怎么就攤上這事魄藕。” “怎么了撵术?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵背率,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嫩与,道長(zhǎng)寝姿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任划滋,我火速辦了婚禮饵筑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘处坪。我一直安慰自己根资,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布稻薇。 她就那樣靜靜地躺著嫂冻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪塞椎。 梳的紋絲不亂的頭發(fā)上桨仿,一...
    開(kāi)封第一講書(shū)人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音案狠,去河邊找鬼服傍。 笑死钱雷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吹零。 我是一名探鬼主播罩抗,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼灿椅!你這毒婦竟也來(lái)了套蒂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茫蛹,失蹤者是張志新(化名)和其女友劉穎操刀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體婴洼,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骨坑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柬采。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欢唾。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖粉捻,靈堂內(nèi)的尸體忽然破棺而出礁遣,到底是詐尸還是另有隱情,我是刑警寧澤杀迹,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布亡脸,位于F島的核電站,受9級(jí)特大地震影響树酪,放射性物質(zhì)發(fā)生泄漏浅碾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一续语、第九天 我趴在偏房一處隱蔽的房頂上張望垂谢。 院中可真熱鬧,春花似錦疮茄、人聲如沸滥朱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)徙邻。三九已至,卻和暖如春畸裳,著一層夾襖步出監(jiān)牢的瞬間缰犁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帅容,地道東北人颇象。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像并徘,于是被迫代替她去往敵國(guó)和親遣钳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348