از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
خودکارسازی مدیریت AWS EC2 با پایتون و بوتو3
سرفصلهای مطلب
معرفی
در این مقاله من استفاده از پایتون را همراه با Boto3 کیت توسعه نرم افزار خدمات وب آمازون (AWS) (SDK) که به افراد آگاه در برنامه نویسی پایتون اجازه می دهد تا از API های پیچیده AWS REST برای مدیریت منابع ابری خود استفاده کنند. با توجه به گستردگی AWS REST API و خدمات ابری مرتبط، من فقط تمرکز خواهم کرد روی سرویس AWS Elastic Cloud Compute (EC2).
در اینجا موضوعاتی هستند که من به آنها خواهم پرداخت:
- شروع یک نمونه EC2
- توقف یک نمونه EC2
- خاتمه یک نمونه EC2
- پشتیبان گیری از یک نمونه EC2 با ایجاد یک تصویر
- ایجاد یک نمونه EC2 از یک تصویر
- برنامه ریزی backup و با استفاده از cron پاک کنید روی یک سرور و AWS Lambda
وابستگی ها و تنظیم محیط
برای شروع باید کاربری در حساب AWS خود ایجاد کنم که دسترسی برنامهریزی شده به REST API داشته باشد. برای سادگی من به این کاربر حقوق مدیریت اعطا خواهم کرد، اما لطفاً توجه داشته باشید که فقط برای سادگی در ایجاد این آموزش است. اگر دنبال میکنید، باید قبل از استفاده از این کاربر در محیط تولید، با خطمشیهای امنیت فناوری اطلاعات سازمان خود مشورت کنید.
مرحله 1: در AWS من console من باید به بخش IAM در زیر منوی خدمات بروم، سپس روی پیوند کاربران کلیک کرده و در نهایت روی دکمه افزودن کاربر کلیک کنید که من را به صفحه نمایش زیر می برد. در این صفحه من به کاربر نام می دهم boto3-user
و کادر را علامت بزنید Programmatic access
قبل از کلیک بر روی دکمه بعدی
مرحله 2: در صفحه مجوزها روی آن کلیک می کنم خط مشی های موجود را مستقیماً ضمیمه کنید کاشی و سپس چک باکس برای را انتخاب کنید AdministratorAccess قبل از کلیک بر روی next مطابق شکل زیر.
مرحله 3: روی بعدی کلیک کنید زیرا من هیچ برچسب اختیاری اضافه نمی کنم.
مرحله 4: کاربر در حال ایجاد شدن را بررسی می کنم و سپس کلیک می کنم کاربر ایجاد کنید.
مرحله 5: در نهایت، اعتبارنامه ها را به عنوان یک فایل CSV دانلود و ذخیره می کنم.
در مرحله بعد باید کتابخانه های ضروری Python 3 را به صورت محلی در یک محیط مجازی نصب کنم، مانند:
$ python -m venv venv
$ source venv/bin/activate
(venv)$ pip install boto3 pprint awscli
در آخر من اعتبارنامه را برای آن پیکربندی می کنم boto3
کتابخانه با استفاده از awscli کتابخانه اطمینان حاصل کنید که اعتبارنامههای کلید دسترسی و کلید مخفی را که در مرحله 5 در بالا دانلود کردهام، اضافه کنید.
$ aws configure
AWS Access Key ID (****************3XRQ): **************
AWS Secret Access Key (****************UKjF): ****************
Default region name (None):
Default output format (None):
ایجاد و نمونه EC2 برای کار کردن
در این بخش قصد دارم روش ایجاد یک منطقه خاص AWS را بررسی کنم boto3
جلسه و همچنین نمونه سازی یک کلاینت EC2 با استفاده از شی جلسه فعال. سپس با استفاده از آن EC2 boto3
مشتری، من با نمونههای EC2 آن منطقه که راهاندازی، خاموش شدن و خاتمه را مدیریت میکنند تعامل خواهم داشت.
برای ایجاد یک نمونه EC2 برای این مقاله، مراحل زیر را انجام می دهم:
مرحله 1: من روی پیوند EC2 در منوی خدمات کلیک می کنم تا داشبورد EC2 باز شود و سپس روی راه اندازی نمونه دکمه در وسط صفحه نمایش
مرحله 2: در انتخاب تصویر ماشین آمازون (AMI) page کلیک می کنم انتخاب کنید دکمه کنار آمازون لینوکس AMI.
مرحله 3: پیش فرض را بپذیرید t2.micro
نمونه را تایپ کرده و روی آن کلیک کنید بررسی و راه اندازی دکمه.
مرحله 4: در بررسی page قسمت Tags را باز می کنم و کلیک می کنم ویرایش برچسب ها برای اضافه کردن برچسب برای نام و پشتیبان گیری، سپس بر روی آن کلیک کنید بازبینی را راه اندازی کنید و راه اندازی دوباره برای بازگشت به بررسی page قبل از اینکه در نهایت روی راه اندازی دکمه برای راه اندازی نمونه.
من اکنون یک نمونه EC2 در حال اجرا دارم، همانطور که در زیر نشان داده شده است.
boto3
جلسه و مشتری
در نهایت، من می توانم وارد نوشتن برخی از کدها شوم! من با ایجاد یک فایل خالی، یک ماژول پایتون، شروع می کنم awsutils.py
و در بالا من import کتابخانه boto3
سپس تابعی را تعریف کنید که یک منطقه خاص ایجاد کند جلسه هدف – شی.
import boto3
def get_session(region):
return boto3.session.Session(region_name=region)
اگر مفسر پایتون خود را روشن کنم و import ماژول تازه ایجاد شده در بالا می توانم از جدید استفاده کنم get_session
عملکردی برای ایجاد یک جلسه در همان منطقه به عنوان نمونه EC2 من، سپس نمونه سازی یک EC2.Client شیء از آن، مانند:
>>> import awsutils
>>> session = awsutils.get_session('us-east-1')
>>> client = session.client('ec2')
سپس میتوانم از این شی کلاینت EC2 برای دریافت شرح مفصلی از نمونه مورد استفاده استفاده کنم pprint
برای دیدن خروجی تماس کمی کارها را آسانتر کنید describe_instances
روی را client
هدف – شی.
>>> import pprint
>>> pprint.pprint(client.describe_instances())
...
من خروجی را حذف می کنم زیرا کاملاً پرمخاطب است، اما بدانید که حاوی یک فرهنگ لغت با a است Reservations
ورودی، که لیستی از داده ها است که نمونه های EC2 را در آن منطقه توصیف می کند و ResponseMetadata
در مورد درخواستی که به تازگی از API AWS REST انجام شده است.
بازیابی جزئیات نمونه EC2
من هم میتونم از همین استفاده کنم describe_instances
روش همراه با الف Filter
پارامتر برای فیلتر کردن انتخاب بر اساس مقادیر برچسب. به عنوان مثال، اگر بخواهم نمونه ای که اخیراً ایجاد شده است را با تگ Name با مقدار برابر دریافت کنم demo-instance
، که به شکل زیر است:
>>> demo = client.describe_instances(Filters=({'Name': 'tag:Name', 'Values': ('demo-instance')}))
>>> pprint.pprint(demo)
...
راه های زیادی برای فیلتر کردن خروجی وجود دارد describe_instances
و من شما را به اسناد رسمی برای جزئیات
راه اندازی و توقف یک نمونه EC2
برای متوقف کردن demo-instance
، من استفاده می کنم stop_instances
روش از client
شی، که قبلاً نمونهسازی کردم، و شناسه نمونه را به عنوان پارامتر فهرست ورودی به InstanceIds
آرگومان که در زیر نشان داده شده است:
>>> instance_id = demo('Reservations')(0)('Instances')(0)('InstanceId')
>>> instance_id
'i-0c462c48bc396bdbb'
>>> pprint.pprint(client.stop_instances(InstanceIds=(instance_id)))
{'ResponseMetadata': {'HTTPHeaders': {'content-length': '579',
'content-type': 'text/xml;charset=UTF-8',
'date': 'Sat, 22 Dec 2018 19:26:30 GMT',
'server': 'AmazonEC2'},
'HTTPStatusCode': 200,
'RequestId': 'e04a4a64-74e4-442f-8293-261f2ca9433d',
'RetryAttempts': 0},
'StoppingInstances': ({'CurrentState': {'Code': 64, 'Name': 'stopping'},
'InstanceId': 'i-0c462c48bc396bdbb',
'PreviousState': {'Code': 16, 'Name': 'running'}})
خروجی آخرین فرمان نشان می دهد که فراخوانی متد در حال توقف نمونه است. اگر دوباره بازیابی کنم demo-instance
و print را State
الان دیدم متوقف شده
>>> demo = client.describe_instances(Filters=({'Name': 'tag:Name', 'Values': ('demo-instance')}))
>>> demo('Reservations')(0)('Instances')(0)('State')
{'Code': 80, 'Name': 'stopped'}
برای شروع همان نمونه backup، یک متد مکمل به نام وجود دارد start_instances
که شبیه به stop_instances
روشی که در ادامه نشان می دهم.
>>> pprint.pprint(client.start_instances(InstanceIds=(instance_id)))
{'ResponseMetadata': {'HTTPHeaders': {'content-length': '579',
'content-type': 'text/xml;charset=UTF-8',
'date': 'Sat, 22 Dec 2018 19:37:02 GMT',
'server': 'AmazonEC2'},
'HTTPStatusCode': 200,
'RequestId': '21c65902-6665-4137-9023-43ac89f731d9',
'RetryAttempts': 0},
'StartingInstances': ({'CurrentState': {'Code': 0, 'Name': 'pending'},
'InstanceId': 'i-0c462c48bc396bdbb',
'PreviousState': {'Code': 80, 'Name': 'stopped'}})}
خروجی فوری دستور این است که در انتظار راه اندازی است. حالا وقتی دوباره نمونه و print وضعیت آن نشان می دهد که دوباره در حال اجرا است.
>>> demo = client.describe_instances(Filters=({'Name': 'tag:Name', 'Values': ('demo-instance')}))
>>> demo('Reservations')(0)('Instances')(0)('State')
{'Code': 16, 'Name': 'running'}
رویکرد جایگزین برای واکشی، شروع و توقف
علاوه بر EC2.Client
کلاسی که تا به حال با آن کار کرده ام، یک نیز وجود دارد EC2.Instance کلاسی که در مواردی مانند این مورد مفید است که در آن من فقط باید در یک زمان نگران یک نمونه باشم.
در زیر من از قبلا تولید شده استفاده می کنم session
برای دریافت یک شی منبع EC2، که می توانم از آن برای بازیابی و نمونه سازی an استفاده کنم Instance
اعتراض برای من demo-instance
.
>>> ec2 = session.resource('ec2')
>>> instance = ec2.Instance(instance_id)
به نظر من، یک مزیت عمده برای استفاده از Instance
کلاس این است که شما به جای نمایش لغتنامه نقطه ای از نمونه، با اشیاء واقعی کار می کنید، اما قدرت انجام اقدامات را از دست می دهید. روی چندین نمونه به طور همزمان که EC2.Client
کلاس فراهم می کند.
به عنوان مثال، برای مشاهده وضعیت demo-instance
، من فقط در بالا مثال زدم، به همین سادگی است:
>>> instance.state
{'Code': 16, 'Name': 'running'}
را Instance
class متدهای مفید زیادی دارد که دو تای آنها عبارتند از start
و stop
که از آن برای شروع و توقف نمونه های خود استفاده خواهم کرد، مانند:
>>> pprint.pprint(instance.stop())
{'ResponseMetadata': {'HTTPHeaders': {'content-length': '579',
'content-type': 'text/xml;charset=UTF-8',
'date': 'Sat, 22 Dec 2018 19:58:25 GMT',
'server': 'AmazonEC2'},
'HTTPStatusCode': 200,
'RequestId': 'a2f76028-cbd2-4727-be3e-ae832b12e1ff',
'RetryAttempts': 0},
'StoppingInstances': ({'CurrentState': {'Code': 64, 'Name': 'stopping'},
'InstanceId': 'i-0c462c48bc396bdbb',
'PreviousState': {'Code': 16, 'Name': 'running'}})}
پس از حدود یک دقیقه منتظر ماندن برای متوقف شدن کامل آن… سپس دوباره وضعیت را بررسی می کنم:
>>> instance.state
{'Code': 80, 'Name': 'stopped'}
اکنون می توانم دوباره آن را راه اندازی کنم.
>>> pprint.pprint(instance.start())
{'ResponseMetadata': {'HTTPHeaders': {'content-length': '579',
'content-type': 'text/xml;charset=UTF-8',
'date': 'Sat, 22 Dec 2018 20:01:01 GMT',
'server': 'AmazonEC2'},
'HTTPStatusCode': 200,
'RequestId': '3cfc6061-5d64-4e52-9961-5eb2fefab2d8',
'RetryAttempts': 0},
'StartingInstances': ({'CurrentState': {'Code': 0, 'Name': 'pending'},
'InstanceId': 'i-0c462c48bc396bdbb',
'PreviousState': {'Code': 80, 'Name': 'stopped'}})}
سپس پس از مدت کوتاهی دوباره وضعیت را بررسی کنید …
>>> instance.state
{'Code': 16, 'Name': 'running'}
ایجاد یک تصویر پشتیبان از یک EC2.Instance
یک موضوع مهم در مدیریت سرور، ایجاد پشتیبان گیری برای عقب نشینی است روی در صورت خراب شدن سرور در این بخش قصد دارم روش ایجاد تصویر ماشین آمازون (AMI) را نشان دهم. backup از من demo-instance
، که AWS سپس در سرویس ذخیره سازی ساده خود (S3) ذخیره می کند. بعداً میتوان از آن برای بازسازی نمونه EC2 استفاده کرد، درست مانند روش استفاده از AMI اولیه برای ایجاد demo-instance
.
برای شروع، روش استفاده از آن را نشان خواهم داد EC2.Client
کلاس و آن create_image
روش ایجاد یک تصویر AMI از a demo-instance
با ارائه شناسه نمونه و یک نام توصیفی برای نمونه.
>>> import datetime
>>> date = datetime.datetime.utcnow().strftime('%Y%m%d')
>>> date
'20181221'
>>> name = f"InstanceID_{instance_id}_Image_Backup_{date}"
>>> name
'InstanceID_i-0c462c48bc396bdbb_Image_Backup_20181221'
>>> name = f"InstanceID_{instance_id}_Backup_Image_{date}"
>>> name
'InstanceID_i-0c462c48bc396bdbb_Backup_Image_20181221'
>>> pprint.pprint(client.create_image(InstanceId=instance_id, Name=name))
{'ImageId': 'ami-00d7c04e2b3b28e2d',
'ResponseMetadata': {'HTTPHeaders': {'content-length': '242',
'content-type': 'text/xml;charset=UTF-8',
'date': 'Sat, 22 Dec 2018 20:13:55 GMT',
'server': 'AmazonEC2'},
'HTTPStatusCode': 200,
'RequestId': '7ccccb1e-91ff-4753-8fc4-b27cf43bb8cf',
'RetryAttempts': 0}}
به طور مشابه، من می توانم استفاده کنم Instance
کلاس create_image
روشی برای انجام همان کار، که نمونه ای از an را برمی گرداند EC2.Image
کلاسی که شبیه به EC2.Instance
کلاس
>>> image = instance.create_image(Name=name + '_2')
برچسب گذاری تصاویر و نمونه های EC2
یکی از ویژگیهای بسیار قدرتمند و در عین حال بسیار ساده نمونههای EC2 و تصاویر AMI، امکان افزودن برچسبهای سفارشی است. شما می توانید هر دو برچسب را از طریق مدیریت AWS اضافه کنید consoleهمانطور که در هنگام ایجاد نشان دادم demo-instance
با تگ های Name و BackUp و همچنین به صورت برنامه نویسی با boto3
و API AWS REST.
از آنجایی که من یک EC2.Instance
شی هنوز در مفسر پایتون من در حافظه شناور است من از آن برای نمایش استفاده خواهم کرد demo-instance
برچسب ها
>>> instance.tags
({'Key': 'BackUp', 'Value': ''}, {'Key': 'Name', 'Value': 'demo-instance'})
هر دو EC2.Instance
و EC2.Image
کلاس ها دارای مجموعه ای از عملکرد یکسان هستند create_tags
روش هایی برای افزودن برچسب ها به منابع ارائه شده آنها. در زیر اضافه کردن یک تگ RemoveOn به تصویر ایجاد شده قبلی را نشان میدهم که با تاریخی که در آن باید حذف شود جفت شده است. قالب تاریخ استفاده شده “YYYYMMDD” است.
>>> image.create_tags(Tags=({'Key': 'RemoveOn', 'Value': remove_on}))
(ec2.Tag(resource_id='ami-081c72fa60c8e2d58', key='RemoveOn', value='20181222'))
باز هم همین کار را می توان با آن انجام داد EC2.Client
کلاس با ارائه لیستی از شناسه های منبع، اما با مشتری می توانید در صورت تمایل هر دو تصویر و نمونه های EC2 را با مشخص کردن شناسه آنها در پارامتر Resource به طور همزمان برچسب گذاری کنید. create_tags
عملکرد، مانند:
>>> pprint.pprint(client.create_tags(Resources=('ami-00d7c04e2b3b28e2d'), Tags=({'Key': 'RemoveOn', 'Value': remove_on})))
{'ResponseMetadata': {'HTTPHeaders': {'content-length': '221',
'content-type': 'text/xml;charset=UTF-8',
'date': 'Sat, 22 Dec 2018 20:52:39 GMT',
'server': 'AmazonEC2'},
'HTTPStatusCode': 200,
'RequestId': '645b733a-138c-42a1-9966-5c2eb0ca3ba3',
'RetryAttempts': 0}}
ایجاد یک نمونه EC2 از یک تصویر پشتیبان
من می خواهم این بخش را با ارائه چیزی برای فکر کردن به شما شروع کنم. خودتان را در ذهنیت ناخوشایند یک مدیر سیستم قرار دهید، یا حتی بدتر از آن، یک توسعهدهنده که وانمود میکند یک sysadmin است، زیرا محصولی که در حال کار است. روی یکی ندارد (تذکر… این من هستم)، و یکی از سرورهای EC2 شما خراب شده است.
ایک! زمان تقلا فرا رسیده است… اکنون باید نوع سیستم عامل، اندازه و خدماتی که در حال اجرا هستند را بیابید روی سرور پایین… راه اندازی و نصب سرور پایه، به علاوه هر برنامه ای که متعلق به آن است را بررسی کنید روی و دعا کنید همه چیز درست پیش بیاید.
وای! نفس بکشید و آرام باشید، زیرا میخواهم به شما نشان دهم که چگونه میتوانید به سرعت دوباره راهاندازی کنید و بهعلاوه… هشدار اسپویلر… من میخواهم این دستورات مفسر پایتون را در مجموعهای از اسکریپتهای کاربردی در در پایان برای شما به اصلاح بیشتر و استفاده از.
خوب، با این تمرین ذهنی که از راه دور است، اجازه دهید به سر کار برگردم. برای ایجاد یک نمونه EC2 از یک شناسه تصویر، من از آن استفاده می کنم EC2.Client
کلاس run_instances
روش و تعداد نمونه هایی که باید شروع شوند و نوع نمونه اجرا را مشخص کنید.
>>> pprint.pprint(client.run_instances(ImageId='ami-081c72fa60c8e2d58', MinCount=1, MaxCount=1, InstanceType='t2.micro'))
...
من دوباره خروجی را به دلیل پرحرفی بودن حذف می کنم. لطفا نگاهی به اسناد رسمی برای run_instances روش، زیرا پارامترهای زیادی برای انتخاب کردن وجود دارد تا دقیقاً روش اجرای نمونه را سفارشی کنید.
حذف تصاویر پشتیبان
در حالت ایده آل، من درست می کردم backup تصاویر روی یک فاصله نسبتاً مکرر (یعنی حداقل روزانه) و همراه با همه این پشتیبانگیریها، سه چیز وجود دارد که یکی از آنها کاملاً خوب است و دو مورد دیگر تا حدودی مشکل ساز هستند. از طرف دیگر، من در حال تهیه عکسهای فوری از حالتهای شناخته شده سرور EC2 خود هستم که به من یک نقطه زمانی میدهد که اگر اوضاع بد شد، دوباره به آن بازگردم. با این حال، روی جنبه بد من ایجاد درهم و برهمی در سطل S3 خود را و بالا نگه داشتن هزینه با هر اضافی backup در انبار گذاشتم
راهی برای کاهش مضرات بهم ریختگی و افزایش هزینه های ذخیره سازی، حذف آن است backup تصاویر پس از سپری شدن مجموعه ای از زمان از پیش تعیین شده و اینجاست که تگ هایی که قبلا ایجاد کردم مرا نجات می دهند. من می توانم EC2 خود را پرس و جو کنم backup تصاویر را پیدا کنید و آنهایی را که دارای برچسب RemoveOn خاصی هستند پیدا کنید و سپس آنها را حذف کنید.
من می توانم با استفاده از describe_images
روش روی را EC2.Client
نمونه کلاس همراه با یک فیلتر برای برچسب “RemoveOn” برای دریافت تمام تصاویری که من برچسب زدم تا حذف شوند. روی یک تاریخ بدهید
>>> remove_on = '201812022'
>>> images = client.describe_images(Filters=({'Name': 'tag:RemoveOn', 'Values': (remove_on)}))
در مرحله بعد روی همه تصاویر تکرار می کنم و متد مشتری را فرا می خوانم deregister_image
ارسال شناسه تصویر تکرار شده و voilà – دیگر تصویری وجود ندارد.
>>> remove_on = '201812022'
>>> for img in images('Images'):
... client.deregister_image(ImageId=img('ImageId'))
خاتمه یک نمونه EC2
خوب، شروع، توقف، ایجاد و حذف را پوشش داده ایم backup تصاویر، و راه اندازی یک نمونه EC2 از a backup تصویر، من به پایان این آموزش نزدیک می شوم. اکنون تنها کاری که باید انجام دهید این است که نمونه های آزمایشی من را با تماس گرفتن پاکسازی کنید EC2.Client
کلاس terminate_instances
و گذراندن شناسه های نمونه برای خاتمه. باز هم استفاده خواهم کرد describe_instances
با یک فیلتر برای نام demo-instance
برای دریافت جزئیات آن و گرفتن شناسه نمونه آن. سپس می توانم از آن استفاده کنم terminate_instances
برای خلاص شدن از شر آن برای همیشه
توجه داشته باشید: بله، این یک چیز ابدی است پس در این روش بسیار مراقب باشید.
>>> demo = client.describe_instances(Filters=({'Name': 'tag:Name', 'Values': ('demo-instance')}))
>>> pprint.pprint(client.terminate_instances(InstanceIds=(instance_id)))
{'ResponseMetadata': {'HTTPHeaders': {'content-type': 'text/xml;charset=UTF-8',
'date': 'Sat, 22 Dec 2018 22:14:20 GMT',
'server': 'AmazonEC2',
'transfer-encoding': 'chunked',
'vary': 'Accept-Encoding'},
'HTTPStatusCode': 200,
'RequestId': '78881a08-0240-47df-b502-61a706bfb3ab',
'RetryAttempts': 0},
'TerminatingInstances': ({'CurrentState': {'Code': 32,
'Name': 'shutting-down'},
'InstanceId': 'i-0c462c48bc396bdbb',
'PreviousState': {'Code': 16, 'Name': 'running'}})}
جمع کردن همه چیز برای یک اسکریپت اتوماسیون
اکنون که این عملکردها را با استفاده از مفسر پوسته پایتون (که به خوانندگان توصیه می کنم حداقل یک بار انجام دهند) یک به یک دستورات را صادر کرده ام. روی خود را برای آزمایش با چیزها) من همه چیز را با هم در دو اسکریپت جداگانه به نام ec2backup.py
و amicleanup.py
.
را ec2backup.py
اسکریپت به سادگی تمام نمونه های EC2 موجود را که دارای تگ BackUp هستند پرس و جو می کند و سپس a را ایجاد می کند backup تصویر AMI برای هر یک در حالی که آنها را با یک برچسب RemoveOn با ارزش 3 روز در آینده تگ می کنید.
from datetime import datetime, timedelta
import awsutils
def backup(region_id='us-east-1'):
'''This method searches for all EC2 instances with a tag of BackUp
and creates a backup images of them then tags the images with a
RemoveOn tag of a YYYYMMDD value of three UTC days from now
'''
created_on = datetime.utcnow().strftime('%Y%m%d')
remove_on = (datetime.utcnow() + timedelta(days=3)).strftime('%Y%m%d')
session = awsutils.get_session(region_id)
client = session.client('ec2')
resource = session.resource('ec2')
reservations = client.describe_instances(Filters=({'Name': 'tag-key', 'Values': ('BackUp')}))
for reservation in reservations('Reservations'):
for instance_description in reservation('Instances'):
instance_id = instance_description('InstanceId')
name = f"InstanceId({instance_id})_CreatedOn({created_on})_RemoveOn({remove_on})"
print(f"Creating Backup: {name}")
image_description = client.create_image(InstanceId=instance_id, Name=name)
images.append(image_description('ImageId'))
image = resource.Image(image_description('ImageId'))
image.create_tags(Tags=({'Key': 'RemoveOn', 'Value': remove_on}, {'Key': 'Name', 'Value': name}))
if __name__ == '__main__':
backup()
بعدی این است amicleanup.py
اسکریپتی که تمام تصاویر AMI را که دارای برچسب RemoveOn برابر با روز اجرای آن هستند پرس و جو می کند. روی به شکل “YYYYMMDD” و آنها را حذف می کند.
from datetime import datetime
import awsutils
def cleanup(region_id='us-east-1'):
'''This method searches for all AMI images with a tag of RemoveOn
and a value of YYYYMMDD of the day its ran روی then removes it
'''
today = datetime.utcnow().strftime('%Y%m%d')
session = awsutils.get_session(region_id)
client = session.client('ec2')
resource = session.resource('ec2')
images = client.describe_images(Filters=({'Name': 'tag:RemoveOn', 'Values': (today)}))
for image_data in images('Images'):
image = resource.Image(image_data('ImageId'))
name_tag = (tag('Value') for tag in image.tags if tag('Key') == 'Name')
if name_tag:
print(f"Deregistering {name_tag(0)}")
image.deregister()
if __name__ == '__main__':
cleanup()
پیاده سازی Cron
یک راه نسبتاً ساده برای پیاده سازی عملکرد این دو اسکریپت، برنامه ریزی دو کار cron خواهد بود روی یک سرور لینوکس برای اجرای آنها. در مثال زیر، من یک وظیفه cron را برای اجرا هر روز در ساعت 11 شب برای اجرای آن پیکربندی کرده ام. ec2backup.py
سپس یک اسکریپت دیگر در ساعت 11:30 بعد از ظهر برای اجرا amicleanup.py
اسکریپت
0 23 * * * /path/to/venv/bin/python /path/to/ec2backup.py
30 23 * * * /path/to/venv/bin/python /path/to/amicleanup.py
پیاده سازی AWS Lambda
یک راه حل زیباتر استفاده از AWS Lambda برای اجرای این دو به عنوان مجموعه ای از توابع است. استفاده از AWS Lambda برای اجرای کد مزایای زیادی دارد، اما برای این مورد استفاده از اجرای چند تابع پایتون برای ایجاد و حذف backup مهمترین تصاویر در دسترس بودن بالا و اجتناب از پرداخت هزینه برای منابع بیکار هستند. هر دوی این مزایا زمانی به بهترین شکل متوجه می شوند که استفاده از لامبدا را با اجرای دو کار cron که در بخش آخر توضیح داده شد مقایسه کنید.
اگر بخواهم دو کار cron خود را برای اجرا پیکربندی کنم روی یک سرور موجود، پس اگر آن سرور از کار بیفتد چه اتفاقی می افتد؟ من نه تنها سردرد دارم که باید آن سرور را بیاورم backup، اما من همچنین امکان از دست دادن یک اجرای برنامه ریزی شده از کارهای cron که سرور EC2 را کنترل می کنند را نیز دارم. backup و پاکسازی process. این مشکلی با AWS Lambda نیست زیرا با افزونگی طراحی شده است تا در دسترس بودن بسیار بالا را تضمین کند.
مزیت اصلی دیگر عدم پرداخت هزینه برای منابع غیرفعال به بهترین وجه در مثالی قابل درک است که ممکن است نمونهای را فقط برای مدیریت این دو اسکریپت که یک بار در روز اجرا میشوند، ایجاد کرده باشم. این روش نه تنها تحت نقص بالقوه در دسترس بودن آخرین مورد قرار می گیرد، بلکه یک ماشین مجازی کامل برای اجرای دو اسکریپت یک بار در روز تدارک دیده شده است که مقدار بسیار کمی از زمان محاسباتی و منابع هدر رفته زیادی را تشکیل می دهد. این یک مورد اصلی برای استفاده از AWS Lambda برای بهبود کارایی عملیاتی است.
یکی دیگر از کارایی عملیاتی ناشی از استفاده از لامبدا عدم صرف زمان برای نگهداری سرور اختصاصی است.
برای ایجاد یک تابع AWS Lambda برای نمونه پشتیبانگیری از تصویر EC2 مراحل زیر را دنبال کنید:
مرحله 1. در زیر منوی Service کلیک کنید لامبدا در بخش محاسبه
مرحله 2. روی ایجاد تابع دکمه.
مرحله 3. انتخاب کنید نویسنده از ابتدا گزینه، نوع ec2backup
به عنوان نام تابع، پایتون 3.6 را از گزینه های زمان اجرا انتخاب کنید، سپس آن را اضافه کنید boto3-user
برای نقش و کلیک کنید Create Function
همانطور که در زیر نشان داده شده است:
مرحله 4. در طراح را انتخاب کنید رویدادهای CloudWatch و یک کار cron اضافه کنید cron(0 11 * ? * *)
که باعث می شود عملکرد هر روز در ساعت 11 شب اجرا شود.
مرحله 5. در ویرایشگر کد کد زیر را اضافه کنید:
import boto3
import os
from datetime import datetime, timedelta
def get_session(region, access_id, secret_key):
return boto3.session.Session(region_name=region,
aws_access_key_id=access_id,
aws_secret_access_key=secret_key)
def lambda_handler(event, context):
'''This method searches for all EC2 instances with a tag of BackUp
and creates a backup images of them then tags the images with a
RemoveOn tag of a YYYYMMDD value of three UTC days from now
'''
created_on = datetime.utcnow().strftime('%Y%m%d')
remove_on = (datetime.utcnow() + timedelta(days=3)).strftime('%Y%m%d')
session = get_session(os.getenv('REGION'),
os.getenv('ACCESS_KEY_ID'),
os.getenv('SECRET_KEY'))
client = session.client('ec2')
resource = session.resource('ec2')
reservations = client.describe_instances(Filters=({'Name': 'tag-key', 'Values': ('BackUp')}))
for reservation in reservations('Reservations'):
for instance_description in reservation('Instances'):
instance_id = instance_description('InstanceId')
name = f"InstanceId({instance_id})_CreatedOn({created_on})_RemoveOn({remove_on})"
print(f"Creating Backup: {name}")
image_description = client.create_image(InstanceId=instance_id, Name=name)
image = resource.Image(image_description('ImageId'))
image.create_tags(Tags=({'Key': 'RemoveOn', 'Value': remove_on}, {'Key': 'Name', 'Value': name}))
مرحله 6. در بخش زیر ویرایشگر کد، چند متغیر محیطی اضافه کنید.
- REGION با مقدار ناحیه نمونه های EC2 به backup که در این مثال us-east-1 است
- ACCESS_KEY_ID با مقدار کلید دسترسی از قسمتی که در آن
boto3-user
راه اندازی شد - SECRET_KEY با مقدار کلید مخفی از قسمتی که در
boto3-user
راه اندازی شد
مرحله 7. روی صرفه جویی دکمه در بالای page.
برای عملکرد پاکسازی تصویر، مراحل مشابه را با تغییرات زیر دنبال کنید.
مرحله 3. نام آن را می گذارم amicleanup
مرحله 4. من از پیکربندی زمانی کمی متفاوت استفاده می کنم cron(30 11 * ? * *)
برای اجرا در ساعت 11:30 شب
مرحله 5. از تابع پاکسازی زیر استفاده کنید:
import boto3
from datetime import datetime
import os
def get_session(region, access_id, secret_key):
return boto3.session.Session(region_name=region,
aws_access_key_id=access_id,
aws_secret_access_key=secret_key)
def lambda_handler(event, context):
'''This method searches for all AMI images with a tag of RemoveOn
and a value of YYYYMMDD of the day its ran روی then removes it
'''
today = datetime.utcnow().strftime('%Y%m%d')
session = get_session(os.getenv('REGION'),
os.getenv('ACCESS_KEY_ID'),
os.getenv('SECRET_KEY'))
client = session.client('ec2')
resource = session.resource('ec2')
images = client.describe_images(Filters=({'Name': 'tag:RemoveOn', 'Values': (today)}))
for image_data in images('Images'):
image = resource.Image(image_data('ImageId'))
name_tag = (tag('Value') for tag in image.tags if tag('Key') == 'Name')
if name_tag:
print(f"Deregistering {name_tag(0)}")
image.deregister()
نتیجه
در این مقاله روش استفاده از کتابخانه AWS Python SDK را توضیح دادهام boto3
برای تعامل با منابع EC2. من نشان می دهم که چگونه وظایف مدیریت عملیاتی را به تصویر AMI خودکار کنیم backup ایجاد نمونه های EC2 و پاکسازی بعدی آن ها backup تصاویر با استفاده از کارهای کرون برنامه ریزی شده روی یا یک سرور اختصاصی یا با استفاده از AWS Lambda.
اگر علاقه مند به یادگیری روش استفاده از Boto و AWS Simple Storage Service (S3) هستید، مقاله اسکات رابینسون را در اینجا ببینید. روی rasanegar.
مثل همیشه، ممنون که خواندید و از نظر دادن یا انتقاد در زیر خجالت نکشید.
(برچسبها برای ترجمه)# aws
منتشر شده در 1403-01-25 11:47:03