הדרכה ללא רבב: נסה CLI חכם יותר עבור AWS

אנרי בינשטוק הוא מנהל החדשנות הראשי בווליקס ויוצר שותף של פרויקט קוד פתוח Awless.

כאשר הענן עסק רק במכונות וירטואליות, כלים כמו שף או בובה עזרו לנו להכין בקלות את ה- VM שלנו. הדבר היחיד שהיה חשוב היה לספק מקרים המכילים את כל הקוד והנתונים הנדרשים. אך כעת, כאשר שירותי האינטרנט של אמזון הגיעו ליותר מ -90 שירותים, אינטראקציה עם ה- API של AWS הופכת להיות החלק העיקרי בעבודה.

כיצד עלינו לנהל תשתית AWS ובאילו ממשקים עלינו להשתמש? מרבית המתחילים מתחילים ב- AWS Console, ממשק ה- GUI המוגדר כברירת מחדל, ואילו sysadmins מנוסים מעדיפים בדרך כלל ממשק שורת פקודה (CLI). הבעיה היא שה- AWS CLI אינו ידידותי למשתמש. מכיוון שהוא משלב את כל ה- AWS API, הוא חושף שטח פנים עצום מבחינת פקודות, דגלים ואפשרויות.

Awless נולד מהצורך שלנו ב- CLI מהיר, חזק וקל לשימוש לניהול AWS. באמצעות Awless תוכלו ליצור ולהפעיל תשתית AWS, החל מאפס, ולקבל תמיד פלט קריא (גם לבני אדם וגם לתוכניות), לחקור ולשאול את כל משאבי הענן (גם במצב לא מקוון), להתחבר למופעים וליצור, לעדכן ולבצע מחק משאבי ענן. מעבר לשורות פקודה בודדות, Awless תומך בתבניות המאפשרות רמות אוטומציה גבוהות יותר. אחרון חביב, Awless שואפת להבטיח ברירות מחדל חכמות ושיטות עבודה מומלצות.

מכיוון שיש כל כך הרבה שירותי AWS, לעתים קרובות חשוב למצוא ולהציג היררכיית שירותים משורת הפקודה. אנו יכולים לקבץ שירותים לפי פונקציונליות - כגון מחשוב ומסד נתונים. אבל לעבור על כל אחד מהם באופן ממצה הוא מייגע שכן נכון לכתיבת שורות אלה לא פחות מ -15 שירותים סביב אחסון ומסד נתונים, ללא ספירה של ארבעה שירותי העברת נתונים ותשעה שירותי ניתוח שקשורים ישירות לשימוש בנתונים.

לנו קל יותר לקבץ שירותים לפי מוכנות בענן. במאמר זה נפרט כיצד להשתמש ב- Awless כדי ליצור ולנהל משאבי ענן למקרה שימוש אמיתי, פריסת מופעי וורדפרס מוכנים לייצור. נשתמש במשאבי AWS הבאים:

  1. שירותי VM EC2 (Elastic Compute Cloud) ו- ELB (Elastic Load Balancing);
  2. שירותים ברמה גבוהה המופעלים ב- VMs אך מנוהלים על ידי AWS, כגון RDS (Relation Database Service) או ElastiCache (לתורים);
  3. שירותים "ללא שרתים" הפועלים במחשבים וירטואליים מרובי דיירים, כגון S3 (אחסון אובייקטים) או Lambda (ביצוע פונקציה יחידה).
ווליקס

התחל עם Awless

הירשם ל- AWS וצר חשבון ראשון עם AdministratorAccessזכויות. שימו לב בזהירות למפתח הגישה ולמפתח הסודי שלכם.

התקן את Awless

Awless זמין ב- GitHub . אנו מספקים קבצים בינאריים שנבנו מראש וחבילות Homebrew עבור MacOS:

>brew tap wallix/awless 

>brew install awless

אתה יכול לבדוק ש- Awless מותקן כהלכה על ידי הפעלה:

>awless version

Awless מעוצב על פי כלי שורת פקודה פופולריים כמו Git. רוב הפקודות הן בצורה של:

>awless verb [entity] [parameter=value ...]

מאמר זה ייתן סקירה של 360 מעלות של עומסי ייצור אמיתיים ב- AWS, החל מאפס. לשם הבהרה, אנו משמיטים את כל אישור וכמה שלבי הפלט, שכן Awless תמיד מבקש לאשר פקודות שיוצרות, מעדכנות או מוחקות משאבים.

צעדים ראשונים עם Awless

אנו יכולים להוציא את הפקודה הראשונה של Awless על ידי רישום העננים הפרטיים שלנו (VPC). מכיוון שזו הריצה הראשונה שלנו, נצטרך להזין כמה נתונים נחוצים כדי להגדיר את Awless:

>awless list vpcs

Welcome to awless! Resolving environment data...

Please choose an AWS region:

ap-northeast-1, ap-northeast-2, ap-south-1, ap-southeast-1, ap-southeast-2, ca-central-1, cn-north-1, eu-central-1, eu-west-1, eu-west-2, sa-east-1, us-east-1, us-east-2, us-gov-west-1, us-west-1, us-west-2

Value ? > us-west-2

Syncing region ‘us-west-2’...

Cannot resolve AWS credentials (AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY) Please enter access keys and choose a profile name (stored at /Users/john/.aws/credentials):

AWS Access Key ID? AKIAIINZQI7WIEXAMPLE

AWS Secret Access Key? hYWZBVOusePEPSr5PkscplskB84fjbgUEXAMPLE

Choose a profile name? admin

✓ /Users/john/.aws/credentials created

✓ Credentials for profile ‘admin’ stored successfully

All done. Enjoy!

You can review and configure awless with `awless config`.

Now running: awless list vpcs

|     ID ▲     | NAME | DEFAULT |   STATE   |     CIDR      |

|--------------|------|---------|-----------|---------------|

| vpc-1d1df679 |      | true    | available | 172.31.0.0/16 |

צור משתמש AWS

כעת נשתמש ב- Awless כדי ליצור משתמש AWS חדש ולתת לו זכויות מספיקות באמצעות פרופיל הניהול. אנו יוצרים את המשתמש ג'ון ומפתח הגישה שלו:

>awless create user name=john 

>awless create accesskey user=john aws_access_key_id = AKIAIOSFODNN7EXAMPLE

aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

Do you want to save in your .aws/credentials? (y/n) y

Entry name in .aws/credentials? [default] john

כעת, כשג'ון קיים, הוא זקוק למערכת הרשאות. אנו נעניק לג'ון גישה מלאה לשירותי EC2, RDS, Scaling אוטומטי, CloudFront ו- S3 בהם נשתמש במאמר זה:

>awless attach policy service=ec2 access=full user=john 

>awless attach policy service=rds access=full user=john

>awless attach policy service=s3 access=full user=john

>awless attach policy service=autoscaling access=full user=john

>awless attach policy service=cloudfront access=full user=john

כעת, כשג'ון הוא משתמש פונקציונלי לחלוטין, נעבור לפרופיל שלו לשלבים הבאים:

>awless config set aws.profile john

אנו נשתמש ב- AWS כדי להגדיר פריסת וורדפרס זמינה ומנוהלת ביותר, המשלבת שירותי VM, שירותים מנוהלים ונטולי שרתים. המטרה העיקרית שלנו מוצגת להלן. נצטרך להתמודד עם שלושה "אתגרי devops" כדי להגיע אליו, תוך שימוש בשירותי תשתית AWS, שירותים מנוהלים ושירותים ללא שרתים, בהתאמה.

ווליקס

אתגר 1: הרם והעביר יישום ל- EC2

Lift and shift הוא המהיר ביותר להעביר יישומים מדור קודם לענן וליהנות מהיתרונות הגמישים והעלויות של פלטפורמות ענן. במקרה זה, נתחיל בפריסת מנוע וורדפרס ומסד הנתונים שלו ב- VM אחד. הלקוחות יתחברו ישירות ל- VM.

ווליקס

צור VPC

לפני שנמשיך ביצירת ה- VM, ראשית עלינו ליצור משאבי רשת:

  • A private network (or VPC)
  • An Internet gateway for this VPC
  • A subnet using the Internet gateway

Awless will prompt for any missing parameters with autocompletion. Here we use a mix of both provided (param=value) and prompted parameters:

>awless create vpc cidr=10.0.0.0/16 name=wordpress-vpc 

>awless create internetgateway

[OK] id=igw-1234567

>awless attach internetgateway

Please specify (Ctrl+C to quit, Tab for completion):

internetgateway.id? [Tab]

internetgateway.id? igw-1234567

internetgateway.vpc? @wo[Tab]

internetgateway.vpc? @wordpress-vpc

Awless puts forward the best practice to use names rather than resource IDs. As such, @resource-name is the identifier of the resource named “resource-name.”

Let’s create a public subnet to host our WordPress instance, and attach a route table that routes the Internet traffic to the VPC’s Internet gateway:

>awless create subnet cidr=10.0.0.0/24 [email protected] name=wordpress-public-subnet 

>awless update subnet [email protected] public=true

>awless create routetable [email protected]

>awless attach routetable [email protected]

        Please specify (Ctrl+C to quit, Tab for completion):

        routetable.id?[tab]

        *select the ID of the routetable you created above*

>awless create route cidr=0.0.0.0/0

        Please specify (Ctrl+C to quit, Tab for completion):

route.gateway? *the ID of the internet gateway you attached to the VPC above*

route.table? *the ID of the routetable you created above*

Note that each action in Awless is about as simple as it can get. Although we follow a comprehensive step-by-step approach, Awless allows us to get through the tedious process of setting up an infrastructure much faster than with the graphical console or the AWS CLI.

Create an SSH keypair and a security group

The cloud network is now ready. Before creating the instance, we need an SSH key pair, to connect to the instance later. In a single command, Awless generates an SSH key pair locally and registers it on AWS:

>awless create keypair name=johnkey

A best practice is to give minimal access to any resource, so we will only accept HTTP connections from all the Internet and SSH from our outgoing IP address. To do that, we create and configure a security group:

>awless create securitygroup [email protected] description=\”HTTP public + SSH access\” name=wordpress-secgroup 

>MY_IP=$(awless whoami —ip-only)

>awless update securitygroup [email protected] inbound=authorize cidr=$MY_IP/32 portrange=22

>awless update securitygroup [email protected] inbound=authorize cidr=0.0.0.0/0 portrange=80

Provision the application with AWS user data

We will now provision our WordPress instance through AWS user data. Here we will use the script available on GitHub:

>awless create instance [email protected] keypair=johnkey name=wordpress-instance userdata=//raw.githubusercontent.com/zn3zman/AWS-WordPress-Creation/16a52aef4f618d558d61197df4e4eca4c015277f/WP-Setup.sh [email protected]

You can use awless show to get information about any resource, such as the public IP address of our WordPress instance:

>awless show wordpress-instance

אתה יכול להתחבר לכתובת ה- IP מפלט הפקודה כדי לגשת לשירות הוורדפרס שלך (אם כי ייתכן שיהיה עליך להמתין מספר דקות כדי לספק את המופע כהלכה).

קרן וורדפרס

כברירת מחדל, Awless תיצור סוג t2.micro (1 vCPU, 1GB RAM) באמצעות אמזון לינוקס. באפשרותך לעדכן ערכי ברירת מחדל באמצעות awless config set:

>awless config set instance.type m4.large 

>UBUNTU_AMI=$(awless search images canonical:ubuntu —id-only —silent)

>awless config set instance.image $UBUNTU_AMI

עד לנקודה זו בנינו כמה משאבים. באמצעות awless list, אנו יכולים לרשום משתמשים, מופעים, רשתות משנה וכל סוגי המשאבים האחרים (בתנאי שלפרופיל AWS שלך יש כמובן זכויות מספיקות). לדוגמה, אנו יכולים לרשום מקרים:

>awless list instances 

|       ID ▲        |   ZONE   |        NAME        | UPTIME  |

|-------------------|----------|--------------------|---------|

|i-00268db26b0d0393c|us-west-1c| wordpress-instance | 57 mins |

[...]

Awless מספק תכונה עוצמתית המאפשרת חיבור קל למופעים עם SSH. מאחורי הקלעים, Awless יקבל באופן אוטומטי את כתובת ה- IP של המופע, ינחש את שם המשתמש ויתחבר עם המקש שיצרנו קודם:

>awless ssh wordpress-instance

If you want to delete the WordPress instance, you can run awless delete instance [email protected]. You can do it now, as we will create a more advanced deployment in the next challenge.

How to use Awless templates

All the steps in this challenge can be described as a sequence of Awless commands, where the results of previous commands (for instance, the ID of the Internet gateway) are used as inputs to subsequent commands. Because Awless provides a built-in templating system, you could encapsulate all of Challenge 1 in a template and run it with:

>awless run //raw.githubusercontent.com/wallix/awless-templates/bcd0dd41b1524eeac1e53d12b2998bc56689c517/simple_wordpress_infra.aws

Awless offers a powerful feature that enables you to revert most changes applied to an AWS infrastructure. For instance, you can delete the whole infrastructure created by a template in a single command: awless revert revert-id. To find a given revert-id, awless log lists all of the commands previously applied to the cloud infrastructure, with both their output and their ID:

>awless log # find the ID to revert >awless revert 01BM6D1YRZ5SSN5Z09VEEGN0HV

Challenge 2: Use AWS managed services

הפריסה הקודמת שלנו היא פונקציונלית, אך די אומנותית. הבלוג שלנו מופעל על ידי מופע יחיד באזור זמינות יחיד (AZ). כעת אנו רוצים לבנות בלוג זמין במיוחד, עם מאזן עומסים, שני מקרים באזורי AZ שונים ומסד נתונים משוכפל המשותף למופעים שלנו. במקום להריץ מסד נתונים משלנו במקרה, נשתמש ב- AWS RDS, השירות המנוהל של אמזון עבור מסדי נתונים של SQL. שימוש בשירות מנוהל מספק יתרונות רבים כולל אשכולות, אבטחה מנוהלת וגיבויים.

ווליקס

כדי שיהיה לנו משאבים זמינים במיוחד, עלינו להפיץ אותם ברשתות משנה באזורי זמינות שונים (AZ) ולאזן את העומס באמצעות איזון עומסים אלסטי.

ווליקס

עבור אתגר זה, ניצור את הדברים הבאים:

  • איזון עומסים אחד להפצת העומס בין המקרים
  • שתי רשתות משנה ציבוריות לקשר עם מאזן העומסים הפונה לאינטרנט
  • שתי רשתות משנה פרטיות באזורי AZ שונים (למשל us-east-1a, us-east-1e) לאירוח המקרים
  • קבוצת קנה מידה אוטומטית אחת לניהול קנה המידה של מופעי וורדפרס
  • שער NAT אחד ברשת משנה ציבורית אחת כדי לאפשר שיחות יוצאות להקצאת מופעים
  • IP קבוע קבוע אחד (Elastic IP) עבור שער ה- NAT
  • מופע RDS אחד עבור MariaDB משוכפל אוטומטית ברשתות המשנה הפרטיות

אנו נבנה תשתית זו על ידי הפעלת תבניות Awless. התבנית הראשונה יוצרת רשתות משנה וניתוב. {hole}הסימון מאפשר פרמטרים שיש למלא באופן דינמי במהלך הריצה של התבנית. $referenceהסימון מאפשר חזרה אזכור של משאבים שנוצרו.