ひどいチュートリアル:AWS用のよりスマートなCLIを試してください

Henri Binsztokは、Wallixの最高イノベーション責任者であり、Awlessオープンソースプロジェクトの共同作成者です。

クラウドが仮想マシンに関するものだったとき、ChefやPuppetなどのツールはVMを簡単に準備するのに役立ちました。重要なのは、必要なすべてのコードとデータを含むインスタンスをプロビジョニングすることだけでした。しかし、Amazon Web Servicesが90以上のサービスに膨れ上がった今、AWSAPIとの対話が作業の主要な部分になります。

AWSインフラストラクチャをどのように管理し、どのインターフェースを使用する必要がありますか?ほとんどの初心者はデフォルトのGUIであるAWSコンソールから始めますが、熟練したシステム管理者は通常、コマンドラインインターフェイス(CLI)を好みます。問題は、AWSCLIがユーザーフレンドリーではないことです。 AWS API全体を統合するため、コマンド、フラグ、オプションの観点から膨大な表面積を公開します。

Awlessは、AWSを管理するための高速で強力で使いやすいCLIの必要性から生まれました。 Awlessを使用すると、AWSインフラストラクチャを最初から作成して実行し、常に読み取り可能な出力(人間とプログラムの両方)を取得し、すべてのクラウドリソース(オフラインでも)を探索してクエリを実行し、インスタンスに接続して、作成、更新、クラウドリソースを削除します。 Awlessは、単一のコマンドラインを超えて、より高いレベルの自動化を可能にするテンプレートをサポートしています。最後になりましたが、Awlessは、スマートなデフォルトとセキュリティのベストプラクティスを確保することを目的としています。

AWSサービスは非常に多いため、コマンドラインからサービスの階層を見つけて表示することが重要な場合がよくあります。コンピューティングやデータベースなどの機能ごとにサービスをグループ化できます。しかし、この記事の執筆時点では、データ使用に直接関連する4つのデータ移行サービスと9つの分析サービスを除いて、ストレージとデータベースに15以上のサービスがあるため、それぞれを徹底的に調べるのは面倒です。

クラウドの準備状況によってサービスをグループ化する方が簡単です。この記事では、Awlessを使用して、実際のユースケースである本番環境に対応したWordPressインスタンスのデプロイ用のクラウドリソースを作成および管理する方法について詳しく説明します。次のAWSリソースを使用します。

  1. VMサービスEC2(Elastic Compute Cloud)およびELB(Elastic Load Balancing);
  2. RDS(リレーショナルデータベースサービス)やElastiCache(キュー用)など、VMで実行されるが、AWSによって管理される高レベルのサービス。
  3. S3(オブジェクトストレージ)やLambda(単一機能の実行)などのマルチテナントVMで実行される「サーバーレス」サービス。
ウォリックス

Awlessを始めましょう

AWSにサインアップして、AdministratorAccess権限を持つ最初のアカウントを作成します。アクセスキーと秘密キーを注意深くメモしてください。

Awlessをインストールする

AwlessはGitHubで入手できます。我々は提供事前に構築されたバイナリのMacOS用や自作のパッケージを:

>brew tap wallix/awless 

>brew install awless

次のコマンドを実行すると、Awlessが正しくインストールされていることを確認できます。

>awless version

Awlessは、Gitなどの一般的なコマンドラインツールをモデルにしています。ほとんどのコマンドは次の形式です。

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

この記事では、AWSでの実際の本番ワークロードの360度の概要を最初から説明します。わかりやすくするために、Awlessは常にリソースを作成、更新、または削除するコマンドの確認を要求するため、すべての確認と一部の出力手順を省略しています。

Awlessの最初のステップ

仮想プライベートクラウド(VPC)を一覧表示することで、最初のAwlessコマンドを発行できます。これは最初の実行であるため、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ユーザーを作成し、管理者プロファイルを使用して十分な権限を付与します。ユーザーJohnと彼のアクセスキーを作成します。

>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

Johnが存在するようになったので、彼には一連の権限が必要です。Johnに、この記事で使用するEC2、RDS、Auto 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

Johnが完全に機能するユーザーになったので、次の手順のために彼のプロファイルに切り替えます。

>awless config set aws.profile john

AWSを使用して、VM、マネージドサービス、サーバーレスサービスを組み合わせた、可用性の高いマネージドWordPressデプロイメントをセットアップします。私たちの主な目標は以下のとおりです。AWSインフラストラクチャサービス、マネージドサービス、サーバーレスサービスをそれぞれ利用して、それに到達するために3つの「DevOpsの課題」に対処する必要があります。

ウォリックス

課題1:アプリケーションを持ち上げてEC2に移行する

リフトアンドシフトは、レガシーアプリケーションをクラウドに移行するのに最も迅速であり、クラウドプラットフォームの柔軟性とコスト上の利点を活用できます。この場合、WordPressエンジンとそのデータベースを単一の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アドレスに接続して、WordPressサービスにアクセスできます(ただし、インスタンスが適切にプロビジョニングされるまで数分待つ必要がある場合があります)。

WordPress Foundation

デフォルトでは、AwlessはAmazon Linuxを使用してタイプ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内の2つのインスタンス、およびインスタンスによって共有されるレプリケートされたデータベースを使用して、可用性の高いブログを構築したいと考えています。インスタンスで独自のデータベースを実行する代わりに、SQLデータベース用のAmazonのマネージドサービスであるAWSRDSを使用します。マネージドサービスを使用すると、クラスタリング、マネージドセキュリティ、バックアップなど、多くの利点があります。

ウォリックス

高可用性リソースを確保するには、それらをさまざまなアベイラビリティーゾーン(AZ)のサブネットに分散し、Elastic LoadBalancingを介して負荷を分散する必要があります。

ウォリックス

このチャレンジのために、以下を作成します。

  • インスタンス間で負荷を分散するための1つのロードバランサー
  • インターネット向けロードバランサーに関連付ける2つのパブリックサブネット
  • インスタンスをホストするための、異なるAZ内の2つのプライベートサブネット(例:us-east-1a、us-east-1e)
  • WordPressインスタンスのスケーリングを管理するための1つの自動スケーリンググループ
  • インスタンスプロビジョニングのアウトバウンドコールを有効にするための1つのパブリックサブネット内の1つのNATゲートウェイ
  • NATゲートウェイ用の1つのパブリック固定IP(Elastic IP)
  • プライベートサブネットに自動的に複製されたMariaDBインスタンスの1つのRDS

Awlessテンプレートを実行して、このインフラストラクチャを構築します。最初のテンプレートは、サブネットとルーティングを作成します。この{hole}表記により、テンプレートの実行中にパラメーターを動的に入力できます。この$reference表記により、作成されたリソースの逆参照が可能になります。