- AWS
AWS CLIコマンド一覧|よく使うS3・EC2・IAM操作とオプション早見表
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=""を設定しておく。
参考・出典
- AWS CLI ユーザーガイド:Command line options
- AWS CLI ユーザーガイド:Using the pagination options
- AWS CLI ユーザーガイド:Loading parameters from a file
- AWS CLI ユーザーガイド:New features and changes in AWS CLI version 2
- AWS CLI ユーザーガイド:Command line return codes
- AWS CLI コマンドリファレンス:logs tail
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社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期連続の黒字決算。