name: aws-cli
description: Expert guidance on AWS CLI v2 for managing AWS services from the command line. Integrates with the dash monitoring dashboard. Use when developers mention: (1) aws command or AWS CLI, (2) CloudWatch metrics or alarms, (3) ECS/EC2/Lambda service discovery, (4) S3 bucket operations, (5) Cost Explorer queries, (6) Security Hub or GuardDuty findings, (7) configuring AWS credentials or profiles, (8) dash AWS monitoring setup.
AWS CLI v2
Overview
The AWS Command Line Interface (AWS CLI) is a unified tool to manage AWS services from the command line. Version 2 is the current major version with improved installers, new configuration options, and native support for AWS IAM Identity Center (SSO).
Official Documentation: https://docs.aws.amazon.com/cli/latest/userguide/
Configuration
Quick Setup
aws configure
Named Profiles
aws configure --profile production
aws configure --profile development
aws s3 ls --profile production
export AWS_PROFILE=production
Configuration Files
[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
[production]
aws_access_key_id = AKIAI44QH8DHBEXAMPLE
aws_secret_access_key = je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
[default]
region = us-west-2
output = json
[profile production]
region = us-east-1
output = json
[profile sso-user]
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_region = us-east-1
sso_account_id = 123456789012
sso_role_name = ReadOnlyAccess
region = us-west-2
Environment Variables
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export AWS_DEFAULT_REGION=us-west-2
export AWS_PROFILE=production
export AWS_SESSION_TOKEN=...
IAM Identity Center (SSO)
aws configure sso
aws sso login --profile my-sso-profile
Core Commands
Identity and Access
aws sts get-caller-identity
aws iam list-users
aws iam get-user --user-name alice
aws iam list-roles
EC2
aws ec2 describe-instances
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running"
aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,Tags[?Key==`Name`].Value|[0]]' --output table
aws ec2 start-instances --instance-ids i-1234567890abcdef0
aws ec2 stop-instances --instance-ids i-1234567890abcdef0
aws ec2 describe-regions --all-regions
ECS
aws ecs list-clusters
aws ecs list-services --cluster my-cluster
aws ecs describe-services --cluster my-cluster --services my-service
aws ecs list-tasks --cluster my-cluster --service-name my-service
aws ecs describe-tasks --cluster my-cluster --tasks <task-arn>
aws ecs update-service --cluster my-cluster --service my-service --force-new-deployment
Lambda
aws lambda list-functions
aws lambda get-function --function-name my-function
aws lambda invoke --function-name my-function output.json
aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip
S3
aws s3 ls
aws s3 ls s3://my-bucket/
aws s3 cp file.txt s3://my-bucket/
aws s3 cp s3://my-bucket/file.txt ./
aws s3 sync ./local-dir s3://my-bucket/prefix/
aws s3 rm s3://my-bucket/file.txt
aws s3 rb s3://my-bucket --force
aws s3api get-bucket-location --bucket my-bucket
CloudWatch
aws cloudwatch describe-alarms
aws cloudwatch describe-alarms --state-value ALARM
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
--start-time 2024-01-01T00:00:00Z \
--end-time 2024-01-02T00:00:00Z \
--period 3600 \
--statistics Average
aws cloudwatch list-metrics --namespace AWS/ECS
aws cloudwatch put-metric-data \
--namespace "Custom/MyApp" \
--metric-name "RequestCount" \
--value 100
RDS
aws rds describe-db-instances
aws rds describe-db-clusters
aws rds describe-db-snapshots
aws rds create-db-snapshot --db-instance-identifier mydb --db-snapshot-identifier mydb-snapshot
Cost Explorer
aws ce get-cost-and-usage \
--time-period Start=2024-01-01,End=2024-01-31 \
--granularity DAILY \
--metrics "BlendedCost" "UnblendedCost" \
--group-by Type=DIMENSION,Key=SERVICE
Security Hub
aws securityhub get-findings --max-results 100
aws securityhub get-findings --filters '{"SeverityNormalized": [{"Gte": 70}]}'
aws securityhub describe-standards
GuardDuty
aws guardduty list-detectors
aws guardduty list-findings --detector-id <detector-id>
aws guardduty get-findings --detector-id <detector-id> --finding-ids <finding-id>
Elastic Load Balancing
aws elbv2 describe-load-balancers
aws elbv2 describe-target-groups --load-balancer-arn <arn>
aws elbv2 describe-target-health --target-group-arn <arn>
Elastic Beanstalk
aws elasticbeanstalk describe-environments
aws elasticbeanstalk describe-environment-health --environment-name my-env --attribute-names All
Integration with Dash Monitoring
The dash monitoring dashboard uses AWS CLI for service discovery and metrics collection. Configuration is in config/aws-monitoring.yaml.
Configuration Example
aws:
region: "us-west-2"
credentials:
use_iam_role: true
profile: ""
access_key_id: ""
secret_access_key: ""
service_stability:
discovery:
enabled: true
use_aws_cli: true
clusters:
- name: "production-cluster"
region: "us-west-2"
ec2_filters:
- name: "tag:Environment"
values: ["prod"]
discover_elastic_beanstalk: true
discover_lambda: true
How Dash Uses AWS CLI
The AWSCLIExecutor in dash executes AWS CLI commands for:
- Service Discovery: ECS services, EC2 instances, Lambda functions, Elastic Beanstalk environments
- CloudWatch Metrics: CPU, memory, request counts, latency
- Alarms: CloudWatch alarm states
- Cost Data: Daily/monthly cost breakdowns
- Security: Security Hub findings, GuardDuty detections
- Load Balancer Health: Target group health status
Verifying CLI Access for Dash
aws sts get-caller-identity
aws ecs list-clusters
aws ecs list-services --cluster production-cluster
aws cloudwatch describe-alarms --state-value ALARM
aws ce get-cost-and-usage \
--time-period Start=$(date -v-7d +%Y-%m-%d),End=$(date +%Y-%m-%d) \
--granularity DAILY \
--metrics BlendedCost
Required IAM Permissions for Dash
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecs:ListClusters",
"ecs:ListServices",
"ecs:DescribeServices",
"ecs:ListTasks",
"ecs:DescribeTasks",
"ec2:DescribeInstances",
"ec2:DescribeRegions",
"lambda:ListFunctions",
"lambda:GetFunction",
"elasticbeanstalk:DescribeEnvironments",
"elasticbeanstalk:DescribeEnvironmentHealth",
"cloudwatch:DescribeAlarms",
"cloudwatch:GetMetricData",
"cloudwatch:GetMetricStatistics",
"cloudwatch:ListMetrics",
"rds:DescribeDBInstances",
"rds:DescribeDBClusters",
"elasticloadbalancing:DescribeLoadBalancers",
"elasticloadbalancing:DescribeTargetGroups",
"elasticloadbalancing:DescribeTargetHealth",
"s3:ListAllMyBuckets",
"s3:GetBucketLocation",
"ce:GetCostAndUsage",
"securityhub:GetFindings",
"guardduty:ListDetectors",
"guardduty:ListFindings",
"guardduty:GetFindings",
"sts:GetCallerIdentity"
],
"Resource": "*"
}
]
}
Common Workflows
Service Discovery Script
for cluster in $(aws ecs list-clusters --query 'clusterArns[*]' --output text); do
echo "Cluster: $cluster"
aws ecs list-services --cluster "$cluster" --query 'serviceArns[*]' --output table
done
Health Check All Load Balancers
for lb in $(aws elbv2 describe-load-balancers --query 'LoadBalancers[*].LoadBalancerArn' --output text); do
echo "Load Balancer: $lb"
for tg in $(aws elbv2 describe-target-groups --load-balancer-arn "$lb" --query 'TargetGroups[*].TargetGroupArn' --output text); do
aws elbv2 describe-target-health --target-group-arn "$tg" \
--query 'TargetHealthDescriptions[*].[Target.Id,TargetHealth.State]' --output table
done
done
Export CloudWatch Metrics
aws cloudwatch get-metric-data \
--metric-data-queries file://queries.json \
--start-time $(date -v-1H -u +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--output json > metrics.json
Cost Report
aws ce get-cost-and-usage \
--time-period Start=$(date -v-30d +%Y-%m-%d),End=$(date +%Y-%m-%d) \
--granularity MONTHLY \
--metrics "BlendedCost" \
--group-by Type=DIMENSION,Key=SERVICE \
--query 'ResultsByTime[*].Groups[*].[Keys[0],Metrics.BlendedCost.Amount]' \
--output table
Output Formats
aws ec2 describe-instances --output json
aws ec2 describe-instances --output text
aws ec2 describe-instances --output table
aws ec2 describe-instances --output yaml
JMESPath Queries
aws ec2 describe-instances --query 'Reservations[*].Instances[*].InstanceId' --output text
aws ec2 describe-instances \
--query 'Reservations[*].Instances[*].[InstanceId,State.Name,Tags[?Key==`Name`].Value|[0]]' \
--output table
aws ec2 describe-instances \
--query 'Reservations[*].Instances[?State.Name==`running`].[InstanceId,InstanceType]' \
--output table
Troubleshooting
Credential Issues
aws sts get-caller-identity
AWS_DEBUG=1 aws sts get-caller-identity
rm -rf ~/.aws/cli/cache/*
Region Issues
aws configure get region
aws ec2 describe-instances --region us-east-1
Timeout Issues
aws configure set cli_read_timeout 60
aws configure set cli_connect_timeout 30
export AWS_READ_TIMEOUT=60
export AWS_CONNECT_TIMEOUT=30
Rate Limiting
aws configure set retry_mode adaptive
aws configure set max_attempts 10
Debug Mode
aws ec2 describe-instances --debug 2>&1 | head -100
Helper Scripts
This skill includes Python helper scripts in the scripts/ directory. Run with uv run:
aws_check.py - Verify AWS CLI Setup
uv run ~/.claude/skills/aws-cli/scripts/aws_check.py
uv run ~/.claude/skills/aws-cli/scripts/aws_check.py identity
uv run ~/.claude/skills/aws-cli/scripts/aws_check.py permissions
uv run ~/.claude/skills/aws-cli/scripts/aws_check.py services
uv run ~/.claude/skills/aws-cli/scripts/aws_check.py config
aws_metrics.py - CloudWatch Metrics Helper
uv run ~/.claude/skills/aws-cli/scripts/aws_metrics.py list AWS/ECS
uv run ~/.claude/skills/aws-cli/scripts/aws_metrics.py get CPUUtilization --namespace AWS/EC2 --dimension InstanceId=i-1234567890
uv run ~/.claude/skills/aws-cli/scripts/aws_metrics.py alarms ALARM
uv run ~/.claude/skills/aws-cli/scripts/aws_metrics.py ecs my-cluster my-service --hours 24
uv run ~/.claude/skills/aws-cli/scripts/aws_metrics.py ec2 i-1234567890abcdef0 --hours 6
uv run ~/.claude/skills/aws-cli/scripts/aws_metrics.py rds mydb-instance --hours 12
uv run ~/.claude/skills/aws-cli/scripts/aws_metrics.py export metrics.json --hours 24
Resources
Installation Reference
macOS
brew install awscli
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
Linux
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
Docker
docker run --rm -it amazon/aws-cli --version
docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli s3 ls
Verify Installation
aws --version