「AWS CLI、結局どのコマンドをどう打てばいいの?」——未経験〜駆け出しの方に向けて、AWS CLI v2 を前提に「やりたいこと→コマンド→注意点」で逆引きします。SSO 認証・出力整形・S3・EC2/VPC 調査・ログ追尾・踏み台レス接続まで、コピペで動く断片と早見表つき。

01なぜ CLI か — 再現性・自動化・調査の速さ

マネジメントコンソール(GUI)は、初めて触るサービスの探索や、画面で全体像をつかむのに向いています。一方 AWS CLI が強いのは、同じ操作を何度でも同じ手順で流せること(再現性)スクリプトに組み込めること(自動化)、そして grep や jq と組み合わせた調査の速さです。

この記事は AWS CLI v2 前提です。v2 は Python を同梱し、システムの Python に依存しません。SSO・自動補完・既定のページャなど新機能はすべて v2 側に入ります。v1 は 2026年7月15日にメンテナンスモード(新機能追加なし)へ入り、2027年7月15日にサポート終了予定なので、これから始めるなら v2 一択です。

現場のコツ:GUI と CLI は対立しません。探索や初回設定は GUI、繰り返す操作と破壊的操作は CLIと分けると、事故が減って速くなります。とくに削除・同期はまず --dryrun で。

02導入と認証 — v2 と IAM Identity Center

まず v2 を入れ、バージョンを確認します。

# バージョン確認(aws-cli/2.x なら v2)
aws --version
# 例: aws-cli/2.17.0 Python/3.11.9 Darwin/23.5.0 ...

認証は大きく3通り。おすすめは IAM Identity Center(旧 AWS SSO)です。期限付きの一時認証が自動更新され、長期アクセスキーを手元に置かずに済みます。

① IAM Identity Center(SSO):ウィザードで対話設定し、ログインします。

# 対話ウィザード(SSOセッション名/開始URL/リージョン/スコープを入力)
aws configure sso
#   SSO session name (Recommended): my-sso
#   SSO start URL [None]: https://my-sso-portal.awsapps.com/start
#   SSO region [None]: us-east-1
#   SSO registration scopes [None]: sso:account:access
#   → ブラウザが開き、アカウントとロールを選ぶ
#   → 既定リージョン・出力形式・プロファイル名を決める

# ログイン(ブラウザで承認。期限切れたら再実行)
aws sso login --profile my-dev-profile

# ログアウト(キャッシュした認証情報を削除)
aws sso logout

ウィザードが書き出す ~/.aws/config はこんな形です。sso-session を複数プロファイルで使い回せます。

[profile my-dev-profile]
sso_session = my-sso
sso_account_id = 123456789011
sso_role_name = ReadOnly
region = ap-northeast-1
output = json

[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_registration_scopes = sso:account:access

② プロファイルの明示③ 環境変数。どのアカウント/リージョンに対して打っているかを、常にはっきりさせます。

# コマンドごとにプロファイル・リージョンを明示
aws s3 ls --profile my-dev-profile --region ap-northeast-1

# 環境変数でまとめて指定(そのシェルの間ずっと有効)
export AWS_PROFILE=my-dev-profile
export AWS_REGION=ap-northeast-1
aws sts get-caller-identity   # 以後 --profile 省略でOK
IAM Identity Center は AWS CLI 2.22.0 以降、既定で PKCE 認可を使います(ブラウザのある端末向け)。ブラウザのない環境では aws sso login --use-device-code でデバイス認可に切り替えられます。
現場のコツ:長期アクセスキーはできるだけ使わない・作らない・置かない。使うとしてもソースコードや Git には絶対に入れないこと。SSO なら一時認証なので、漏れても短時間で失効します。

03出力を操る — output / query(JMESPath) / jq / pager

CLI の読みやすさは出力整形で決まります。まず --output の使い分けから。

--query(JMESPath)で、返ってきた結果から必要な列だけを抜き、名前も付け替えられます。

# InstanceId と状態と private IP だけを表で
aws ec2 describe-instances \
  --query 'Reservations[].Instances[].{Id:InstanceId,State:State.Name,IP:PrivateIpAddress}' \
  --output table

# text で1値だけ取り出してシェル変数へ
ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
echo "$ACCOUNT"

複雑な加工は json 出力 + jq が楽なこともあります。役割分担は「サーバ側で件数を減らす --filters → 見たい形に整える --queryjq」。

# json で出して jq に渡す(running のインスタンスIDを一覧)
aws ec2 describe-instances --output json \
  | jq -r '.Reservations[].Instances[] | select(.State.Name=="running") | .InstanceId'
v2 は出力を既定でページャ(less 等)に流します。スクリプトや CI で止まって困るときは --no-cli-pager を付けるか、export AWS_PAGER="" で無効化します。jq に渡すときも --no-cli-pager があると安全です。

04ユースケース:S3 — 一覧・コピー・同期・公開確認・容量

日々いちばん打つのは S3 でしょう。ls / cp / sync と、事故防止の --dryrun をセットで覚えます。

# 一覧(プレフィックス配下)
aws s3 ls s3://amzn-s3-demo-bucket/logs/

# コピー(ローカル→S3)
aws s3 cp ./report.csv s3://amzn-s3-demo-bucket/reports/

# 同期は必ず先に --dryrun で「何が起きるか」を確認してから
aws s3 sync ./dist s3://amzn-s3-demo-bucket/site --delete --dryrun
# 問題なければ --dryrun を外して実行

バケットが公開になっていないかの確認。ポリシー起因の公開判定は get-bucket-policy-statusIsPublic、アカウント/バケットのブロック設定は get-public-access-block で見ます。

# バケットポリシーによる公開判定(IsPublic: true なら公開)
aws s3api get-bucket-policy-status --bucket amzn-s3-demo-bucket
# → {"PolicyStatus": {"IsPublic": false}}

# パブリックアクセスブロックの状態
aws s3api get-public-access-block --bucket amzn-s3-demo-bucket

容量とオブジェクト数の把握は、再帰+サマリで。

aws s3 ls s3://amzn-s3-demo-bucket --recursive --summarize --human-readable
# 末尾に Total Objects と Total Size が出る
現場のコツ:sync --deleterm は取り返しがつきません。本番バケットでは --dryrun → 目視 → 実行を徹底し、対象バケット名を打つ前にもう一度読み返す癖を。

05ユースケース:EC2 / VPC 調査 — 必要な列だけ抜く

調査は「全部 JSON を眺める」のではなく、--filters で母数を絞り、--query で列を抜くのが基本です。

# 稼働中インスタンスの Id / 状態 / private IP / 名前タグ を表で
aws ec2 describe-instances \
  --filters "Name=instance-state-name,Values=running" \
  --query 'Reservations[].Instances[].{Id:InstanceId,State:State.Name,IP:PrivateIpAddress,Name:Tags[?Key==`Name`]|[0].Value}' \
  --output table

セキュリティグループの中身を確認するとき(インバウンドの穴を洗い出す)。

# SG のインバウンドを、ポートと許可元CIDRだけ抜いて確認
aws ec2 describe-security-groups \
  --group-ids sg-0123456789abcdef0 \
  --query 'SecurityGroups[].IpPermissions[].{From:FromPort,To:ToPort,Proto:IpProtocol,CIDR:IpRanges[].CidrIp}' \
  --output table
0.0.0.0/0 が SSH(22) や RDP(3389) に付いていないかは、この抜き方だと一目で分かります。棚卸しでは全 SG を回して jq0.0.0.0/0 を grep すると速いです。

06ユースケース:運用 — ログ追尾・踏み台レス接続・パラメータ

ログの追尾aws logs tail が便利。--follow で新着を流し続け、--since で開始時刻、--filter-pattern で絞れます。

# 直近を表示しつつ新着を追い続ける
aws logs tail /aws/lambda/my-func --follow

# 30分前から、短い書式で、ERROR を含む行だけ
aws logs tail /aws/lambda/my-func --since 30m --format short --filter-pattern "ERROR"
--since5m / 2h / 1d のような相対指定ができます(5h30m のような複合単位は不可)。--format は detailed(既定)/short/json。

踏み台(Bastion)レスの接続は Session Manager。SSH ポートを開けずにシェルへ入れます。

# インスタンスにシェル接続(22番ポート開放も鍵配布も不要)
aws ssm start-session --target i-0123456789abcdef0

使う前提は3つ。(1) 手元に Session Manager プラグインsession-manager-plugin)が入っていること(CLI 本体とは別インストール)。(2) 対象に SSM エージェントが動き、インスタンスプロファイルに AmazonSSMManagedInstanceCore が付いていること。(3) 自分に ssm:StartSession 権限があること。プライベートサブネットなら SSM 用 VPC エンドポイントも要ります。

設定値・機密の取得は Parameter Store。SecureString は --with-decryption で復号します。

# SecureString を復号して取得
aws ssm get-parameter --name /myapp/db/password --with-decryption \
  --query Parameter.Value --output text
現場のコツ:踏み台の設計・特権アクセスの考え方は、踏み台・特権アクセス設計の記事で詳しく扱っています。Session Manager でも「誰が・いつ・何をしたか」の記録と権限の絞り込みはセットで設計してください。

07ユースケース:本人確認・コスト・雛形

「いま自分は誰として叩いているか」の確認は、破壊的操作の前の儀式にしてください。

aws sts get-caller-identity
# → UserId / Account / Arn が返る。Account 番号とロール名を必ず目視

コストのさわりは Cost Explorer API。月次の発生コストをサービス別に集計できます(詳細な分析はコンソールの Cost Explorer が見やすい)。

# 今月の日次コストをサービス別に集計(さわり)
aws ce get-cost-and-usage \
  --time-period Start=2026-07-01,End=2026-07-16 \
  --granularity DAILY --metrics "UnblendedCost" \
  --group-by Type=DIMENSION,Key=SERVICE
Cost Explorer の API はリクエストごとに課金される(無料ではない)ので、ループで叩き過ぎないこと。使う前に Cost Explorer を有効化しておく必要があります。

コマンドの雛形--generate-cli-skeleton で。入力 JSON のひな形を出し、埋めてから --cli-input-json で流すと、複雑なコマンドを再現しやすくなります。

# 入力の雛形を JSON で出力
aws ec2 run-instances --generate-cli-skeleton input > run-instances.json
# 値を埋めてから流す(レビュー・再現がしやすい)
aws ec2 run-instances --cli-input-json file://run-instances.json

08事故らないコツ — 取り違え・破壊操作・権限

CLI は速い分、間違いも速く広がります。現場で効く順に。

複数アカウント・複数クラウドをまたぐ権限の統制は、CLI 単体ではなく組織設計の話になります。考え方は Entra × AWS の ID 統制で整理しています。ネットワークや権限の土台からやり直したい方は クラウドエンジニアの基礎(TCP/IP)もどうぞ。

現場のコツ:「本番でやらかす」の多くはプロファイル/リージョンの取り違えです。get-caller-identity と --profile 明示の2つだけでも、事故率は目に見えて下がります。

09早見表 — やりたいこと→コマンド 逆引き

コピペ用の逆引きです。<...> は自分の値に置き換えてください。

やりたいことコマンド
今どの権限で叩いているかaws sts get-caller-identity
SSO でログイン/ログアウトaws sso login --profile <p>aws sso logout
S3 の中身を一覧aws s3 ls s3://<bucket>/<prefix>/
S3 を同期(まず空実行)aws s3 sync <dir> s3://<bucket> --dryrun
S3 の容量・件数aws s3 ls s3://<bucket> --recursive --summarize --human-readable
バケットが公開かaws s3api get-bucket-policy-status --bucket <bucket>
稼働中の EC2 を絞って表示aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" --query '...'
SG のインバウンド確認aws ec2 describe-security-groups --group-ids <sg> --query '...'
ログを追尾aws logs tail <group> --follow --since 30m
踏み台レスで接続aws ssm start-session --target <i-id>
機密パラメータを復号取得aws ssm get-parameter --name <name> --with-decryption
コマンドの雛形を出すaws <cmd> --generate-cli-skeleton input

--query(JMESPath)の頻出パターンも小さくまとめます。

JMESPath意味
Reservations[].Instances[]ネストした配列を平坦化して並べる
[?State.Name==`running`]条件でフィルタ(バッククォートはリテラル)
[].{Id:InstanceId,IP:PrivateIpAddress}必要な列だけ抜き、名前を付け替える
Tags[?Key==`Name`]|[0].Value特定タグの値を1つ取り出す
sort_by(@, &LaunchTime)キーで並べ替える
length(Reservations[].Instances[])件数を数える
JMESPath とあわせて、シリーズの jq 実践リファレンス、日々のシェル操作は Linux 実践コマンドリファレンスも逆引きに使えます。

10よくある質問(FAQ)

AWS CLI は v1・v2 どちらを入れるべきですか?

新規は v2 一択です。v2 は Python を同梱していてシステムの Python に依存せず、SSO(IAM Identity Center)や自動補完、既定のページャなど新機能はすべて v2 に入ります。v1 は 2026年7月15日にメンテナンスモード(新機能追加なし・重大バグと脆弱性のみ対応)へ入り、2027年7月15日にサポート終了予定です。手元が v1 なら v2 へ移行してください。

長期のアクセスキーは使わないほうがいいですか?

可能なら避けてください。IAM Identity Center(aws configure ssoaws sso login)を使えば、期限付きの一時認証が自動で更新され、鍵の平文保管や漏洩のリスクを大きく下げられます。CI/CD からは、キーではなく IAM ロール(OIDC 連携など)を優先します。どうしてもアクセスキーを使う場合も、ソースコードや Git には絶対に置かないでください。

--filters と --query は何が違いますか?

--filters はサーバ側(AWS API)で絞り込み、転送量と件数を減らします。--query はクライアント側の JMESPath で、返ってきた結果から必要な列を抜いたり整形したりします。「まず --filters で母数を減らし、--query で見たい形にする」の順で組み合わせると速く読めます。

ssm start-session でつなげません。何を確認すべきですか?

3点を確認します。(1) 手元に Session Manager プラグインが入っているか(session-manager-plugin が必要。CLI 本体とは別途インストール)。(2) 対象インスタンスに SSM エージェントが動作し、インスタンスプロファイルに AmazonSSMManagedInstanceCore が付いているか。(3) 自分の IAM 権限に ssm:StartSession があり、対象がマネージドノードとして登録済みか。プライベートサブネットなら SSM 用の VPC エンドポイントも必要です。

EMW は札幌の AWS コンサルです。基礎を積む姿勢を大切にする仲間を探しています。採用情報・カジュアル面談はこちら

AWS の運用や調査を CLI で効率化したい、権限やアカウント設計から整えたい——そんなときは、基礎から現場運用まで EMW にご相談ください。

相談する
← ブログ一覧へ戻る