【AWSサービス 基礎編】AWS CLI と CloudShell でコマンドから AWS を操作する

目次

概要

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 に指示を出してみるのでござる。猿山の長老会への伝言も、身振り手振りより書き付けにしたほうが間違いが少ないのでござるな。

CloudShell ならインストールもアクセスキーも不要。ブラウザからそのまま AWS CLI を打てる
CloudShell ならインストールもアクセスキーも不要。ブラウザからそのまま AWS CLI を打てる

この記事のメリット

  • 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 を呼んでいるから、入口が違うだけで、たどり着く先は同じなんだよ。

コンソールでも CLI でも、呼ばれるのは同じ AWS の API
コンソールでも CLI でも、呼ばれるのは同じ AWS の API

コマンドの組み立て方

クラウドおさる

コマンドはどういう形で書くのでござるか?

土肥

基本の形はこれだけだよ。

aws <command> <subcommand> [options and parameters]
土肥

<command> には s3 や ec2 のようなサービス名が入って、<subcommand> には ls や describe-instances のような「何をするか」が入るんだ。たとえば aws s3 ls なら「S3 で一覧を出す」という意味になるよ。

部分意味例
awsAWS 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
--queryJMESPath という書き方で、出力から必要な項目だけを取り出す--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 Centeraws 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 で進めるから、ここは「そういう方法がある」と覚えておけば大丈夫。

CLI の認証は「短期の認証情報」を使う。長期のアクセスキーは避ける
CLI の認証は「短期の認証情報」を使う。長期のアクセスキーは避ける
クラウドおさる

毎朝、門番に顔を見せて当日だけの通行札をもらうやり方でござるな。それなら札を落としても翌日には使えなくなるでござる。全体像がつかめたでござる!

新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

実践

ハンズオンガイド7 ステップ画面 4 枚

コンソールの横に開いて、チェックしながら進めましょう。

ガイドを開く

別タブで開きます。チェックはこのブラウザに保存されます。

ここでは 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 --version

aws-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"
}
CloudShell で `aws --version` と `aws sts get-caller-identity` を実行した結果(ナビゲーションバーの CloudShell アイコンと、Account・Arn が表示された JSON)
CloudShell で `aws –version` と `aws sts get-caller-identity` を実行した結果(ナビゲーションバーの CloudShell アイコンと、Account・Arn が表示された JSON)

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-1

make_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.txt

Hello from CloudShell と表示されれば、アップロードしたファイルを取り出せています。

CloudShell で `aws s3 mb`・`aws s3 cp`・`aws s3 ls` を実行し、バケットの作成とオブジェクトのアップロード・ダウンロードが成功した結果
CloudShell で `aws s3 mb`・`aws s3 cp`・`aws s3 ls` を実行し、バケットの作成とオブジェクトのアップロード・ダウンロードが成功した結果

コンソールで同じバケットを確認する

AWS CLI で作ったものが、コンソールからも同じように見えることを確認します。

  • CloudShell は開いたまま、上部の検索バーに S3 と入力し、表示された「S3」を選択します
  • 左側ナビゲーションの「汎用バケット」を選択し、バケットの一覧で cli-handson と入力して絞り込みます
  • cli-handson-<アカウント ID> をクリックし、「オブジェクト」タブに hello.txt があることを確認します
S3 コンソールで `cli-handson-<アカウント ID>` バケットを開き、「オブジェクト」タブに `hello.txt` が表示されている画面
S3 コンソールで `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 table

Id(apne1-az4 など)、Name(ap-northeast-1a など)、State(available)の 3 列だけの表が表示されます。列はキー名のアルファベット順に並ぶため、--query に書いた順(Name、Id、State)とは異なります。{Name:ZoneName, ...} の部分は、取り出す項目に表示用の名前を付ける JMESPath の書き方です。

CloudShell で `aws ec2 describe-availability-zones` に `--query` と `--output table` を付けて実行し、Id・Name・State の 3 列の表が表示された結果
CloudShell で `aws ec2 describe-availability-zones` に `–query` と `–output table` を付けて実行し、Id・Name・State の 3 列の表が表示された結果

同じコマンドの --region だけを us-east-1(バージニア北部)に変えて実行します。

aws ec2 describe-availability-zones \
  --region us-east-1 \
  --query 'AvailabilityZones[].{Name:ZoneName,Id:ZoneId,State:State}' \
  --output table

us-east-1a などのゾーンが表示され、--region を付けるだけで、CloudShell を開き直さずに別リージョンへリクエストを送れることが確認できます。

最後に、このアカウントで有効になっているリージョンの一覧を、名前だけ表形式で表示します。

aws ec2 describe-regions --query 'Regions[].RegionName' --output table

ap-northeast-1 や us-east-1 などのリージョン名が 1 列の表で表示されます。

help で使い方を調べる

コマンドの使い方は help で調べられます。

aws ec2 describe-availability-zones help

NAME・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 の仕事がある ── ジュニアおさるのキャリア相談

CLF には受かったけれど、次に何をすればいいのか分からない。独学で AWS を学ぶジュニアおさるの相談に、株式会社ジェニュイン代表の土肥が答えています。

  • ✓資格はゴールか、CLF の次に何から手を付けるか
  • ✓EC2 の次に作ってみる構成と、IaC・コスト管理
  • ✓実務経験ゼロでも、面接で話せる「これまで」の作り方
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次