AWS CLI と CloudShell でコマンドから AWS を操作する
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
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"
}
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 と表示されれば、アップロードしたファイルを取り出せています。
aws s3 mb・aws s3 cp・aws s3 ls を実行し、バケットの作成とオブジェクトのアップロード・ダウンロードが成功した結果コンソールで同じバケットを確認する
AWS CLI で作ったものが、コンソールからも同じように見えることを確認します。
- CloudShell は開いたまま、上部の検索バーに
S3と入力し、表示された「S3」を選択します - 左側ナビゲーションの「汎用バケット」を選択し、バケットの一覧で
cli-handsonと入力して絞り込みます cli-handson-<アカウント ID>をクリックし、「オブジェクト」タブにhello.txtがあることを確認します
cli-handson-<アカウント ID> バケットを開き、「オブジェクト」タブに hello.txt が表示されている画面オブジェクトとバケットを削除する
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
何も表示されなければ削除できています。
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 の書き方です。
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 キーで終了します。