AWS CLI Cheatsheet#
🔐 Auth & Profile#
# Configure
aws configure # default profile
aws configure --profile prod
aws configure list
aws configure list-profiles
# SSO (modern, daha güvenli)
aws configure sso
aws sso login --profile prod
aws sso logout
# Profile kullan
export AWS_PROFILE=prod
aws s3 ls --profile prod
aws sts get-caller-identity --profile prod # ben kimim?
# Assume role
aws sts assume-role \
--role-arn arn:aws:iam::<ACCOUNT_ID>:role/<ROLE> \
--role-session-name my-session
# OIDC token (CI/CD için)
aws sts assume-role-with-web-identity \
--role-arn arn:aws:iam::<ACCOUNT_ID>:role/gh-actions-role \
--role-session-name gh-action \
--web-identity-token $GITHUB_OIDC_TOKEN
🌐 Genel Pattern#
# JMESPath ile çıktı filtreleme
aws ec2 describe-instances \
--query 'Reservations[].Instances[].[InstanceId,InstanceType,State.Name]' \
--output table
# Output formatları
--output json | text | table | yaml
# Pagination
aws s3api list-objects-v2 --bucket <BUCKET> --max-items 100 --starting-token <TOKEN>
# Region override
aws ec2 describe-instances --region eu-west-1
export AWS_DEFAULT_REGION=eu-west-1
💻 EC2#
# Listele (tablo)
aws ec2 describe-instances \
--query 'Reservations[].Instances[].[InstanceId,Tags[?Key==`Name`].Value|[0],State.Name,InstanceType,PrivateIpAddress]' \
--output table
# Sadece running'leri al
aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" \
--query 'Reservations[].Instances[].InstanceId'
# Tag ile filtrele
aws ec2 describe-instances --filters "Name=tag:Environment,Values=prod"
# Start / stop / terminate
aws ec2 start-instances --instance-ids i-1234567890abcdef0
aws ec2 stop-instances --instance-ids i-1234567890abcdef0
aws ec2 terminate-instances --instance-ids i-1234567890abcdef0
# Console screenshot (debug stuck instance)
aws ec2 get-console-screenshot --instance-id i-1234567890abcdef0
aws ec2 get-console-output --instance-id i-1234567890abcdef0 --output text
# AMI listesi
aws ec2 describe-images --owners amazon --filters "Name=name,Values=al2023-ami-*x86_64*" \
--query 'sort_by(Images, &CreationDate)[-5:].[ImageId,Name,CreationDate]'
# Volume
aws ec2 describe-volumes --filters Name=status,Values=available # boşta duranlar
aws ec2 describe-snapshots --owner-ids self --query 'sort_by(Snapshots, &StartTime)[].[SnapshotId,StartTime,VolumeSize,Description]'
🗄️ S3#
# Bucket listesi
aws s3 ls
aws s3api list-buckets --query 'Buckets[].Name'
# İçerik listele
aws s3 ls s3://<BUCKET>/path/
aws s3 ls s3://<BUCKET>/path/ --recursive --human-readable --summarize
# Copy / sync
aws s3 cp file.txt s3://<BUCKET>/path/
aws s3 cp s3://<BUCKET>/path/file.txt .
aws s3 cp ./dir s3://<BUCKET>/path/ --recursive
aws s3 sync ./dist s3://<BUCKET>/path/ --delete # delete = hedef'te olup kaynakta olmayanı sil
# Storage class
aws s3 cp big.tar.gz s3://<BUCKET>/archive/ --storage-class GLACIER_IR
# Pre-signed URL
aws s3 presign s3://<BUCKET>/path/file.txt --expires-in 3600
# Bucket policy
aws s3api get-bucket-policy --bucket <BUCKET> | jq -r '.Policy' | jq
# Public erişimi engelle (yeni bucket'larda zaten default)
aws s3api put-public-access-block --bucket <BUCKET> --public-access-block-configuration \
"BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"
# Encryption (SSE-S3 default)
aws s3api put-bucket-encryption --bucket <BUCKET> --server-side-encryption-configuration \
'{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]}'
# Lifecycle (30 gün sonra IA, 90 gün sonra Glacier, 365 gün sonra sil)
aws s3api put-bucket-lifecycle-configuration --bucket <BUCKET> --lifecycle-configuration file://lifecycle.json
👤 IAM#
# User listesi
aws iam list-users
# Bir kullanıcının policy'leri
aws iam list-attached-user-policies --user-name <USER>
aws iam list-user-policies --user-name <USER> # inline
# Role'ler
aws iam list-roles --query 'Roles[].RoleName'
aws iam get-role --role-name <ROLE>
aws iam list-attached-role-policies --role-name <ROLE>
aws iam list-role-policies --role-name <ROLE>
# Policy oku
aws iam get-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
aws iam get-policy-version \
--policy-arn arn:aws:iam::<ACCOUNT_ID>:policy/<POLICY> \
--version-id v1
# Credential report (audit için altın)
aws iam generate-credential-report
aws iam get-credential-report --query 'Content' --output text | base64 -d > report.csv
# Access analyzer (over-permissive policy'leri bul)
aws accessanalyzer list-analyzers
aws accessanalyzer list-findings --analyzer-arn <ARN>
🔐 Secrets Manager#
# Secret listesi
aws secretsmanager list-secrets --query 'SecretList[].Name'
# Secret oku
aws secretsmanager get-secret-value --secret-id <NAME> --query SecretString --output text
aws secretsmanager get-secret-value --secret-id <NAME> | jq -r '.SecretString' | jq
# Yarat / güncelle
aws secretsmanager create-secret --name <NAME> --secret-string '<VALUE>'
aws secretsmanager update-secret --secret-id <NAME> --secret-string '<VALUE>'
aws secretsmanager put-secret-value --secret-id <NAME> --secret-string file://creds.json
# Rotate
aws secretsmanager rotate-secret --secret-id <NAME>
🪣 Parameter Store (SSM)#
# Yarat
aws ssm put-parameter --name "/app/db/host" --value "<HOST>" --type String
aws ssm put-parameter --name "/app/db/password" --value "<PWD>" --type SecureString --key-id alias/aws/ssm
# Oku
aws ssm get-parameter --name "/app/db/host" --query 'Parameter.Value' --output text
aws ssm get-parameter --name "/app/db/password" --with-decryption --query 'Parameter.Value' --output text
# Path altındaki tümü
aws ssm get-parameters-by-path --path "/app/" --recursive --with-decryption \
--query 'Parameters[].[Name,Value]' --output text
🚪 SSM Session Manager (SSH'siz EC2 erişimi)#
# Plugin kurulumu (bir defa)
# https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html
# Connect
aws ssm start-session --target i-1234567890abcdef0
# Port forward (DB'ye bastion üzerinden)
aws ssm start-session --target i-1234567890abcdef0 \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["<DB_HOST>"],"portNumber":["5432"],"localPortNumber":["5432"]}'
# Komut çalıştır (sshsuz uzaktan)
aws ssm send-command \
--instance-ids i-1234567890abcdef0 \
--document-name AWS-RunShellScript \
--parameters 'commands=["uname -a", "df -h"]' \
--output json
🌐 Route 53#
# Hosted zone listesi
aws route53 list-hosted-zones
# Record'ları gör
aws route53 list-resource-record-sets --hosted-zone-id <ZONE_ID>
# Record ekle/güncelle (json ile)
aws route53 change-resource-record-sets --hosted-zone-id <ZONE_ID> --change-batch file://record.json
# DNS propagasyonu doğrula
aws route53 get-change --id <CHANGE_ID>
📊 CloudWatch#
# Log groups
aws logs describe-log-groups --query 'logGroups[].logGroupName'
# Tail (real-time)
aws logs tail /aws/lambda/my-fn --follow
aws logs tail /aws/lambda/my-fn --since 10m --filter-pattern "ERROR"
# Metric query
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
--start-time $(date -u -d '1 hour ago' +%FT%TZ) \
--end-time $(date -u +%FT%TZ) \
--period 300 \
--statistics Average
💸 Cost Explorer#
# Bu ay
aws ce get-cost-and-usage \
--time-period Start=$(date -d '1 month ago' +%F),End=$(date +%F) \
--granularity DAILY \
--metrics UnblendedCost \
--group-by Type=DIMENSION,Key=SERVICE \
--query 'ResultsByTime[].Total.UnblendedCost.Amount' --output text
# Top 10 service
aws ce get-cost-and-usage \
--time-period Start=$(date -d '30 days ago' +%F),End=$(date +%F) \
--granularity MONTHLY \
--metrics UnblendedCost \
--group-by Type=DIMENSION,Key=SERVICE \
--query 'ResultsByTime[0].Groups[?Metrics.UnblendedCost.Amount>`100`].[Keys[0],Metrics.UnblendedCost.Amount]' \
--output table
🔧 EKS#
# Cluster listesi
aws eks list-clusters
# kubeconfig al
aws eks update-kubeconfig --name <CLUSTER> --region <REGION>
aws eks update-kubeconfig --name <CLUSTER> --alias <SHORT_NAME>
# Versiyon ve update
aws eks describe-cluster --name <CLUSTER> --query 'cluster.version'
aws eks update-cluster-version --name <CLUSTER> --version 1.30
⚡ Faydalı one-liner'lar#
# Hangi role'le çalışıyorum?
aws sts get-caller-identity
# Tüm region'ları listele
aws ec2 describe-regions --query 'Regions[].RegionName' --output text
# Bütün region'lardaki running EC2'ler
for r in $(aws ec2 describe-regions --query 'Regions[].RegionName' --output text); do
echo "=== $r ==="
aws ec2 describe-instances --region $r \
--filters "Name=instance-state-name,Values=running" \
--query 'Reservations[].Instances[].[InstanceId,InstanceType]' \
--output table
done
# Tüm açık (untagged) EBS volume'ları
aws ec2 describe-volumes --filters Name=status,Values=available \
--query 'Volumes[].[VolumeId,Size,CreateTime]' --output table
# Boşta duran Elastic IP'ler ($$$)
aws ec2 describe-addresses --query 'Addresses[?AssociationId==null].[PublicIp,AllocationId]' --output table
# Tüm cleanup'ı script'le
aws ec2 describe-snapshots --owner-ids self \
--query "Snapshots[?StartTime<='$(date -d '90 days ago' +%F)'].SnapshotId" \
--output text | xargs -n1 aws ec2 delete-snapshot --snapshot-id
🆘 Acil senaryolar#
| Sorun | Çözüm |
|---|---|
Unable to locate credentials | aws configure list; AWS_PROFILE set; aws sso login |
AccessDenied ama IAM doğru | Trust policy, MFA, session length, condition keys kontrol |
| Yüksek fatura ay sonu | Cost Explorer + Anomaly Detector + tagging audit |
| EC2 SSH erişimi yok | SSM Session Manager kullan (instance role gerekli) |
| S3 bucket yanlışlıkla public | aws s3api put-public-access-block ile kapat |
| Region farkı yüzünden resource görmüyor | --region ekle veya AWS_DEFAULT_REGION set et |
🎓 Öğrenme Patikası: Bu doküman
C4modülünde "Önce oku" kaynağı olarak kullanılıyor.