AWS CLI v2 Operations
Guidance for using the AWS Command Line Interface effectively and safely.
Current version: AWS CLI v2 is in the 2.33.x range. CLI v1 enters maintenance mode July 15, 2026 and reaches end of support July 15, 2027. All guidance here targets v2.
Pre-Flight: Always Verify Context
Before executing ANY AWS CLI command, verify identity and region:
aws sts get-caller-identity
aws configure get region
Never assume which account or region is active. Environment variables, profile defaults, and SSO sessions can all silently change the target.
Core Principles
- Verify before mutating — Always
get-caller-identitybefore write/delete operations - Dry-run first — Use
--dry-run(EC2) or--dryrun(S3) before destructive actions - Query server-side — Use
--query(JMESPath) and--filtersto reduce response size - Disable pager in scripts — Set
AWS_PAGER=""or--no-cli-pager; v2 enables pager by default which blocks scripts - Script with
textoutput — Use--output textfor pipeable, scriptable results - Pin profiles explicitly — Always pass
--profileand--regionin scripts; never rely on environment defaults - Paginate consciously — CLI v2 auto-paginates; use
--no-paginateor--max-itemswhen you need control - Use
aws loginor SSO —aws login(v2.32.0+) is the simplest browser-based auth;aws configure ssofor org-managed Identity Center; IAM roles for machines; long-term keys as last resort
Essential Command Patterns
Resource Discovery
# List all EC2 instances with name, type, state as table
aws ec2 describe-instances \
--query 'Reservations[].Instances[].{Name:Tags[?Key==`Name`].Value|[0],ID:InstanceId,Type:InstanceType,State:State.Name}' \
--output table
# Find resources by tag across all services
aws resourcegroupstaggingapi get-resources \
--tag-filters Key=Environment,Values=production
# List S3 buckets with creation dates
aws s3api list-buckets --query 'Buckets[].{Name:Name,Created:CreationDate}' --output table
Safe Mutation Pattern
# Step 1: Verify identity
ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
REGION=$(aws configure get region)
echo "Account: $ACCOUNT Region: $REGION"
# Step 2: Dry-run the operation
aws ec2 run-instances --image-id ami-xxx --instance-type t3.micro \
--region "$REGION" --dry-run
# Step 3: Execute with minimal scope
aws ec2 run-instances --image-id ami-xxx --instance-type t3.micro --count 1 \
--region "$REGION" \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=my-instance}]'
Credential Management
aws login # browser-based (v2.32.0+, simplest)
aws login --remote # headless/SSH
aws configure sso # org-managed Identity Center
aws sso login --profile my-profile # refresh SSO session
aws sts assume-role --role-arn ARN --role-session-name s --query Credentials # cross-account
aws login auto-refreshes every 15 min (up to 12h), caches at ~/.aws/login/cache. Requires SignInLocalDevelopmentAccess managed policy. Remove any ~/.aws/credentials entries that might override login creds.
For full credential chain resolution, SSO session sharing, [sso-session] config, assumed-role export patterns, and credential gotchas, see references/advanced-patterns.md#credential-chain-and-profiles.
S3 Operations
aws s3 sync ./local s3://bucket/prefix --dryrun # always dry-run first
aws s3 sync ./local s3://bucket/prefix --delete # mirror mode
aws s3 cp large.zip s3://bucket/ --expected-size BYTES # large file upload
aws s3 sync . s3://bucket --exclude "*.log" --exclude ".git/*"
For CRT transfer client (2-6x throughput), transfer acceleration, multipart tuning, --no-overwrite (v2.32.0+), and --case-conflict (v2.33+), see references/advanced-patterns.md#s3-transfer-optimization.
Waiting for Resources
aws ec2 wait instance-running --instance-ids i-xxx
aws cloudformation wait stack-create-complete --stack-name my-stack
aws rds wait db-instance-available --db-instance-identifier mydb
Waiters timeout after ~10 min and return exit code 255. For advanced waiter patterns and chaining, see references/advanced-patterns.md#waiter-patterns.
Output and Filtering
--query (JMESPath) vs --filters
| Feature | --filters |
--query |
|---|---|---|
| Where it runs | Server-side (API) | Client-side (CLI) |
| Reduces API data | Yes | No |
| Syntax | Name=X,Values=Y |
JMESPath expressions |
| Combining | Use both together for best performance | Shapes output after filtering |
Best practice: Filter server-side with --filters, then shape output with --query:
aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" \
--query 'Reservations[].Instances[].{ID:InstanceId,Type:InstanceType}'
For JMESPath gotchas, nested filtering, sort/limit, and pipe expressions, see references/advanced-patterns.md#jmespath-queries.
Output Format Selection
| Use Case | Format | Flag |
|---|---|---|
| Shell scripts | text |
--output text |
| Debugging | json |
--output json |
| Reports | table |
--output table |
| Documentation | yaml |
--output yaml |
| CI/CD | json + --query |
Extract exact values |
Script Safety Checklist
Verify before shipping:
set -euo pipefailat script top--tag-specificationson every resource-creation call- S3 versioning enabled on critical buckets before bulk operations
- Check
--helpfor non-obvious required params on unfamiliar commands - No
--no-verify-sslin production - Sensitive output (keys, secrets) never piped to stdout unredacted
- No
--forceflags without understanding what they skip - No
create-access-keycalls in automation scripts
Common Gotchas
- Pager blocks scripts: v2 enables
lessby default. Fix:export AWS_PAGER=""or--no-cli-pager. - Pagination surprise: v2 auto-paginates; a
describe-instanceswith 10K instances returns ALL of them. Use--max-itemsto cap. - Text + query pagination trap:
--output textruns--queryper page, not the full dataset. Usejsonoryamlwhen--querymust operate on complete results. - Region mismatch: Resources are region-scoped. Global services (IAM, Route53, CloudFront) use
us-east-1implicitly. - S3 sync compares size + timestamp, not content. Use
--exact-timestampsfor precision. - Filter vs query naming:
--filtersuses API names (instance-state-name);--queryuses response JSON names (State.Name). - Waiter timeouts: ~10 min default, exit code 255 on timeout — crashes
set -escripts. Capture exit code explicitly. - SSO token expiry: 1-8 hours typically. Run
aws sso loginto refresh.aws loginauto-refreshes (15 min intervals, up to 12h). - CloudFormation drift:
describe-stacksshows template state, not actual. Usedetect-stack-driftfor truth.
For exit codes table, v1-to-v2 migration tool, and v2 behavioral changes, see references/advanced-patterns.md#exit-codes-v2.
Dangerous Commands Reference
Before running any destructive AWS CLI command, consult the safety reference for tiered risk commands (irreversible data loss, service disruption, cost explosion), safer alternatives, and pre-execution checklists: references/dangerous-commands.md.
Advanced Patterns Reference
For JMESPath queries, pagination control, waiter patterns, output formats, credential chain and SSO session config, S3 transfer optimization, multi-account/cross-region loops, CLI aliases, and scripting templates: references/advanced-patterns.md.
Service Patterns Reference
For VPC provisioning, Lambda deployment, DynamoDB operations, RDS management, CloudWatch observability, SSM Parameter Store, and Security Groups: references/service-patterns.md.
Converted and distributed by TomeVault — claim your Tome and manage your conversions.