AWS CLI のコマンドは、どのサービスでも「aws サービス名 操作名 オプション」という同じ形をしています。 形が同じなので、サービスごとの操作名を一覧で押さえ、全サービス共通のオプション(--query や --output など)を覚えれば、初めて触るサービスでも同じ感覚で扱えます。

この記事は、よく使うコマンドをサービス別の「やりたいこと → コマンド」表にまとめた索引です。代表的なコマンドには実際に実行した出力を添え、共通オプションは1枚の早見表にしました。1行で打てるコマンドを中心に並べているので、必要な行をそのままコピーして使えます。

確認環境:Ubuntu 24.04、AWS CLI 1.46.1(Python 3.11)。AWS の API をローカルで再現するツール(moto 5.2.3)で実行しました。掲載するコマンドは接続先の指定を外し、実際の AWS でそのまま使える形にしています。出力に含まれる SQS の接続先ホスト名だけは AWS の形式に置き換えています。AWS CLI v2 で追加・変更された点は、公式ドキュメントを開いて確認した内容を出典つきで載せています。

AWS CLI コマンドの早見表(やりたいこと → コマンド)

まず使用頻度の高い20個です。サービスごとの詳しい表は後半にあります。

やりたいこと コマンド
いま使っているアカウントを確かめる aws sts get-caller-identity
バケットの一覧を見る aws s3 ls
ファイルをアップロードする aws s3 cp index.html s3://バケット名/
フォルダを差分だけ同期する aws s3 sync ./site s3://バケット名/site/
バケット内を再帰的に一覧する aws s3 ls s3://バケット名 --recursive --human-readable --summarize
インスタンスの一覧を表で見る aws ec2 describe-instances --query 'Reservations[].Instances[].[InstanceId,State.Name]' --output table
インスタンスを止める/起動する aws ec2 stop-instances --instance-ids ID / aws ec2 start-instances --instance-ids ID
止まるまで待つ aws ec2 wait instance-stopped --instance-ids ID
タグで絞り込む aws ec2 describe-instances --filters Name=tag:Env,Values=prod
IAM ユーザーの一覧を見る aws iam list-users --query 'Users[].UserName' --output text
ロールに付いたポリシーを見る aws iam list-attached-role-policies --role-name ロール名
ロールを引き受ける aws sts assume-role --role-arn ARN --role-session-name 名前
Lambda 関数のコードを更新する aws lambda update-function-code --function-name 関数名 --zip-file fileb://fn.zip
DynamoDB の項目を1件取る aws dynamodb get-item --table-name 表名 --key '{"id":{"S":"t-001"}}'
SQS にメッセージを送る aws sqs send-message --queue-url URL --message-body '本文'
ログを語句で検索する aws logs filter-log-events --log-group-name 名前 --filter-pattern ERROR
値を1つだけ取り出す --query 'パス' --output text を付ける
実行せずに権限と引数だけ確かめる(EC2) --dry-run を付ける
入力 JSON のひな形を出す --generate-cli-skeleton を付ける
何が送られたか調べる --debug を付ける

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「AWS CLIコマンド一覧|よく使うS3・EC2・IAM操作とオプション早見表」

コマンドの形と、ヘルプの出し方

aws [全体オプション] サービス名 操作名 [操作ごとのオプション]
部分 例 補足
サービス名 s3 ec2 iam sts lambda dynamodb sqs logs aws help で一覧
操作名 describe-instances list-users create-queue aws ec2 help で一覧
オプション --instance-ids i-xxxx --query ... aws ec2 describe-instances help で一覧

操作名には決まった型があります。一覧や詳細は describe / list / get、作成は create / put / run、変更は update / modify、削除は delete / terminate / remove で始まります。名前がうろ覚えでも、打ち間違えると候補が返ってきます。

$ aws ec2 describ-instances
…(省略)…
Invalid choice: 'describ-instances', maybe you meant:

  * describe-instances
  * describe-instance-types
  * describe-instance-status

全サービス共通のオプション早見表

どのサービスのコマンドにも付けられるオプションです。

オプション 役割 値・使い方
--profile 使う名前付きプロファイルを切り替える --profile dev
--region リクエスト先のリージョンをこの1回だけ変える --region us-west-2
--output 出力形式を変える json text table(v2 は yaml yaml-stream off も指定可)
--query 応答から必要な部分だけ取り出す(JMESPath) --query 'Buckets[].Name'
--no-cli-pager 出力をページャに通さない(v2) スクリプトや CI で付ける
--no-paginate 自動ページングを止め、最初の1ページだけ取る 件数の多い一覧の様子見に
--max-items 出力する件数を制限する 続きは --starting-token で取得
--page-size 1回の API 呼び出しで取る件数を小さくする 最終的な出力は同じ
--dry-run 実行せずに権限と引数を確かめる EC2 などの対応する操作のみ
--generate-cli-skeleton 入力 JSON のひな形を出力する 出力をファイルに保存して編集
--cli-input-json 引数を JSON ファイルからまとめて渡す --cli-input-json file://input.json
--cli-binary-format バイナリ引数の受け取り方を変える(v2) base64 または raw-in-base64-out
--debug 送受信の詳細をログに出す 原因調査に
--endpoint-url 接続先の URL を変える 検証用のローカル環境など
--no-sign-request 署名なしでリクエストする 公開バケットの参照など
--color 色付けを切り替える on off auto
--cli-read-timeout / --cli-connect-timeout 読み取り・接続の待ち時間(秒) 既定はどちらも 60
--version CLI のバージョンを表示する aws --version

--output:同じ結果を3つの形式で見る

$ aws ec2 describe-vpcs --query 'Vpcs[].{Id:VpcId,Cidr:CidrBlock,Default:IsDefault}'
[
    {
        "Id": "vpc-bb883f8685ff4c317",
        "Cidr": "172.31.0.0/16",
        "Default": true
    }
]

$ aws ec2 describe-vpcs --query 'Vpcs[].{Id:VpcId,Cidr:CidrBlock,Default:IsDefault}' --output text
172.31.0.0/16   True    vpc-bb883f8685ff4c317

$ aws ec2 describe-vpcs --query 'Vpcs[].{Id:VpcId,Cidr:CidrBlock,Default:IsDefault}' --output table
-------------------------------------------------------
|                    DescribeVpcs                     |
+----------------+----------+-------------------------+
|      Cidr      | Default  |           Id            |
+----------------+----------+-------------------------+
|  172.31.0.0/16 |  True    |  vpc-bb883f8685ff4c317  |
+----------------+----------+-------------------------+

text と table では、列がキー名のアルファベット順(Cidr → Default → Id)に並びます。 列の順番を決めたいときは、{...} ではなく [VpcId,CidrBlock,IsDefault] のように配列で指定します。シェル変数に入れるなら --output text、目で確かめるなら --output table が向いています。

目的 形式
他のプログラムや jq に渡す json
シェル変数に入れる、for で回す text
画面で見比べる、手順書に貼る table

--query:欲しい値だけ取り出す

$ aws sts get-caller-identity --query Account --output text
123456789012

$ aws ec2 describe-instances \
    --query 'Reservations[].Instances[].[InstanceId,InstanceType,State.Name,Tags[?Key==`Name`]|[0].Value]' \
    --output table
-------------------------------------------------------
|                  DescribeInstances                  |
+----------------------+-----------+----------+-------+
|  i-c0070a52d972c28a0 |  t3.micro |  running |  web  |
|  i-f570f65f321f341fc |  t3.micro |  running |  web  |
+----------------------+-----------+----------+-------+

--filters は AWS 側で絞り込むオプション、--query は返ってきた応答を手元で整形するオプションです。件数を減らすのは --filters、列を選ぶのは --query と役割を分けると、速くて読みやすいコマンドになります。

--dry-run:実行せずに確かめる

$ aws ec2 stop-instances --instance-ids i-c0070a52d972c28a0 --dry-run

An error occurred (DryRunOperation) when calling the StopInstances operation: Request would have succeeded, but DryRun flag is set.

DryRunOperation は「このまま実行すれば通る」という合図です。 エラーの形で返るので終了コードは 0 以外になります。

--generate-cli-skeleton と --cli-input-json:引数をファイルにする

オプションが多い操作は、ひな形を出してファイルで渡すと、履歴に残せて見直しもしやすくなります。

$ aws sqs create-queue --generate-cli-skeleton
{
    "QueueName": "",
    "Attributes": {
        "KeyName": ""
    },
    "tags": {
        "KeyName": ""
    }
}

次の msg.json を用意して渡します。

{
    "QueueUrl": "https://sqs.ap-northeast-1.amazonaws.com/123456789012/jobs",
    "MessageBody": "{\"task\":\"report\"}",
    "DelaySeconds": 0
}
$ aws sqs send-message --cli-input-json file://msg.json --query MessageId --output text
6b10f513-eb49-4aab-b4be-2b4131978e13

同じ項目をコマンドラインでも指定すると、コマンドラインの値が使われます。 下の例では、返ってきた MD5 が override という文字列の MD5 と一致しました。

$ aws sqs send-message --cli-input-json file://msg.json --message-body override --query MD5OfMessageBody --output text
e3b3f56615d1e5f2608d2f1130a7ef54

$ echo -n override | md5sum
e3b3f56615d1e5f2608d2f1130a7ef54  -

自動ページングと --max-items・--starting-token

AWS CLI は、一覧系の操作で続きのページがあると自動で取りにいき、全件をまとめて出力します。件数を区切りたいときは --max-items を使います。

$ aws s3api list-objects-v2 --bucket rjc-demo-bucket --query 'length(Contents)'
5

$ aws s3api list-objects-v2 --bucket rjc-demo-bucket --max-items 2 --query '{Keys:Contents[].Key,NextToken:NextToken}'
{
    "Keys": [
        "logs/f1.txt",
        "logs/f2.txt"
    ],
    "NextToken": "eyJDb250aW51YXRpb25Ub2tlbiI6IG51bGwsICJib3RvX3RydW5jYXRlX2Ftb3VudCI6IDJ9"
}

$ aws s3api list-objects-v2 --bucket rjc-demo-bucket --max-items 2 \
    --starting-token eyJDb250aW51YXRpb25Ub2tlbiI6IG51bGwsICJib3RvX3RydW5jYXRlX2Ftb3VudCI6IDJ9 \
    --query 'Contents[].Key' --output text
logs/f3.txt logs/f4.txt
None

2回目の出力の末尾にある None は、text 形式がページごとに --query を評価するために出る行です。件数を区切って取るときは --output json にすると扱いやすくなります。

オプション API 呼び出し 出力される件数
なし 続きがある限り自動で繰り返す 全件
--page-size 2 2件ずつ、回数が増える 全件(上の例でも 5)
--max-items 2 必要な分だけ 2件と NextToken
--no-paginate 1回だけ 最初の1ページ分

file:// と fileb://:ファイルから値を渡す

書き方 中身の扱い 例
file://policy.json テキスト(JSON など) --policy-document file://policy.json
fileb://fn.zip バイナリ --zip-file fileb://fn.zip
file:///tmp/policy.json 絶対パスはスラッシュ3つ --filters file:///tmp/filter.json
$ aws iam create-policy --policy-name s3-read --policy-document file://pol.json --query Policy.Arn --output text
arn:aws:iam::123456789012:policy/s3-read

$ aws lambda create-function --function-name hello --runtime python3.13 --handler app.handler \
    --role arn:aws:iam::123456789012:role/app-role --zip-file fileb://fn.zip \
    --query '[FunctionName,Runtime,State]' --output text
hello   python3.13  Active

wait:状態が変わるまで待つ

wait は、対象が目的の状態になるまで一定間隔で確認を繰り返し、到達したら何も出力せずに終了コード 0 で戻ります。スクリプトで「止めてから次へ進む」を書くときに使います。

$ aws ec2 stop-instances --instance-ids i-c0070a52d972c28a0 --query 'StoppingInstances[].CurrentState.Name' --output text
stopping

$ aws ec2 wait instance-stopped --instance-ids i-c0070a52d972c28a0
$ echo $?
0
サービス よく使う wait
EC2 aws ec2 wait instance-running / instance-stopped
DynamoDB aws dynamodb wait table-exists --table-name 表名

存在しない ID を指定すると、条件を満たすまで確認を繰り返してから戻るため、時間がかかります。ID を変数に入れた直後は echo で中身を確かめてから wait に渡すと安心です。

--debug:送った内容を確かめる

$ aws sts get-caller-identity --debug 2>&1 | grep -E 'CLI version|Making request'
2026-10-05 15:06:32,662 - MainThread - awscli.clidriver - DEBUG - CLI version: aws-cli/1.46.1 Python/3.11.15 Linux/6.18.44-fc-v70 botocore/1.43.62
2026-10-05 15:06:32,814 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=GetCallerIdentity) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', …(省略)…

デバッグログは標準エラーに出ます。認証情報の読み込み元、送信した URL とパラメータ、応答ヘッダーまで確認できます。

STS:いま誰として実行しているかを確かめる

やりたいこと コマンド
アカウント ID だけ取り出す aws sts get-caller-identity --query Account --output text
呼び出し元の ARN を見る aws sts get-caller-identity --query Arn --output text
ロールを引き受ける aws sts assume-role --role-arn ARN --role-session-name demo
一時的な認証情報を取る aws sts get-session-token
$ aws sts assume-role --role-arn arn:aws:iam::123456789012:role/app-role --role-session-name demo \
    --query 'AssumedRoleUser.Arn' --output text
arn:aws:sts::123456789012:assumed-role/app-role/demo

作業を始める前に get-caller-identity でアカウントを確かめる習慣を付けると、プロファイルの取り違えにすぐ気づけます。

S3:バケットとオブジェクトの操作

aws s3 はファイル操作に近い高水準コマンド、aws s3api は API を1つずつ呼ぶコマンドです。

やりたいこと コマンド
バケットを作る aws s3 mb s3://バケット名
バケットの一覧 aws s3 ls
中身の一覧 aws s3 ls s3://バケット名/logs/
アップロード aws s3 cp index.html s3://バケット名/
ダウンロード aws s3 cp s3://バケット名/index.html .
中身を画面に出す aws s3 cp s3://バケット名/logs/f2.txt -
フォルダを同期する aws s3 sync ./site s3://バケット名/site/
移動・名前変更 aws s3 mv s3://バケット名/logs/f1.txt s3://バケット名/archive/f1.txt
削除(配下をまとめて) aws s3 rm s3://バケット名/site/ --recursive
バケットを中身ごと消す aws s3 rb s3://バケット名 --force
期限付きの URL を発行する aws s3 presign s3://バケット名/index.html --expires-in 600
バケット名だけ取り出す aws s3api list-buckets --query 'Buckets[].Name' --output text
オブジェクトの属性を見る aws s3api head-object --bucket バケット名 --key index.html
バージョニングを有効にする aws s3api put-bucket-versioning --bucket バケット名 --versioning-configuration Status=Enabled
$ aws s3 mb s3://rjc-demo-bucket
make_bucket: rjc-demo-bucket

$ aws s3 cp site/index.html s3://rjc-demo-bucket/
upload: site/index.html to s3://rjc-demo-bucket/index.html

$ aws s3 sync site s3://rjc-demo-bucket/site/
upload: site/app.css to s3://rjc-demo-bucket/site/app.css
upload: site/index.html to s3://rjc-demo-bucket/site/index.html

$ aws s3 ls s3://rjc-demo-bucket --recursive --human-readable --summarize
2026-10-05 15:00:43    6 Bytes index.html
2026-10-05 15:00:45    5 Bytes site/app.css
2026-10-05 15:00:45    6 Bytes site/index.html

Total Objects: 3
   Total Size: 17 Bytes

$ aws s3api get-bucket-versioning --bucket rjc-demo-bucket
{
    "Status": "Enabled"
}

中身が残っているバケットに rb を実行すると、次のように止まります。--force を付けると中身を消してからバケットを削除します。

$ aws s3 rb s3://rjc-demo-bucket
remove_bucket failed: s3://rjc-demo-bucket An error occurred (BucketNotEmpty) when calling the DeleteBucket operation: The bucket you tried to delete is not empty

EC2:インスタンスとネットワークの操作

やりたいこと コマンド
インスタンスを起動する aws ec2 run-instances --image-id AMI --instance-type t3.micro --count 1
一覧(ID と状態) aws ec2 describe-instances --query 'Reservations[].Instances[].[InstanceId,State.Name]' --output text
動いているものだけ aws ec2 describe-instances --filters Name=instance-state-name,Values=running
タグで絞る aws ec2 describe-instances --filters Name=tag:Env,Values=prod
停止 aws ec2 stop-instances --instance-ids ID
起動 aws ec2 start-instances --instance-ids ID
終了(削除) aws ec2 terminate-instances --instance-ids ID
インスタンスタイプの仕様 aws ec2 describe-instance-types --instance-types t3.micro
セキュリティグループを作る aws ec2 create-security-group --group-name web-sg --description web
受信ルールを足す aws ec2 authorize-security-group-ingress --group-id SG --protocol tcp --port 443 --cidr 0.0.0.0/0
セキュリティグループの一覧 aws ec2 describe-security-groups --query 'SecurityGroups[].[GroupId,GroupName]' --output text
VPC・サブネットの一覧 aws ec2 describe-vpcs / aws ec2 describe-subnets
キーペアを作る aws ec2 create-key-pair --key-name demo-key
リージョン名の一覧 aws ec2 describe-regions --query 'Regions[].RegionName' --output text
アベイラビリティーゾーンの一覧 aws ec2 describe-availability-zones --query 'AvailabilityZones[].ZoneName' --output text
$ aws ec2 run-instances --image-id ami-03cf127a --instance-type t3.micro --count 2 \
    --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=web},{Key=Env,Value=dev}]' \
    --query 'Instances[].InstanceId' --output text
i-c0070a52d972c28a0 i-f570f65f321f341fc

$ aws ec2 stop-instances --instance-ids i-c0070a52d972c28a0
{
    "StoppingInstances": [
        {
            "InstanceId": "i-c0070a52d972c28a0",
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}

$ aws ec2 describe-instances --filters Name=instance-state-name,Values=running \
    --query 'Reservations[].Instances[].InstanceId' --output text
i-f570f65f321f341fc

$ aws ec2 describe-instance-types --instance-types t3.micro \
    --query 'InstanceTypes[].[InstanceType,VCpuInfo.DefaultVCpus,MemoryInfo.SizeInMiB]' --output text
t3.micro    2   1024

$ aws ec2 describe-subnets --query 'Subnets[].[SubnetId,AvailabilityZone,CidrBlock]' --output text
subnet-e7976292ff65fe029    ap-northeast-1a 172.31.0.0/20
subnet-4727f4cd37802c73d    ap-northeast-1c 172.31.16.0/20
subnet-9b93bbeacaaff366a    ap-northeast-1d 172.31.32.0/20

$ aws ec2 describe-availability-zones --region us-west-2 --query 'AvailabilityZones[].ZoneName' --output text
us-west-2a  us-west-2b  us-west-2c  us-west-2d

最後の例のように、--region を付けるとその1回だけ別のリージョンに問い合わせます。

IAM:ユーザー・ロール・ポリシーの操作

やりたいこと コマンド
ユーザーを作る aws iam create-user --user-name deploy-bot
ユーザーの一覧 aws iam list-users --query 'Users[].[UserName,Arn]' --output text
グループを作ってユーザーを入れる aws iam create-group --group-name developers → aws iam add-user-to-group --group-name developers --user-name deploy-bot
ユーザーの所属グループ aws iam list-groups-for-user --user-name deploy-bot
アクセスキーを発行する aws iam create-access-key --user-name deploy-bot
アクセスキーの一覧と状態 aws iam list-access-keys --user-name deploy-bot
ロールを作る aws iam create-role --role-name app-role --assume-role-policy-document file://trust.json
ロールの一覧 aws iam list-roles --query 'Roles[].[RoleName,Arn]' --output text
ロールの信頼ポリシーを見る aws iam get-role --role-name app-role --query Role.AssumeRolePolicyDocument
管理ポリシーをロールに付ける aws iam attach-role-policy --role-name app-role --policy-arn ARN
ロールに付いた管理ポリシー aws iam list-attached-role-policies --role-name app-role
インラインポリシーを書き込む aws iam put-role-policy --role-name app-role --policy-name s3-read --policy-document file://pol.json
インラインポリシーの名前一覧 aws iam list-role-policies --role-name app-role
自作の管理ポリシーを作る aws iam create-policy --policy-name s3-read --policy-document file://pol.json
管理ポリシーをユーザーに付ける aws iam attach-user-policy --user-name deploy-bot --policy-arn ARN
アカウント全体の数を見る aws iam get-account-summary
$ aws iam create-role --role-name app-role \
    --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"},"Action":"sts:AssumeRole"}]}' \
    --query Role.Arn --output text
arn:aws:iam::123456789012:role/app-role

$ aws iam attach-role-policy --role-name app-role \
    --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

$ aws iam list-attached-role-policies --role-name app-role
{
    "AttachedPolicies": [
        {
            "PolicyName": "AWSLambdaBasicExecutionRole",
            "PolicyArn": "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
        }
    ]
}

$ aws iam put-role-policy --role-name app-role --policy-name s3-read --policy-document file://pol.json

$ aws iam list-role-policies --role-name app-role
{
    "PolicyNames": [
        "s3-read"
    ]
}

$ aws iam list-groups-for-user --user-name deploy-bot --query 'Groups[].GroupName' --output text
developers

$ aws iam get-account-summary --query 'SummaryMap.[Users,Roles,Groups]' --output text
1   1   1

attach-role-policy や put-role-policy のように、成功しても何も出力しない操作があります。結果は対になる list / get の操作で確かめます。IAM はグローバルなサービスなので、--region の指定に関係なく同じ結果が返ります。

Lambda:関数の作成・更新・設定

やりたいこと コマンド
関数を作る aws lambda create-function --function-name hello --runtime python3.13 --handler app.handler --role ロールARN --zip-file fileb://fn.zip
関数の一覧 aws lambda list-functions --query 'Functions[].[FunctionName,Runtime]' --output text
コードを更新する aws lambda update-function-code --function-name hello --zip-file fileb://fn.zip
設定を変える aws lambda update-function-configuration --function-name hello --timeout 30 --memory-size 256
環境変数を設定する aws lambda update-function-configuration --function-name hello --environment 'Variables={STAGE=dev}'
設定を見る aws lambda get-function-configuration --function-name hello
関数を呼び出す aws lambda invoke --function-name hello --payload '{}' out.json
関数を消す aws lambda delete-function --function-name hello
$ aws lambda update-function-code --function-name hello --zip-file fileb://fn.zip --query CodeSha256 --output text
PyT+b6EPhmYPnNsQCcjzlZ0eBpFd1GdOR3oHaO+XqUU=

$ aws lambda update-function-configuration --function-name hello --timeout 30 --memory-size 256 \
    --environment 'Variables={STAGE=dev}' --query '[Timeout,MemorySize]' --output text
30  256

$ aws lambda get-function-configuration --function-name hello --query 'Environment.Variables'
{
    "STAGE": "dev"
}

--zip-file はバイナリを受け取る引数なので fileb:// で渡します。invoke の --payload もバイナリ型の引数です。AWS CLI v2 はバイナリ型の引数を base64 の文字列として受け取るのが既定なので、JSON をそのまま書くときは --cli-binary-format raw-in-base64-out を付けます。

DynamoDB:テーブルと項目の操作

やりたいこと コマンド
テーブルを作る aws dynamodb create-table --table-name Tasks --attribute-definitions AttributeName=id,AttributeType=S --key-schema AttributeName=id,KeyType=HASH --billing-mode PAY_PER_REQUEST
テーブルの一覧 aws dynamodb list-tables
テーブルの状態と件数 aws dynamodb describe-table --table-name Tasks
項目を書き込む aws dynamodb put-item --table-name Tasks --item file://item.json
キーで1件取る aws dynamodb get-item --table-name Tasks --key '{"id":{"S":"t-001"}}'
キー条件で検索する aws dynamodb query --table-name Tasks --key-condition-expression 'id = :i' --expression-attribute-values '{":i":{"S":"t-002"}}'
全件を読む aws dynamodb scan --table-name Tasks
一部の属性を更新する aws dynamodb update-item --table-name Tasks --key ... --update-expression 'SET done = :d' --expression-attribute-values ...
項目を消す aws dynamodb delete-item --table-name Tasks --key '{"id":{"S":"t-002"}}'
$ aws dynamodb put-item --table-name Tasks \
    --item '{"id":{"S":"t-001"},"title":{"S":"備品の発注"},"done":{"BOOL":false}}'

$ aws dynamodb get-item --table-name Tasks --key '{"id":{"S":"t-001"}}'
{
    "Item": {
        "id": {
            "S": "t-001"
        },
        "title": {
            "S": "備品の発注"
        },
        "done": {
            "BOOL": false
        }
    }
}

$ aws dynamodb scan --table-name Tasks --query 'Items[].[id.S,title.S,done.BOOL]' --output text
t-001   備品の発注   False
t-002   議事録の共有  True

$ aws dynamodb update-item --table-name Tasks --key '{"id":{"S":"t-001"}}' \
    --update-expression 'SET done = :d' --expression-attribute-values '{":d":{"BOOL":true}}' \
    --return-values UPDATED_NEW --query Attributes
{
    "done": {
        "BOOL": true
    }
}

値は {"S":"文字列"} {"N":"123"} {"BOOL":true} のように型を付けて書きます。--query 'Items[].[id.S,title.S]' のように型の部分までたどると、表形式で読みやすくなります。

SQS:キューとメッセージの操作

やりたいこと コマンド
キューを作る aws sqs create-queue --queue-name jobs
キューの URL を調べる aws sqs get-queue-url --queue-name jobs --query QueueUrl --output text
キューの一覧 aws sqs list-queues
送信 aws sqs send-message --queue-url URL --message-body '本文'
受信 aws sqs receive-message --queue-url URL --max-number-of-messages 1 --wait-time-seconds 1
処理済みのメッセージを消す aws sqs delete-message --queue-url URL --receipt-handle 受信ハンドル
たまっている件数を見る aws sqs get-queue-attributes --queue-url URL --attribute-names ApproximateNumberOfMessages
キューを空にする aws sqs purge-queue --queue-url URL
キューを消す aws sqs delete-queue --queue-url URL
$ aws sqs create-queue --queue-name jobs
{
    "QueueUrl": "https://sqs.ap-northeast-1.amazonaws.com/123456789012/jobs"
}

$ QUEUE_URL=$(aws sqs get-queue-url --queue-name jobs --query QueueUrl --output text)

$ aws sqs send-message --queue-url "$QUEUE_URL" --message-body '{"task":"resize","id":42}'
{
    "MD5OfMessageBody": "8299aa6f3dbddd3aed051cab04a12c17",
    "MessageId": "940aaafe-0220-4988-a06b-68f91536b2ec"
}

$ aws sqs get-queue-attributes --queue-url "$QUEUE_URL" --attribute-names ApproximateNumberOfMessages
{
    "Attributes": {
        "ApproximateNumberOfMessages": "1"
    }
}

$ aws sqs receive-message --queue-url "$QUEUE_URL" --max-number-of-messages 1 --wait-time-seconds 1
{
    "Messages": [
        {
            "MessageId": "940aaafe-0220-4988-a06b-68f91536b2ec",
            "ReceiptHandle": "hoepgikymsryuawxrchmctfsjclk…(省略)…",
            "MD5OfBody": "8299aa6f3dbddd3aed051cab04a12c17",
            "Body": "{\"task\":\"resize\",\"id\":42}"
        }
    ]
}

受信しただけではメッセージは消えません。処理が終わったら、受信時の ReceiptHandle を delete-message に渡して削除します。

CloudWatch Logs:ロググループと検索

やりたいこと コマンド
ロググループを作る aws logs create-log-group --log-group-name /app/web
保持期間を決める aws logs put-retention-policy --log-group-name /app/web --retention-in-days 30
ロググループの一覧 aws logs describe-log-groups --query 'logGroups[].[logGroupName,retentionInDays]' --output text
ストリームの一覧 aws logs describe-log-streams --log-group-name /app/web
語句で検索する aws logs filter-log-events --log-group-name /app/web --filter-pattern ERROR
1つのストリームを読む aws logs get-log-events --log-group-name /app/web --log-stream-name s1
流れるログを追いかける(v2) aws logs tail /app/web --follow --since 10m
ロググループを消す aws logs delete-log-group --log-group-name /app/web
$ aws logs describe-log-groups --query 'logGroups[].[logGroupName,retentionInDays]' --output text
/app/web    30

$ aws logs filter-log-events --log-group-name /app/web --filter-pattern ERROR --query 'events[].message' --output text
ERROR timeout id=42

$ aws logs get-log-events --log-group-name /app/web --log-stream-name s1 --query 'events[].message'
[
    "INFO start",
    "ERROR timeout id=42",
    "INFO done"
]

aws logs tail は AWS CLI v2 のコマンドです。公式リファレンスによると、--since は 5m や 1h のような相対時間(単位は s・m・h・d・w のいずれか1つ)か ISO 8601 の時刻で指定し、省略すると10分前から表示します。--follow を付けると新しいログを待ち続け、--format は detailed(既定)・short・json から選べます。v1 で実行すると Invalid choice と表示されるので、その場合は filter-log-events を使います。

そのほかのサービス(1行で使うコマンド)

サービス やりたいこと コマンド
CloudWatch カスタムメトリクスを送る aws cloudwatch put-metric-data --namespace App --metric-name Orders --value 3
CloudWatch メトリクスの一覧 aws cloudwatch list-metrics --namespace App
SNS トピックを作る aws sns create-topic --name notify
SNS トピックの一覧 aws sns list-topics --query 'Topics[].TopicArn' --output text
SSM パラメータを保存する aws ssm put-parameter --name /app/db/host --value db.example.internal --type String
SSM パラメータの値を取る aws ssm get-parameter --name /app/db/host --query Parameter.Value --output text
Secrets Manager シークレットを作る aws secretsmanager create-secret --name app/api-key --secret-string 値
Secrets Manager シークレットの値を取る aws secretsmanager get-secret-value --secret-id app/api-key --query SecretString --output text
$ aws ssm get-parameter --name /app/db/host --query Parameter.Value --output text
db.example.internal

$ aws sns create-topic --name notify
{
    "TopicArn": "arn:aws:sns:ap-northeast-1:123456789012:notify"
}

AWS CLI v1 と v2 で変わる点

公式の移行ガイドに載っている違いのうち、日常の操作に関わるものです。

項目 v1 v2
出力のページャ 使わない 既定で OS のページャ(Linux・macOS は less、Windows は more)に通す
ページャを止める方法 不要 --no-cli-pager、環境変数 AWS_PAGER=""、設定 cli_pager=(空)
バイナリ型の引数 そのままの値を渡す base64 の文字列が既定。--cli-binary-format raw-in-base64-out で v1 と同じ扱いになる
日時の出力 API が返した形のまま 既定で ISO 8601 形式
--output json text table yaml yaml-stream off も指定可
http:// で始まる引数の値 URL の中身を取得して値に使う 取得しない(file:// で渡す)
aws logs tail なし あり
終了コード 0・1・2・130・255 252(引数の誤り)・253(設定や認証情報の不足)・254(サービスからのエラー)が加わる
aws ecr get-login あり aws ecr get-login-password に置き換え

手元の v1(1.46.1)で v2 のオプションを付けると、次のように表示されました。CI と手元でバージョンが違うときの手がかりになります。

$ aws s3api list-objects-v2 --bucket rjc-demo-bucket --no-cli-pager
…(省略)…
Unknown options: --no-cli-pager

$ aws s3api list-objects-v2 --bucket rjc-demo-bucket --output yaml
…(省略)…
aws: error: argument --output: Invalid choice, valid choices are:

json                                     | text
table

スクリプトや CI で v2 を使うときは、export AWS_PAGER="" を先頭に書いておくと、出力待ちで止まることがなくなります。

よく出るエラー文と終了コード

表示されたメッセージ 原因 対処
Invalid choice: 'describ-instances', maybe you meant: 操作名の打ち間違い 候補から選び直す。aws ec2 help で一覧
aws: error: the following arguments are required: --message-body 必須オプションの不足 表示されたオプションを足す
Parameter validation failed: Invalid length for parameter AccessKeyId, value: 8, valid min length: 16 値の長さや型が仕様と違う(送信前に CLI が検査) 値を見直す
The config profile (nobody) could not be found --profile の名前が設定にない 設定ファイルのプロファイル名を見直し、aws configure list --profile 名前 で確認
An error occurred (NoSuchBucket) when calling the ListObjectsV2 operation: The specified bucket does not exist バケット名の誤り、または別アカウント aws s3 ls と get-caller-identity で確認
An error occurred (InvalidInstanceID.NotFound) when calling the DescribeInstances operation: The instance ID 'i-0000000000000000a' does not exist ID の誤り、または別リージョン --region を確認
An error occurred (NoSuchEntity) when calling the GetUser operation: The user with name nobody cannot be found. IAM の名前の誤り aws iam list-users で確認
An error occurred (ResourceNotFoundException) when calling the DescribeTable operation テーブル名の誤り、または別リージョン aws dynamodb list-tables で確認
An error occurred (DryRunOperation) ... Request would have succeeded, but DryRun flag is set. --dry-run が成功した合図 --dry-run を外して実行

サービスが返すエラーは「An error occurred (エラーコード) when calling the 操作名 operation: 説明」の形で統一されています。 かっこの中のエラーコードで検索すると、原因にたどり着きやすくなります。

終了コードは echo $? で確かめられます。手元の v1 では、引数の解析で止まると 2、サービスからのエラーは 255 でした。v2 の公式ドキュメントでは次のように定義されています。

終了コード 意味
0 成功
1 S3 の転送で、1つ以上の操作が完了しなかった
2 コマンドを解析できなかった。S3 では一部のファイルを飛ばした場合も 2
130 Ctrl+C で中断した
252 構文や引数の値に誤りがあり、実行に進めなかった
253 設定や認証情報が足りず、実行に進めなかった
254 リクエストは送られたが、サービスがエラーを返した
255 そのほかのエラー

よくある質問

Q. aws s3 と aws s3api はどちらを使えばよいですか? A. ファイルのコピーや同期は aws s3(cp・sync・mv・rm)が手軽です。バージョニングやタグ、属性の取得のようにバケットやオブジェクトの設定を細かく扱うときは aws s3api を使います。

Q. コマンドの結果をシェル変数に入れるには? A. --query で値を1つに絞り、--output text を付けます。例:ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)。JSON のままだと引用符が付くため、変数に入れるときは text が扱いやすいです。

Q. 出力の途中で画面が止まり、q を押さないと戻りません。 A. AWS CLI v2 が出力をページャに通しているためです。その1回だけなら --no-cli-pager、常に止めたいなら環境変数 AWS_PAGER="" か、設定ファイルの cli_pager= を空にします。

Q. 一覧が途中までしか出ていない気がします。 A. AWS CLI は既定で続きのページを自動で取得するので、--max-items や --no-paginate を付けていなければ全件が返ります。サービス独自の件数指定(S3 の --max-keys など)を付けた場合は、その件数で止まります。

まとめ

  • コマンドの形は「aws サービス名 操作名 オプション」で共通。操作名は describe / list / get、create / put、update、delete の型で探せる。
  • --query と --output text の組み合わせで、値を1つだけ取り出してシェル変数に入れられる。
  • --filters は AWS 側での絞り込み、--query は手元での整形。役割を分けると速く読みやすい。
  • --generate-cli-skeleton でひな形を作り、--cli-input-json file:// で渡すと、長い引数を履歴に残せる。
  • --dry-run の DryRunOperation は成功の合図。wait は状態が変わるまで待ってくれる。
  • バイナリは fileb://、テキストは file://。v2 では JSON をそのまま渡すバイナリ引数に --cli-binary-format raw-in-base64-out を付ける。
  • v2 は出力をページャに通す。スクリプトでは AWS_PAGER="" を設定しておく。

参考・出典

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「AWS CLIコマンド一覧|よく使うS3・EC2・IAM操作とオプション早見表」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?