Tutorial awless: Coba CLI yang lebih cerdas untuk AWS

Henri Binsztok adalah kepala bagian inovasi di Wallix dan salah satu pencipta proyek sumber terbuka Awless.

Saat cloud hanyalah tentang mesin virtual, alat seperti Chef atau Puppet membantu kami menyiapkan VM dengan mudah. Satu-satunya hal yang penting adalah menyediakan contoh yang berisi semua kode dan data yang diperlukan. Namun sekarang Amazon Web Services telah berkembang pesat menjadi lebih dari 90 layanan, berinteraksi dengan API AWS menjadi bagian utama dari pekerjaan tersebut.

Bagaimana kita harus mengelola infrastruktur AWS, dan antarmuka apa yang harus kita gunakan? Sebagian besar pemula mulai dengan AWS Console, GUI default, sementara sysadmin berpengalaman umumnya lebih memilih antarmuka baris perintah (CLI). Masalahnya, AWS CLI tidak ramah pengguna. Karena mengintegrasikan seluruh AWS API, ini memperlihatkan area permukaan yang sangat luas dalam hal perintah, bendera, dan opsi.

Awless lahir dari kebutuhan kami akan CLI yang cepat, kuat, dan mudah digunakan untuk mengelola AWS. Dengan Awless, Anda dapat membuat dan menjalankan infrastruktur AWS, mulai dari awal, dan selalu mendapatkan output yang dapat dibaca (untuk manusia dan program), menjelajahi dan menanyakan semua sumber daya cloud (bahkan offline), menghubungkan ke instans, dan membuat, memperbarui, dan hapus sumber daya cloud. Di luar baris perintah tunggal, Awless mendukung templat yang memungkinkan otomatisasi tingkat tinggi. Terakhir, namun tidak kalah pentingnya, Awless bertujuan untuk memastikan default cerdas dan praktik terbaik keamanan.

Karena ada begitu banyak layanan AWS, seringkali penting untuk menemukan dan menampilkan hierarki layanan dari baris perintah. Kami dapat mengelompokkan layanan berdasarkan fungsionalitas — seperti komputasi dan database. Tetapi melalui masing-masing dari mereka secara menyeluruh itu membosankan karena ada, pada tulisan ini, tidak kurang dari 15 layanan seputar penyimpanan dan basis data, tidak termasuk empat layanan migrasi data dan sembilan layanan analitik yang terkait langsung dengan penggunaan data.

Kami merasa lebih mudah untuk mengelompokkan layanan berdasarkan kesiapan cloud. Pada artikel ini, kami akan menjelaskan cara menggunakan Awless untuk membuat dan mengelola sumber daya cloud untuk kasus penggunaan nyata, penerapan instance WordPress yang siap produksi. Kami akan menggunakan sumber daya AWS berikut:

  1. Layanan VM EC2 (Elastic Compute Cloud) dan ELB (Elastic Load Balancing);
  2. Layanan tingkat tinggi yang berjalan di VM tetapi dikelola oleh AWS, seperti RDS (Relational Database Service) atau ElastiCache (untuk antrian);
  3. Layanan "tanpa server" yang berjalan di VM multi-tenant, seperti S3 (penyimpanan objek) atau Lambda (eksekusi fungsi tunggal).
Wallix

Mulailah dengan Awless

Daftar ke AWS dan buat akun pertama dengan AdministratorAccesshak. Catat dengan hati-hati kunci akses dan kunci rahasia Anda.

Instal Awless

Awless tersedia di GitHub . Kami menyediakan paket biner dan Homebrew bawaan untuk MacOS:

>brew tap wallix/awless 

>brew install awless

Anda dapat memeriksa apakah Awless sudah terpasang dengan benar dengan menjalankan:

>awless version

Awless dimodelkan setelah alat baris perintah populer seperti Git. Sebagian besar perintah berupa:

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

Artikel ini akan memberikan ikhtisar 360 derajat tentang beban kerja produksi nyata di AWS, mulai dari awal. Untuk kejelasan, kami menghilangkan semua konfirmasi dan beberapa langkah keluaran, karena Awless selalu meminta untuk mengonfirmasi perintah yang membuat, memperbarui, atau menghapus sumber daya.

Langkah pertama dengan Awless

Kami dapat mengeluarkan perintah Awless pertama kami dengan mencantumkan Virtual Private Clouds (VPC) kami. Karena ini adalah pertama kalinya kita menjalankan, kita 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 memadai menggunakan profil admin. 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 sudah ada, dia membutuhkan satu set izin. Kami akan memberi John akses penuh ke layanan 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 penuh, kami akan beralih ke profilnya untuk langkah selanjutnya:

>awless config set aws.profile john

Kami akan menggunakan AWS untuk menyiapkan penerapan WordPress terkelola yang sangat tersedia, menggabungkan VM, layanan terkelola, dan tanpa server. Tujuan utama kami digambarkan di bawah ini. Kami harus mengatasi tiga "tantangan pengembang" untuk mencapainya, masing-masing menggunakan layanan infrastruktur AWS, layanan terkelola, dan layanan tanpa server.

Wallix

Tantangan 1: Angkat dan pindahkan aplikasi ke EC2

Lift and shift adalah yang tercepat untuk memigrasi aplikasi lama ke cloud dan mendapatkan keuntungan dari fleksibilitas dan keunggulan biaya platform cloud. Dalam hal ini, kita akan mulai dengan menerapkan mesin WordPress dan database-nya dalam satu VM. Klien akan terhubung langsung ke VM.

Wallix

Buat VPC

Sebelum melanjutkan dengan pembuatan VM, pertama-tama kita perlu membuat sumber daya jaringan:

  • 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 dapat terhubung ke alamat IP dari keluaran perintah untuk mengakses layanan WordPress Anda (meskipun Anda mungkin harus menunggu beberapa menit agar instance dapat disediakan dengan benar).

Yayasan WordPress

Secara default, Awless akan membuat jenis t2.micro (1 vCPU, 1GB RAM) menggunakan Amazon Linux. Anda dapat memperbarui nilai default 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

Sampai saat ini, kami telah membangun beberapa sumber daya. Dengan menggunakan awless list, kami dapat mencantumkan pengguna, instans, subnet, dan semua jenis sumber daya lainnya (asalkan profil AWS Anda memiliki hak yang memadai tentunya). Misalnya, kami dapat membuat daftar contoh:

>awless list instances 

|       ID ▲        |   ZONE   |        NAME        | UPTIME  |

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

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

[...]

Awless menyediakan fitur canggih yang memungkinkan koneksi mudah ke instans dengan SSH. Di balik layar, Awless akan secara otomatis mendapatkan alamat IP instance, menebak nama pengguna, dan terhubung dengan keypair yang kita 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

Penerapan kami sebelumnya berfungsi, tetapi cukup artisanal. Blog kami diberdayakan oleh satu mesin virtual dalam satu Availability Zone (AZ). Kami sekarang ingin membuat blog yang sangat tersedia, dengan penyeimbang beban, dua instance di AZ yang berbeda, dan database yang direplikasi yang digunakan bersama oleh instance kami. Alih-alih menjalankan database kami sendiri dalam sebuah instans, kami akan menggunakan AWS RDS, layanan terkelola Amazon untuk database SQL. Menggunakan layanan terkelola memberikan banyak keuntungan termasuk pengelompokan, keamanan terkelola, dan pencadangan.

Wallix

Untuk memiliki sumber daya yang sangat tersedia, kami perlu mendistribusikannya dalam subnet di zona ketersediaan yang berbeda (AZ) dan menyeimbangkan beban melalui Elastic Load Balancing.

Wallix

Untuk tantangan ini, kami akan membuat yang berikut ini:

  • Satu penyeimbang beban untuk mendistribusikan beban di antara beberapa instance
  • Dua subnet publik untuk dikaitkan dengan penyeimbang beban yang menghadap ke Internet
  • Dua subnet pribadi di AZ berbeda (mis. Us-east-1a, us-east-1e) untuk menghosting instans
  • Satu grup penskalaan otomatis untuk mengelola penskalaan instance WordPress
  • Satu gateway NAT di satu subnet publik untuk mengaktifkan panggilan keluar untuk penyediaan instance
  • Satu IP tetap publik (IP Elastis) untuk gateway NAT
  • Satu RDS untuk instance MariaDB otomatis direplikasi di subnet pribadi

Kami akan membangun infrastruktur ini dengan menjalankan template Awless. Template pertama membuat subnet dan perutean. The {hole}notasi memungkinkan parameter untuk diisi secara dinamis selama menjalankan template. The $referencenotasi memungkinkan kembali referensi sumber daya dibuat.