概要
AWS のリソースは、ブラウザで操作する AWS マネジメントコンソールから作成・確認できます。一方で、同じ操作を何度も繰り返したり、複数のリソースの情報をまとめて確認したりする場面では、画面をクリックして回るよりもコマンドで実行したほうが速く、手順も正確に再現できます。そのための公式ツールが AWS Command Line Interface(AWS CLI)です。
AWS CLI はコマンドラインシェルから AWS のサービスを操作するオープンソースのツールで、マネジメントコンソールと同等の機能をコマンドで扱えます。ただし、手元のパソコンに入れて使うには、インストールと認証の設定が必要です。そこでこの記事では、マネジメントコンソールから起動できるブラウザベースのシェル AWS CloudShell を使います。CloudShell には AWS CLI があらかじめ入っており、コンソールにサインインしたときの認証情報がそのまま引き継がれるため、インストールもアクセスキーの作成も不要です。
この記事では、CloudShell 上で AWS CLI を使い、「自分が誰として操作しているか」の確認、S3 バケットの作成からファイルのコピー・一覧・削除、EC2 の情報を --query と --output table で見やすく絞り込む操作までを体験します。
クラウドおさるコンソールのボタンを押す代わりに、コマンドで AWS に指示を出してみるのでござる。猿山の長老会への伝言も、身振り手振りより書き付けにしたほうが間違いが少ないのでござるな。


この記事のメリット
- AWS CLI がどのようなツールで、マネジメントコンソールとどう使い分けるかを理解できる
aws <コマンド> <サブコマンド>というコマンドの組み立て方を把握できる- AWS CloudShell を使って、インストール不要・アクセスキー不要で AWS CLI を試せる
aws sts get-caller-identityで、いま誰の権限で操作しているかを確認できるようになるaws s3コマンドでバケットの作成、ファイルのアップロード・一覧・削除ができるようになる--query・--output・--region・helpを使って、出力を絞り込んだり使い方を調べたりできるようになる- 手元の PC で AWS CLI を使う場合に推奨される認証方法(IAM Identity Center)を把握できる
執筆者とキャラクター紹介
執筆者:土肥(とひ)
株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。


クラウドおさる



はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。



基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。



猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。
技術解説
AWS CLI とは



とひさん、マネジメントコンソールの操作には慣れてきたでござる。AWS CLI というのは何でござるか?
AWS CLI は、コマンドラインシェルから AWS のサービスを操作するための公式ツールだよ。オープンソースで公開されていて、マネジメントコンソールでできることとほぼ同じことを、コマンドで実行できるんだ。



同じことができるなら、わざわざコマンドを覚える必要はあるのでござるか?
いい質問だね! コマンドの強みは「同じ操作をそのまま繰り返せる」ことなんだ。コンソールで 10 個のバケットの設定を確認するのは大変だけど、コマンドなら 1 行で一覧にできる。手順を文字で残せるから、チームで共有したりスクリプトにして自動化したりもしやすいんだよ。



なるほど、猿山の見回り当番も、毎回口で教えるより手順書にしておけば誰でも同じように回れるのでござるな!
そうそう、その感覚だね。それから、AWS CLI は AWS のパブリック API を直接呼び出しているんだ。コンソールもその裏で API を呼んでいるから、入口が違うだけで、たどり着く先は同じなんだよ。


コマンドの組み立て方



コマンドはどういう形で書くのでござるか?
基本の形はこれだけだよ。
aws <command> <subcommand> [options and parameters]<command> には s3 や ec2 のようなサービス名が入って、<subcommand> には ls や describe-instances のような「何をするか」が入るんだ。たとえば aws s3 ls なら「S3 で一覧を出す」という意味になるよ。
| 部分 | 意味 | 例 |
|---|---|---|
aws | AWS CLI 本体の呼び出し | aws |
<command> | 操作するサービス(最上位のコマンド) | s3、ec2、sts |
<subcommand> | 実行する操作 | ls、describe-availability-zones、get-caller-identity |
[options and parameters] | 操作に必要なオプションやパラメータ | --region ap-northeast-1、--output table |



「どこの」「何を」「どうする」の順番でござるな。オプションの書き方を忘れたらどうするのでござる?
そのときは末尾に help を付ければいいよ。aws help で全体、aws ec2 help でサービスごと、aws ec2 describe-instances help でその操作の詳しい説明が見られるんだ。説明には書式やオプションのほかに、使用例(EXAMPLES)や出力される項目の説明(OUTPUT)も載っているから、まずここを見る癖をつけるといいね。
よく使うグローバルオプション



どのコマンドにも付けられるオプションはあるのでござるか?
あるよ。今回のハンズオンで使うのはこの 3 つだね。
| オプション | 役割 | 例 |
|---|---|---|
--region | リクエストを送るリージョンを指定する | --region ap-northeast-1 |
--output | 出力形式を指定する(json / yaml / yaml-stream / text / table / off)。既定は json | --output table |
--query | JMESPath という書き方で、出力から必要な項目だけを取り出す | --query 'AvailabilityZones[].ZoneName' |



--query で絞り込むのでござるか。EC2 のコマンドには --filters というのもあると聞いたでござるが、何が違うのでござる?
いいところに気づいたね! --filters は AWS 側(サーバー側)で絞り込んでから結果を返してもらう仕組みで、--query は返ってきた結果を手元の AWS CLI(クライアント側)で絞り込む仕組みなんだ。
| 項目 | --filters など(サーバー側) | --query(クライアント側) |
|---|---|---|
| どこで絞り込むか | AWS のサービス側 | 手元の AWS CLI |
| 書き方 | サービスごとに異なる | JMESPath で共通 |
| 向いている使い方 | 大量のデータから対象を減らす | 必要な項目だけを取り出して見やすくする |
両方を組み合わせることもできるよ。サーバー側で対象を減らしてから、--query で見たい項目だけ取り出す、という使い方だね。



倉庫番にバナナの種類を言って持ってきてもらうのが --filters、届いた箱から自分で必要な房だけ取り出すのが --query でござるな!
AWS CloudShell とは



AWS CLI を使うには、まず自分の PC にインストールするのでござるか?
本格的に使うならそうなんだけど、最初の一歩には AWS CloudShell がおすすめだよ。CloudShell はマネジメントコンソールから起動できるブラウザベースのシェルで、AWS CLI のバージョン 2 があらかじめ入っているんだ。しかも、コンソールにサインインしたときの認証情報が自動で引き継がれるから、認証の設定も要らないんだよ。



インストールも鍵の準備も要らないのでござるか! 雲に乗ったまま作業できるようなものでござる。
ははは、まさにそうだね。CloudShell の主な特徴をまとめるとこんな感じだよ。
| 項目 | 内容 |
|---|---|
| 起動方法 | マネジメントコンソールのナビゲーションバーの CloudShell アイコン、検索バー、左下の Console Toolbar など |
| 認証 | コンソールのサインインに使った認証情報を自動で引き継ぐ |
| 入っているツール | AWS CLI v2、git、pip、vim、zip など。Node.js・Python・PowerShell も使える |
| 永続ストレージ | リージョンごとに 1 GB(ホームディレクトリ /home/cloudshell-user) |
| 非アクティブ時のタイムアウト | 操作しない状態が 20〜30 分続くとセッションが終了する |
| ホームディレクトリの削除 | そのリージョンで最後にセッションを終了してから 120 日使わないと削除される |
| 同時に開けるシェル | 1 リージョン・1 アカウントあたり最大 10 個 |



CloudShell は無料でござるか? バナナを払わずに使えるなら、ありがたいでござるが……。
CloudShell そのものは追加料金なしで使えるよ。ただし、CloudShell から作った S3 バケットや EC2 インスタンスなどのリソース、それにデータ転送には、通常どおり料金がかかるんだ。「CloudShell が無料だから、そこで作ったものも無料」というわけじゃないから注意してね。



道具はただでも、倉庫に積んだバナナの保管料はかかるのでござるな。覚えたでござる。
手元の PC で使うときの認証



いずれは自分の PC にも AWS CLI を入れたいでござる。そのときは、IAM ユーザーのアクセスキーを作って設定すればよいのでござるか?
そこは大事なポイントだね。有効期限のない長期のアクセスキーを使う方法は、AWS のドキュメントで「非推奨」とされているんだ。漏れてしまったら、無効にするまでずっと使われてしまうからね。



鍵を落としたら、取り替えるまで誰でもバナナ倉庫に入れてしまうのと同じでござるな……。では、どうすればよいのでござる?
おすすめは、有効期限のある短期の認証情報を使う方法だよ。代表的なのはこの 2 つかな。
| 方法 | コマンド | 向いているケース |
|---|---|---|
| IAM Identity Center | aws configure sso で設定し、aws sso login でサインイン | AWS Organizations と IAM Identity Center で複数アカウントを管理している組織 |
| コンソール認証情報 | aws login(AWS CLI 2.32.0 以降) | ルートユーザーや IAM ユーザー、IAM とのフェデレーションでコンソールにサインインしている場合 |
| 長期のアクセスキー | aws configure でキーを設定 | 非推奨 |
AWS のドキュメントでは、AWS Organizations と IAM Identity Center を組み合わせて短期の認証情報で使うのがセキュリティのベストプラクティスとされているんだ。aws configure sso を実行すると、SSO の開始 URL やリージョン、使うアカウントとロールを順に聞かれて、設定が保存される。あとは使う前に aws sso login でブラウザからサインインするだけだよ。今回は CloudShell で進めるから、ここは「そういう方法がある」と覚えておけば大丈夫。





毎朝、門番に顔を見せて当日だけの通行札をもらうやり方でござるな。それなら札を落としても翌日には使えなくなるでござる。全体像がつかめたでござる!
実践
ここでは AWS CloudShell を起動し、AWS CLI で「自分が誰として操作しているかの確認」「S3 バケットの作成・ファイルのコピー・一覧・削除」「EC2 の情報の絞り込み」を行います。
前提条件
- リージョン:
ap-northeast-1(東京) - AWS マネジメントコンソールにログイン済みであること
- サインインしている IAM ユーザーまたはロールに、CloudShell の利用と S3 バケットの作成・削除、EC2 の情報の参照ができる権限があること
- 事前に作成しておくリソースはありません
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| S3 バケット | cli-handson-<AWS アカウント ID> | AWS CLI からファイルをアップロードして操作を確認する |
| S3 オブジェクト | hello.txt | アップロード・ダウンロードの確認用ファイル |
CloudShell を起動して自分の身元を確認する
- AWS マネジメントコンソールにログインし、右上のリージョンが
アジアパシフィック (東京)(ap-northeast-1)であることを確認します - 上部のナビゲーションバーにある「CloudShell」アイコンをクリックします。上部の検索バーに
CloudShellと入力し、表示された「CloudShell」を選択しても起動できます - CloudShell が開き、環境の準備が終わるとコマンドを入力できる状態になります。ターミナル上部のタブに、選択中のリージョン名(
ap-northeast-1)が表示されていることを確認します
まず、AWS CLI のバージョンを確認します。
aws --versionaws-cli/2. で始まる文字列が表示されれば、AWS CLI バージョン 2 が使える状態です。実行環境(exec-env/CloudShell)も続けて表示されます。バージョン番号は時期によって異なります。
次に、いまどの IAM ユーザーまたはロールとして操作しているかを確認します。
aws sts get-caller-identity以下のような JSON が返ってきます。Account は AWS アカウント ID、Arn は操作している IAM ユーザーまたはロールの ARN です。コンソールにサインインしたときの身元がそのまま使われていることが確認できます。
{
"UserId": "AIDAXXXXXXXXXXXXXXXXX",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/xxxxx"
}

aws sts get-caller-identity は権限がなくても実行できる操作なので、「アクセスが拒否されたが、そもそも誰として操作しているのか」を確かめたいときの最初の一手として使えます。
S3 バケットを作成してファイルをコピーする
S3 のバケット名は全世界で一意である必要があります。ここでは、AWS アカウント ID を --query と --output text で取り出し、バケット名に使います。
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
BUCKET=cli-handson-${ACCOUNT_ID}
echo ${BUCKET}cli-handson- の後ろに 12 桁のアカウント ID が続いた名前が表示されることを確認します。--output text を付けると、JSON の引用符などが付かない値だけが返るため、そのまま変数に入れられます。
CloudShell のセッションがタイムアウトすると、変数の値は消えます。続きから再開するときは、上の 3 行をもう一度実行してください。
東京リージョンにバケットを作成します。
aws s3 mb s3://${BUCKET} --region ap-northeast-1make_bucket: cli-handson-<アカウント ID> と表示されれば作成できています。
アップロードするテキストファイルを CloudShell のホームディレクトリに作成し、バケットへコピーします。
echo "Hello from CloudShell" > hello.txt
aws s3 cp hello.txt s3://${BUCKET}/upload: ./hello.txt to s3://cli-handson-<アカウント ID>/hello.txt と表示されます。
作成したバケットとオブジェクトを一覧で確認します。aws s3 ls はアカウント内のバケットをすべて表示するため、grep で今回のバケットだけに絞り込みます。
aws s3 ls | grep cli-handson
aws s3 ls s3://${BUCKET}/1 行目でバケット名が、2 行目で hello.txt とそのサイズが表示されることを確認します。
続いて、S3 からファイルをダウンロードし、中身を確認します。aws s3 cp はコピー元とコピー先を入れ替えるだけで、アップロードにもダウンロードにも使えます。
aws s3 cp s3://${BUCKET}/hello.txt ./hello-download.txt
cat hello-download.txtHello from CloudShell と表示されれば、アップロードしたファイルを取り出せています。


コンソールで同じバケットを確認する
AWS CLI で作ったものが、コンソールからも同じように見えることを確認します。
- CloudShell は開いたまま、上部の検索バーに
S3と入力し、表示された「S3」を選択します - 左側ナビゲーションの「汎用バケット」を選択し、バケットの一覧で
cli-handsonと入力して絞り込みます cli-handson-<アカウント ID>をクリックし、「オブジェクト」タブにhello.txtがあることを確認します





コマンドで作ったバケットも、コンソールでは同じように見えるのでござる。入口が違うだけで、同じ AWS の API を呼んでいるからでござるな。
オブジェクトとバケットを削除する
CloudShell に戻り、オブジェクトを削除してからバケットを削除します。
aws s3 rm s3://${BUCKET}/hello.txt
aws s3 rb s3://${BUCKET}delete: s3://cli-handson-<アカウント ID>/hello.txt と remove_bucket: cli-handson-<アカウント ID> が表示されます。バケットの一覧から消えたことを確認します。
aws s3 ls | grep cli-handson何も表示されなければ削除できています。



aws s3 rb に --force を付けると、中身のオブジェクトごとバケットを消してしまうのでござる。コマンドは確認画面なしで実行されるので、バケット名を指差し確認してから Enter を押すのでござるぞ。
EC2 の情報を –query と –output table で絞り込む
ここからは、リソースを作らずに情報を参照するコマンドで、出力の絞り込み方を試します。まずは東京リージョンのアベイラビリティーゾーンを、オプションを付けずに取得します。
aws ec2 describe-availability-zones --region ap-northeast-1アベイラビリティーゾーンごとに ZoneName・ZoneId・State・OptInStatus・NetworkBorderGroup などの項目が JSON で長く表示されます。
次に、--query で必要な項目だけを取り出し、--output table で表形式にします。
aws ec2 describe-availability-zones \
--region ap-northeast-1 \
--query 'AvailabilityZones[].{Name:ZoneName,Id:ZoneId,State:State}' \
--output tableId(apne1-az4 など)、Name(ap-northeast-1a など)、State(available)の 3 列だけの表が表示されます。列はキー名のアルファベット順に並ぶため、--query に書いた順(Name、Id、State)とは異なります。{Name:ZoneName, ...} の部分は、取り出す項目に表示用の名前を付ける JMESPath の書き方です。


同じコマンドの --region だけを us-east-1(バージニア北部)に変えて実行します。
aws ec2 describe-availability-zones \
--region us-east-1 \
--query 'AvailabilityZones[].{Name:ZoneName,Id:ZoneId,State:State}' \
--output tableus-east-1a などのゾーンが表示され、--region を付けるだけで、CloudShell を開き直さずに別リージョンへリクエストを送れることが確認できます。
最後に、このアカウントで有効になっているリージョンの一覧を、名前だけ表形式で表示します。
aws ec2 describe-regions --query 'Regions[].RegionName' --output tableap-northeast-1 や us-east-1 などのリージョン名が 1 列の表で表示されます。
help で使い方を調べる
コマンドの使い方は help で調べられます。
aws ec2 describe-availability-zones helpNAME・DESCRIPTION・SYNOPSIS・OPTIONS・EXAMPLES・OUTPUT の順に説明が表示されます。--all-availability-zones などのオプションや、出力される項目の説明もここで確認できます。矢印キーやスペースキーでスクロールし、q キーで終了します。
まとめ
- AWS CLI は、コマンドラインから AWS のサービスを操作する公式ツールで、マネジメントコンソールと同等の操作をコマンドで実行できる
- コマンドは
aws <command> <subcommand> [options and parameters]の形で組み立て、使い方は末尾にhelpを付けて調べられる - AWS CloudShell は AWS CLI v2 がプリインストールされたブラウザベースのシェルで、コンソールの認証情報を引き継ぐためインストールもアクセスキーも不要である。CloudShell 自体は追加料金なしだが、作成したリソースには料金がかかる
aws sts get-caller-identityで、いま誰の権限で操作しているかを確認できるaws s3のmb/cp/ls/rm/rbで、バケットとオブジェクトの基本操作ができる--query(クライアント側の絞り込み)と--output tableで出力を見やすくでき、--regionでリクエスト先のリージョンを切り替えられる- 手元の PC で使う場合は、長期のアクセスキーではなく IAM Identity Center(
aws configure sso)などの短期の認証情報を使うのが推奨される
関連記事として、S3 の基本は「Amazon S3 でバケットを作成しオブジェクトを管理する」、EC2 の基本は「Amazon EC2 でインスタンスを起動しSSH接続する」、権限の考え方は「AWS IAM でユーザー・ロール・ポリシーを作成しアクセス制御する」で解説しています。
参照先
- AWS Command Line Interface とはどのようなものですか。
- AWS CLI のコマンド構造
- Command line options in the AWS CLI
- Setting the output format in the AWS CLI
- Filtering output in the AWS CLI
- Accessing help and resources for the AWS CLI
- Authentication and access credentials for the AWS CLI
- AWS CLI を使用した IAM アイデンティティセンター認証の設定
- コンソール認証情報を使用して AWS ローカル開発にログインする
- Using high-level (s3) commands in the AWS CLI
- get-caller-identity(AWS CLI Command Reference)
- describe-availability-zones(AWS CLI Command Reference)
- describe-regions(AWS CLI Command Reference)
- AWS CloudShell とは
- AWS CloudShell の開始方法
- AWS CloudShell のサービスクォータと制限













