Tutorial yang luar biasa: Cuba CLI yang lebih pintar untuk AWS

Henri Binsztok adalah ketua pegawai inovasi di Wallix dan pencipta bersama projek sumber terbuka Awless.

Semasa awan hanya mengenai mesin maya, alat seperti Chef atau Boneka membantu kami menyediakan VM kami dengan mudah. Satu-satunya perkara yang penting adalah menyediakan contoh yang mengandungi semua kod dan data yang diperlukan. Tetapi sekarang bahawa Perkhidmatan Web Amazon telah meningkat ke lebih daripada 90 perkhidmatan, berinteraksi dengan API AWS menjadi bahagian utama pekerjaan.

Bagaimana kita harus mengurus infrastruktur AWS, dan antara muka apa yang harus kita gunakan? Sebilangan besar pemula bermula dengan AWS Console, GUI lalai, sementara sysadmin berpengalaman biasanya lebih suka antara muka baris perintah (CLI). Masalahnya, AWS CLI tidak mesra pengguna. Kerana mengintegrasikan keseluruhan API AWS, ia memperlihatkan luas permukaan yang sangat besar dari segi perintah, bendera, dan pilihan.

Segera lahir dari keperluan kita untuk CLI yang cepat, kuat, dan mudah digunakan untuk menguruskan AWS. Dengan Awless, anda dapat membuat dan menjalankan infrastruktur AWS, bermula dari awal, dan selalu mendapat output yang dapat dibaca (untuk manusia dan program), meneroka dan menanyakan semua sumber awan (walaupun di luar talian), menyambung ke instance, dan membuat, mengemas kini, dan padamkan sumber awan. Di luar baris perintah tunggal, Awless menyokong templat yang membolehkan tahap automasi yang lebih tinggi. Yang terakhir, tetapi tidak kurang pentingnya, Awless bertujuan untuk memastikan amalan pintar dan keselamatan terbaik.

Oleh kerana terdapat banyak perkhidmatan AWS, selalunya penting untuk mencari dan memaparkan hierarki perkhidmatan dari baris arahan. Kami dapat mengelompokkan perkhidmatan mengikut fungsi — seperti pengkomputeran dan pangkalan data. Tetapi melalui masing-masing secara menyeluruh membosankan kerana pada saat penulisan ini, tidak kurang dari 15 perkhidmatan di sekitar penyimpanan dan pangkalan data, tidak termasuk empat perkhidmatan migrasi data dan sembilan perkhidmatan analisis yang secara langsung berkaitan dengan penggunaan data.

Kami merasa lebih mudah untuk mengumpulkan perkhidmatan berdasarkan kesediaan awan. Dalam artikel ini, kami akan memperincikan cara menggunakan Awless untuk membuat dan mengurus sumber awan untuk kes penggunaan sebenar, penyebaran instance WordPress siap produksi. Kami akan menggunakan sumber AWS berikut:

  1. Perkhidmatan VM EC2 (Elastic Compute Cloud) dan ELB (Elastic Load Balancing);
  2. Perkhidmatan peringkat tinggi yang dijalankan di VM tetapi dikendalikan oleh AWS, seperti RDS (Relational Database Service) atau ElastiCache (untuk barisan);
  3. Perkhidmatan "Tanpa Server" yang berjalan di VM multi-penyewa, seperti S3 (penyimpanan objek) atau Lambda (pelaksanaan fungsi tunggal).
Wallix

Mulakan dengan Awless

Daftar untuk AWS dan buat akaun pertama dengan AdministratorAccesshak. Perhatikan kunci akses dan kunci rahsia anda dengan teliti.

Pasang Tanpa Perlu

Sungguhpun ada di GitHub . Kami menyediakan pakej binari dan Homebrew yang telah dibina sebelumnya untuk MacOS:

>brew tap wallix/awless 

>brew install awless

Anda boleh memastikan bahawa Awless dipasang dengan betul dengan menjalankan:

>awless version

Awless dimodelkan selepas alat baris perintah yang popular seperti Git. Sebilangan besar arahan dalam bentuk:

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

Artikel ini akan memberikan gambaran keseluruhan 360 darjah mengenai beban kerja pengeluaran sebenar di AWS, bermula dari awal. Untuk kejelasan, kami menghilangkan semua pengesahan dan beberapa langkah output, kerana Awless selalu meminta untuk mengesahkan perintah yang membuat, mengemas kini, atau menghapus sumber.

Langkah pertama dengan Awless

Kami boleh mengeluarkan perintah Awless pertama kami dengan menyenaraikan Virtual Private Clouds (VPC) kami. Kerana ini adalah jalan pertama kami, kami perlu memasukkan beberapa data yang diperlukan untuk mengkonfigurasi 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 |

Buat pengguna AWS

Kami sekarang akan menggunakan Awless untuk membuat pengguna AWS baru dan memberinya hak yang mencukupi menggunakan profil pentadbir. Kami membuat pengguna John dan kunci aksesnya:

>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

Sekarang John ada, dia memerlukan satu set kebenaran. Kami akan memberi John akses penuh ke perkhidmatan EC2, RDS, Auto Scaling, CloudFront, dan S3 yang akan kami gunakan dalam artikel ini:

>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

Sekarang John adalah pengguna yang berfungsi sepenuhnya, kami akan beralih ke profilnya untuk langkah seterusnya:

>awless config set aws.profile john

Kami akan menggunakan AWS untuk menyiapkan penyebaran WordPress terkelola yang sangat tersedia, menggabungkan VM, perkhidmatan terurus, dan tanpa pelayan. Matlamat utama kami digambarkan di bawah. Kita harus mengatasi tiga "tantangan devops" untuk mencapainya, masing-masing menggunakan layanan infrastruktur AWS, perkhidmatan terurus, dan perkhidmatan tanpa pelayan.

Wallix

Cabaran 1: Angkat dan alihkan aplikasi ke EC2

Angkat dan pergeseran adalah yang paling cepat untuk memindahkan aplikasi lama ke awan dan mendapat keuntungan daripada kelebihan fleksibiliti dan kos platform cloud. Dalam kes ini, kita akan memulakan dengan menggunakan mesin WordPress dan pangkalan data dalam VM tunggal. Pelanggan akan berhubung terus ke VM.

Wallix

Buat VPC

Sebelum meneruskan pembuatan VM, pertama-tama kita perlu membuat sumber rangkaian:

  • 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

Anda boleh menyambung ke alamat IP dari output perintah untuk mengakses perkhidmatan WordPress anda (walaupun anda mungkin perlu menunggu beberapa minit agar instance tersebut disediakan dengan betul).

Yayasan WordPress

Secara lalai, Awless akan membuat t2.micro jenis (1 vCPU, 1GB RAM) menggunakan Amazon Linux. Anda boleh mengemas kini nilai lalai dengan menggunakan 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

Hingga kini, kami telah membina beberapa sumber. Dengan menggunakan awless list, kami dapat menyenaraikan pengguna, contoh, subnet, dan semua jenis sumber lain (dengan syarat tentu saja profil AWS anda mempunyai hak yang mencukupi). Sebagai contoh, kita boleh menyenaraikan contoh:

>awless list instances 

|       ID ▲        |   ZONE   |        NAME        | UPTIME  |

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

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

[...]

Awless menyediakan ciri kuat yang membolehkan sambungan mudah ke instance dengan SSH. Di sebalik tabir, Awless secara automatik akan mendapat alamat IP contoh, meneka nama pengguna, dan berhubung dengan pad kekunci yang kami buat sebelumnya:

>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

Penyebaran kami sebelum ini berfungsi, tetapi cukup profesional. Blog kami dikuasakan oleh satu contoh dalam Zon Ketersediaan (AZ). Kami sekarang ingin membina blog yang sangat tersedia, dengan penyeimbang beban, dua kejadian dalam AZ yang berbeza, dan pangkalan data yang direplikasi yang dikongsi oleh contoh kami. Sebagai ganti menjalankan pangkalan data kami sendiri, kami akan menggunakan AWS RDS, perkhidmatan terkawal Amazon untuk pangkalan data SQL. Menggunakan perkhidmatan terurus memberikan banyak kelebihan termasuk pengelompokan, keselamatan terkawal, dan sandaran.

Wallix

Untuk memiliki sumber daya yang sangat banyak, kita perlu menyebarkannya dalam subnet di zon ketersediaan yang berbeza (AZ) dan mengimbangkan beban melalui Elastic Load Balancing.

Wallix

Untuk cabaran ini, kami akan membuat yang berikut:

  • Pengimbang satu beban untuk mengagihkan beban antara keadaan
  • Dua subnet awam untuk dihubungkan dengan pengimbang beban yang menghadap Internet
  • Dua subnet persendirian dalam AZ yang berbeza (contohnya kami-timur-1a, us-timur-1e) untuk menjadi tuan rumah kejadian
  • Satu kumpulan penskalaan automatik untuk menguruskan penskalaan contoh WordPress
  • Satu pintu masuk NAT dalam satu subnet awam untuk membolehkan panggilan keluar untuk penyediaan contoh
  • Satu IP tetap awam (IP Elastik) untuk pintu masuk NAT
  • Satu RDS untuk contoh MariaDB ditiru secara automatik dalam subnet peribadi

Kami akan membina infrastruktur ini dengan menjalankan templat Awless. Templat pertama membuat subnet dan penghalaan. The {hole}notasi membolehkan parameter yang perlu diisi secara dinamik semasa berjalan template. The $referencenotasi membolehkan kembali rujukan sumber diwujudkan.