AWS再入門ブログリレー2022 AWS CLI編

AWS CLIの入門にはCloudShellがおすすめです。
2022.03.31

大家好、コンサルティング部の西野です。

当エントリは弊社コンサルティング部による『AWS再入門ブログリレー2022』最終日のエントリです。

このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。 AWS をこれから学ぼう!という方にとっては文字通りの入門記事として、またすでに AWS を活用されている方にとっても AWS サービスの再発見や 2022年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。

シリーズ最終日のテーマは『AWS CLI』です。

AWS CLIとは

概要

AWS CLI (AWS Command Line Interface) はコマンドラインからAWSを管理するためのツールです。 macOS・Linux・Windows等の環境で動作し、AWSマネジメントコンソールと同等の操作をターミナルプログラムから実行できます。 ほぼすべてのAWSサービスおよびそのアクションに対応しており、シェルスクリプトから使用することによって作業の自動化も可能です。

AWS CLIのバージョンについて

AWS CLIには2022年3月現在2つのバージョン (Version 1およびVersion 2) が存在します。 Version 2はAWS CLIに存在するすべての機能をサポートしている最新バージョンであるため、特段の事情1がない限りVersion 2を使用すると良いでしょう。

使ってみる

実行環境の用意

AWS CLIを使ってみる環境としてAWS CloudShellを推奨します。

CloudShellはAWSマネジメントコンソールから利用可能なブラウザベースのシェル環境です。この環境にはAWS CLIがプリインストールされており、AWS CLIの使用に必要な認証情報(credential)がIAMの権限に基づき自動的に設定されます。そのため、ローカルマシン等に手動でインストールする場合に比して手軽かつセキュアに利用できます。

CloudShellについては下記のブログをご参照ください。

ローカルマシンでAWS CLIを使用する際の注意点については後述します。

コマンドの基本構造

AWS CLIにおけるコマンドの構造は下記のとおりです。

$ aws <command> <subcommand> [options and parameters]

awsコマンドに続くcommand部分には操作対象のサービス(s3ec2など)を入力します。
AWS CLIに対応しているサービスの一覧は下記のページで確認できます。
AWS CLI Command Reference - Available Services

つづくsubcommandにはcommandに入力したサービスに対して実行する具体的な操作を指定します。 Available Servicesから各サービスのページに飛ぶと現在有効なsubcommandを確認できます。2

コマンドの実行例

それでは実際にCloudShellからAWS CLIを使用してみましょう。
例としてaws ec2 describe-vpcs3コマンドを実行し作成済みVPCに関する情報を取得します。

$ aws ec2 describe-vpcs
{
    "Vpcs": [
        {
            "CidrBlock": "192.168.0.0/16",
            "DhcpOptionsId": "dopt-0796d1ac1bf01a8e3",
            "State": "available",
            "VpcId": "vpc-02ee542921056d564",
            "OwnerId": "XXXXXXXXXXXX",
            "InstanceTenancy": "default",
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-09f8a698d0db6a79d",
                    "CidrBlock": "192.168.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ],
            "IsDefault": false,
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "project-dog-vpc"
                }
            ]
        },
(以下省略)

このようにVPCがもつ各種の情報を取得できます。
この例では情報の取得を試してみましたが、別のsubcommandを使用すればVPCの作成・削除・設定の変更なども可能です。上述の通り、マネジメントコンソールから実行可能な操作をAWS CLIでほぼすべて実行できます。

オプションや機能の紹介

以下では私が普段よく使うオプションや機能について紹介します。

  • クライアント側のページャー設定
  • --queryオプション
  • --outputオプション
  • エイリアス

AWS CLIが持つすべてのオプション・機能の詳細については公式のユーザーガイドをご参照ください。

クライアント側のページャー設定

AWS CLI Version 2の出力はデフォルトでlessコマンドによってページ分割されるようになっています。
出力をページャーにゆだねることなく自身でコントロールしたいとお考えの方も多いでしょう。そんなときは下記のコマンドを実行してデフォルトのページャーを無効化しましょう。

$ export AWS_PAGER=""

環境変数ではなくコンフィグファイルによる恒久的な設定も可能です。

--queryオプション

--queryオプションを使用するとコマンドの出力をクライアント側でフィルタリングできます。このフィルタリングにはJMESPath構文を使用します。

ふたたびaws ec2 describe-vpcsの例を用います。VPCの情報のなかからNameタグおよびそのCIDRブロックのみを取得したい場合、下記のコマンドを実行します。

$ aws ec2 describe-vpcs --query 'Vpcs[].{CidrBlock:CidrBlock,Name:Tags[?Key==`Name`] | [0].Value}'
[
    {
        "CidrBlock": "192.168.0.0/16",
        "Name": "project-dog-vpc"
    },
    {
        "CidrBlock": "10.0.0.0/16",
        "Name": "project-cat-vpc"
    },
    {
        "CidrBlock": "172.16.0.0/16",
        "Name": "project-pig-vpc"
    }
]

出力がフィルタリングされ目的の情報のみを取り出すことができました。

--queryオプションのそのほかの活用例については下記ブログの参照をおすすめします。

--outputオプション

--outputオプションを使用すると出力のフォーマットを変更できます。 サポートされているオプション(出力形式)は以下の5つです。

  • json
  • yaml
  • yaml-stream
  • text
  • table

ここではtexttableの例を見てみましょう。

text

textを使用すると出力がタブ区切りの文字列としてフォーマットされます。

$ aws ec2 describe-vpcs --query 'Vpcs[].{CidrBlock:CidrBlock,Name:Tags[?Key==`Name`] | [0].Value}' --output text
192.168.0.0/16  project-dog-vpc
10.0.0.0/16     project-cat-vpc
172.16.0.0/16   project-pig-vpc

table

tableを使用すると出力が表形式に加工されます。パット見わかりやすそうですが、プログラムからの利用価値はほとんどなくなってしまうでしょう。

$ aws ec2 describe-vpcs --query 'Vpcs[].{CidrBlock:CidrBlock,Name:Tags[?Key==`Name`] | [0].Value}' --output table
---------------------------------------
|            DescribeVpcs             |
+-----------------+-------------------+
|    CidrBlock    |       Name        |
+-----------------+-------------------+
|  192.168.0.0/16 |  project-dog-vpc  |
|  10.0.0.0/16    |  project-cat-vpc  |
|  172.16.0.0/16  |  project-pig-vpc  |
+-----------------+-------------------+

エイリアス

AWS CLIのエイリアスを使用すると頻繁に使用するコマンドのショートカットを作成できます。
CloudShellで下記のコマンドを実行し、aws sts get-caller-identity4コマンドにエイリアスwhoamiを作成しましょう。

$ mkdir -p ~/.aws/cli
$ echo '[toplevel]' > ~/.aws/cli/alias
$ echo 'whoami = sts get-caller-identity' >> ~/.aws/cli/alias

続けて下記のコマンドを実行し、エイリアスが効いているかチェックしてみましょう。

$ aws sts get-caller-identity
{
    "UserId": "AROATWP57XXXXXXXXXXXX:cm-nishino.wataru",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/cm-nishino.wataru/cm-nishino.wataru"
}
$ aws whoami
{
    "UserId": "AROATWP57XXXXXXXXXXXX:cm-nishino.wataru",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/cm-nishino.wataru/cm-nishino.wataru"
}

aws whoamiaws sts get-caller-identityを実行できていることが確認できました。

本節の主旨とはズレますが、このaws sts get-caller-identityコマンドはAWS CLIを使い始めたばかりの皆さまにもっともおぼえていただきたいコマンドです。 コマンドを実行したクレデンシャルに関する情報(実行主体となるIAMユーザー・IAMロールやAWSアカウントIDなど)を出力してくれるため、こまめに確認することで作業ミスを少なくできます。エイリアスを作成してaws whoamiコマンドを叩きまくりましょう。

また、このエイリアスでもう少し複雑な作業も実現可能です。下記のレポジトリやブログなどを参考にしてみてください。

それでもローカルでAWS CLIを使いたい場合

ローカルマシンからAWS CLIを使用する際は認証情報を自身で設定する必要があり、その認証情報には多くの場合IAMユーザーのアクセスキーを使用します。 したがって、まずはアクセスキーが漏洩し不正利用されてしまった場合の危険性を正しく認識した上で、以下に記す防衛策を可能な限り採用してください。

IAMユーザーの最小権限化

IAMのセキュリティベストプラクティスにのっとり、AWS CLIを実行するIAMユーザーには必要最小限の権限を付与しましょう。

Security best practices in IAM - Grant least privilege

MFAの有効化

IAMユーザーのMFAを有効化しましょう。 こちらもIAMのセキュリティベストプラクティスとして推奨されています。

Security best practices in IAM - Enable MFA

AWS Vaultの利用

AWS CLIによって使用されるアクセスキー・シークレットアクセスキーはテキストファイルに平文で保存されています。 漏洩によるリスクを低減するためAWS Vaultを利用しましょう。

終わりに

本エントリをもって『AWS再入門ブログリレー2022』は終了です。 弊社コンサルティング部のメンバーが他にも多くの記事を執筆しておりますので、ぜひ下記のリンクから気になるサービスについて再入門してみてください。

AWS再入門2022 の記事一覧 | DevelopersIO

このブログがほんの少しでも世界を良くできれば嬉しいです。
元コンサルティング部の西野 (@xiyegen) がお送りしました。


  1. たとえば、AWS CLI Version 1を前提としたシェルスクリプトを使用する必要がある場合などです。Version 1とVersion 2における細かな挙動の差異については次のドキュメントを参考にしてください。Breaking changes – Migrating from AWS CLI version 1 to version 2 
  2. EC2の場合下記のページです。AWS CLI Command Reference - ec2 Available Commands 
  3. describe-vpcs 
  4. get-caller-identity