자주 쓰는/쓰일 AWS CLI 명령어 모음
AWS CLI로 클라우드 리소스를 효과적으로 관리하기 위한 필수 명령어 정리
AWS CLI란?
AWS CLI(Command Line Interface)는 AWS 서비스를 커맨드라인에서 제어할 수 있는 통합 도구임.
콘솔 대신 터미널에서 빠르게 리소스를 관리하고, 스크립트로 자동화할 수 있어 DevOps 작업에 필수적임.
AWS CLI 설치 및 설정
설치
macOS (Homebrew 사용)
1
$ brew install awscli
Linux
1
2
3
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
초기 설정
AWS 자격 증명 구성
$ aws configure
1
2
3
4
AWS Access Key ID: YOUR_ACCESS_KEY
AWS Secret Access Key: YOUR_SECRET_KEY
Default region name: ap-northeast-2
Default output format: json
프로필 설정 (여러 계정 사용 시)
$ aws configure --profile {프로필명}
특정 프로필로 명령어 실행
$ aws {명령어} --profile {프로필명}
현재 설정 확인
$ aws configure list
S3 명령어
버킷 관리
버킷 목록 조회
$ aws s3 ls
버킷 생성
$ aws s3 mb s3://{버킷명}
| 옵션 | 설명 |
|---|---|
--region | 버킷을 생성할 리전 지정 |
버킷 삭제 (빈 버킷)
$ aws s3 rb s3://{버킷명}
버킷 및 모든 객체 삭제
$ aws s3 rb s3://{버킷명} --force
객체 관리
버킷 내 객체 목록 조회
$ aws s3 ls s3://{버킷명}
| 옵션 | 설명 |
|---|---|
--recursive | 하위 디렉토리까지 모든 객체 조회 |
--human-readable | 파일 크기를 읽기 쉬운 형식으로 표시 (KB, MB 등) |
--summarize | 전체 객체 수와 총 크기 표시 |
파일 업로드
$ aws s3 cp {로컬 파일 경로} s3://{버킷명}/{경로}
디렉토리 업로드 (재귀적)
$ aws s3 cp {로컬 디렉토리} s3://{버킷명}/{경로} --recursive
파일 다운로드
$ aws s3 cp s3://{버킷명}/{경로} {로컬 파일 경로}
디렉토리 동기화 (로컬 → S3)
$ aws s3 sync {로컬 디렉토리} s3://{버킷명}/{경로}
| 옵션 | 설명 |
|---|---|
--delete | 소스에 없는 파일을 대상에서 삭제 |
--exclude | 특정 패턴의 파일 제외 (예: --exclude "*.tmp") |
--include | 특정 패턴의 파일만 포함 |
--dryrun | 실제 작업 없이 수행될 작업 미리보기 |
S3 간 파일 복사
$ aws s3 cp s3://{원본 버킷}/{경로} s3://{대상 버킷}/{경로}
파일 이동 (복사 후 원본 삭제)
$ aws s3 mv s3://{버킷명}/{원본 경로} s3://{버킷명}/{대상 경로}
파일 삭제
$ aws s3 rm s3://{버킷명}/{경로}
디렉토리 및 모든 하위 객체 삭제
$ aws s3 rm s3://{버킷명}/{경로} --recursive
고급 S3 명령어 (s3api)
버킷 정책 조회
$ aws s3api get-bucket-policy --bucket {버킷명}
버킷 정책 설정
$ aws s3api put-bucket-policy --bucket {버킷명} --policy file://policy.json
버킷 버전 관리 활성화
$ aws s3api put-bucket-versioning --bucket {버킷명} --versioning-configuration Status=Enabled
Presigned URL 생성 (임시 다운로드 링크)
$ aws s3 presign s3://{버킷명}/{경로} --expires-in {초}
객체 메타데이터 조회
$ aws s3api head-object --bucket {버킷명} --key {객체 키}
멀티파트 업로드 목록 조회
$ aws s3api list-multipart-uploads --bucket {버킷명}
EC2 명령어
인스턴스 관리
인스턴스 목록 조회
$ aws ec2 describe-instances
| 옵션 | 설명 |
|---|---|
--instance-ids | 특정 인스턴스 ID로 필터링 |
--filters | 조건별 필터링 (예: Name=instance-state-name,Values=running) |
--query | JMESPath를 사용한 출력 필터링 |
실행 중인 인스턴스만 조회 (간결한 출력)
$ aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].[InstanceId,InstanceType,State.Name,PublicIpAddress]" --output table
인스턴스 시작
$ aws ec2 run-instances --image-id {AMI ID} --instance-type {인스턴스 타입} --key-name {키페어명}
| 옵션 | 설명 |
|---|---|
--count | 시작할 인스턴스 개수 (기본값: 1) |
--subnet-id | 서브넷 지정 |
--security-group-ids | 보안 그룹 ID 목록 |
--user-data | 인스턴스 시작 시 실행할 스크립트 |
--tag-specifications | 태그 지정 |
인스턴스 중지
$ aws ec2 stop-instances --instance-ids {인스턴스 ID}
인스턴스 시작 (중지된 인스턴스)
$ aws ec2 start-instances --instance-ids {인스턴스 ID}
인스턴스 재부팅
$ aws ec2 reboot-instances --instance-ids {인스턴스 ID}
인스턴스 종료 (영구 삭제)
$ aws ec2 terminate-instances --instance-ids {인스턴스 ID}
인스턴스 상태 확인
$ aws ec2 describe-instance-status --instance-ids {인스턴스 ID}
AMI 관리
AMI 목록 조회 (본인 소유)
$ aws ec2 describe-images --owners self
특정 AMI 검색
$ aws ec2 describe-images --filters "Name=name,Values=amzn2-ami-hvm*"
AMI 생성 (인스턴스로부터)
$ aws ec2 create-image --instance-id {인스턴스 ID} --name {AMI 이름}
AMI 삭제
$ aws ec2 deregister-image --image-id {AMI ID}
보안 그룹 관리
보안 그룹 목록 조회
$ aws ec2 describe-security-groups
보안 그룹 생성
$ aws ec2 create-security-group --group-name {그룹명} --description {설명} --vpc-id {VPC ID}
인바운드 규칙 추가 (SSH 허용 예시)
$ aws ec2 authorize-security-group-ingress --group-id {보안 그룹 ID} --protocol tcp --port 22 --cidr 0.0.0.0/0
키페어 관리
키페어 목록 조회
$ aws ec2 describe-key-pairs
키페어 생성
$ aws ec2 create-key-pair --key-name {키페어명} --query 'KeyMaterial' --output text > {파일명}.pem
키페어 삭제
$ aws ec2 delete-key-pair --key-name {키페어명}
IAM 명령어
사용자 관리
사용자 목록 조회
$ aws iam list-users
사용자 생성
$ aws iam create-user --user-name {사용자명}
사용자 삭제
$ aws iam delete-user --user-name {사용자명}
사용자 정보 조회
$ aws iam get-user --user-name {사용자명}
현재 IAM 자격 증명 정보 확인
$ aws sts get-caller-identity
액세스 키 관리
액세스 키 생성
$ aws iam create-access-key --user-name {사용자명}
액세스 키 목록 조회
$ aws iam list-access-keys --user-name {사용자명}
액세스 키 삭제
$ aws iam delete-access-key --user-name {사용자명} --access-key-id {액세스 키 ID}
정책 관리
사용자에게 연결된 정책 목록 조회
$ aws iam list-attached-user-policies --user-name {사용자명}
관리형 정책 연결
$ aws iam attach-user-policy --user-name {사용자명} --policy-arn {정책 ARN}
관리형 정책 분리
$ aws iam detach-user-policy --user-name {사용자명} --policy-arn {정책 ARN}
사용 가능한 AWS 관리형 정책 조회
$ aws iam list-policies --scope AWS --max-items 50
커스텀 정책 생성
$ aws iam create-policy --policy-name {정책명} --policy-document file://policy.json
역할 관리
역할 목록 조회
$ aws iam list-roles
역할 생성
$ aws iam create-role --role-name {역할명} --assume-role-policy-document file://trust-policy.json
역할에 정책 연결
$ aws iam attach-role-policy --role-name {역할명} --policy-arn {정책 ARN}
그룹 관리
그룹 목록 조회
$ aws iam list-groups
그룹 생성
$ aws iam create-group --group-name {그룹명}
사용자를 그룹에 추가
$ aws iam add-user-to-group --user-name {사용자명} --group-name {그룹명}
Lambda 명령어
함수 관리
함수 목록 조회
$ aws lambda list-functions
특정 함수 정보 조회
$ aws lambda get-function --function-name {함수명}
함수 설정 조회
$ aws lambda get-function-configuration --function-name {함수명}
함수 생성
$ aws lambda create-function --function-name {함수명} --runtime {런타임} --role {역할 ARN} --handler {핸들러} --zip-file fileb://function.zip
| 옵션 | 설명 |
|---|---|
--runtime | 런타임 환경 (예: nodejs20.x, python3.12) |
--handler | 핸들러 함수 (예: index.handler) |
--memory-size | 메모리 크기 (MB, 기본값: 128) |
--timeout | 타임아웃 시간 (초, 기본값: 3) |
함수 코드 업데이트
$ aws lambda update-function-code --function-name {함수명} --zip-file fileb://function.zip
S3에서 코드 배포
$ aws lambda update-function-code --function-name {함수명} --s3-bucket {버킷명} --s3-key {객체 키}
함수 설정 업데이트
$ aws lambda update-function-configuration --function-name {함수명} --memory-size 512 --timeout 30
환경 변수 설정
$ aws lambda update-function-configuration --function-name {함수명} --environment "Variables={KEY1=value1,KEY2=value2}"
함수 삭제
$ aws lambda delete-function --function-name {함수명}
함수 실행
Lambda 함수 동기 실행
$ aws lambda invoke --function-name {함수명} --payload '{"key":"value"}' response.json
Lambda 함수 비동기 실행
$ aws lambda invoke --function-name {함수명} --invocation-type Event --payload '{"key":"value"}' response.json
별칭 및 버전 관리
함수 버전 게시
$ aws lambda publish-version --function-name {함수명}
별칭 생성
$ aws lambda create-alias --function-name {함수명} --name {별칭명} --function-version {버전 번호}
버전 목록 조회
$ aws lambda list-versions-by-function --function-name {함수명}
CloudWatch 명령어
로그 그룹 및 스트림
로그 그룹 목록 조회
$ aws logs describe-log-groups
로그 스트림 목록 조회
$ aws logs describe-log-streams --log-group-name {로그 그룹명}
로그 이벤트 조회 (실시간)
$ aws logs tail {로그 그룹명} --follow
로그 이벤트 조회 (시간 범위 지정)
$ aws logs filter-log-events --log-group-name {로그 그룹명} --start-time {시작 시간 ms} --end-time {종료 시간 ms}
특정 패턴으로 로그 검색
$ aws logs filter-log-events --log-group-name {로그 그룹명} --filter-pattern "ERROR"
로그 그룹 생성
$ aws logs create-log-group --log-group-name {로그 그룹명}
로그 그룹 삭제
$ aws logs delete-log-group --log-group-name {로그 그룹명}
메트릭 및 알람
메트릭 통계 조회
$ aws cloudwatch get-metric-statistics --namespace {네임스페이스} --metric-name {메트릭명} --dimensions Name={차원명},Value={값} --start-time {시작 시간} --end-time {종료 시간} --period 300 --statistics Average
EC2 CPU 사용률 조회 예시
$ aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization --dimensions Name=InstanceId,Value={인스턴스 ID} --start-time 2025-05-15T00:00:00Z --end-time 2025-05-15T23:59:59Z --period 3600 --statistics Average
알람 목록 조회
$ aws cloudwatch describe-alarms
알람 생성
$ aws cloudwatch put-metric-alarm --alarm-name {알람명} --metric-name {메트릭명} --namespace {네임스페이스} --statistic Average --period 300 --threshold 80 --comparison-operator GreaterThanThreshold
알람 삭제
$ aws cloudwatch delete-alarms --alarm-names {알람명}
커스텀 메트릭 전송
$ aws cloudwatch put-metric-data --namespace {네임스페이스} --metric-name {메트릭명} --value {값} --unit Count
DynamoDB 명령어
테이블 관리
테이블 목록 조회
$ aws dynamodb list-tables
테이블 정보 조회
$ aws dynamodb describe-table --table-name {테이블명}
테이블 생성
$ aws dynamodb create-table --table-name {테이블명} --attribute-definitions AttributeName=id,AttributeType=S --key-schema AttributeName=id,KeyType=HASH --billing-mode PAY_PER_REQUEST
테이블 삭제
$ aws dynamodb delete-table --table-name {테이블명}
데이터 조작
아이템 추가
$ aws dynamodb put-item --table-name {테이블명} --item '{"id":{"S":"123"},"name":{"S":"John"}}'
아이템 조회
$ aws dynamodb get-item --table-name {테이블명} --key '{"id":{"S":"123"}}'
아이템 업데이트
$ aws dynamodb update-item --table-name {테이블명} --key '{"id":{"S":"123"}}' --update-expression "SET age = :val" --expression-attribute-values '{":val":{"N":"30"}}'
아이템 삭제
$ aws dynamodb delete-item --table-name {테이블명} --key '{"id":{"S":"123"}}'
테이블 전체 스캔
$ aws dynamodb scan --table-name {테이블명}
쿼리 (파티션 키로 검색)
$ aws dynamodb query --table-name {테이블명} --key-condition-expression "id = :id" --expression-attribute-values '{":id":{"S":"123"}}'
RDS 명령어
DB 인스턴스 관리
DB 인스턴스 목록 조회
$ aws rds describe-db-instances
특정 DB 인스턴스 정보 조회
$ aws rds describe-db-instances --db-instance-identifier {DB 인스턴스 식별자}
DB 인스턴스 생성
$ aws rds create-db-instance --db-instance-identifier {식별자} --db-instance-class {인스턴스 타입} --engine {엔진} --master-username {마스터 유저명} --master-user-password {비밀번호} --allocated-storage {스토리지 크기(GB)}
DB 인스턴스 중지
$ aws rds stop-db-instance --db-instance-identifier {DB 인스턴스 식별자}
DB 인스턴스 시작
$ aws rds start-db-instance --db-instance-identifier {DB 인스턴스 식별자}
DB 인스턴스 재부팅
$ aws rds reboot-db-instance --db-instance-identifier {DB 인스턴스 식별자}
DB 인스턴스 삭제
$ aws rds delete-db-instance --db-instance-identifier {DB 인스턴스 식별자} --skip-final-snapshot
스냅샷 관리
DB 스냅샷 목록 조회
$ aws rds describe-db-snapshots
DB 스냅샷 생성
$ aws rds create-db-snapshot --db-snapshot-identifier {스냅샷 식별자} --db-instance-identifier {DB 인스턴스 식별자}
스냅샷에서 DB 복원
$ aws rds restore-db-instance-from-db-snapshot --db-instance-identifier {새 인스턴스 식별자} --db-snapshot-identifier {스냅샷 식별자}
ECS 명령어
클러스터 관리
클러스터 목록 조회
$ aws ecs list-clusters
클러스터 상세 정보 조회
$ aws ecs describe-clusters --clusters {클러스터명}
클러스터 생성
$ aws ecs create-cluster --cluster-name {클러스터명}
서비스 및 태스크
서비스 목록 조회
$ aws ecs list-services --cluster {클러스터명}
서비스 상세 정보 조회
$ aws ecs describe-services --cluster {클러스터명} --services {서비스명}
실행 중인 태스크 목록 조회
$ aws ecs list-tasks --cluster {클러스터명}
태스크 상세 정보 조회
$ aws ecs describe-tasks --cluster {클러스터명} --tasks {태스크 ARN}
태스크 실행
$ aws ecs run-task --cluster {클러스터명} --task-definition {태스크 정의}
태스크 중지
$ aws ecs stop-task --cluster {클러스터명} --task {태스크 ARN}
CloudFormation 명령어
스택 관리
스택 목록 조회
$ aws cloudformation list-stacks
스택 상세 정보 조회
$ aws cloudformation describe-stacks --stack-name {스택명}
스택 생성
$ aws cloudformation create-stack --stack-name {스택명} --template-body file://template.yaml
스택 업데이트
$ aws cloudformation update-stack --stack-name {스택명} --template-body file://template.yaml
스택 삭제
$ aws cloudformation delete-stack --stack-name {스택명}
스택 이벤트 조회
$ aws cloudformation describe-stack-events --stack-name {스택명}
유용한 팁 및 트릭
출력 형식 변경
JSON 형식 출력 (기본값)
$ aws {명령어} --output json
테이블 형식 출력 (가독성 좋음)
$ aws {명령어} --output table
텍스트 형식 출력 (스크립트용)
$ aws {명령어} --output text
YAML 형식 출력
$ aws {명령어} --output yaml
JMESPath를 이용한 쿼리
특정 필드만 추출
$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name]' --output table
조건부 필터링
$ aws ec2 describe-instances --query "Reservations[*].Instances[?State.Name=='running'].[InstanceId,PublicIpAddress]" --output table
멀티 리전 명령어
특정 리전 지정
$ aws ec2 describe-instances --region us-east-1
모든 리전의 EC2 인스턴스 조회 (스크립트)
1
2
3
4
for region in $(aws ec2 describe-regions --query 'Regions[*].RegionName' --output text); do
echo "Region: $region"
aws ec2 describe-instances --region $region --query 'Reservations[*].Instances[*].[InstanceId,State.Name]' --output table
done
드라이런 (시뮬레이션)
S3 sync 시뮬레이션 (실제 작업 없이 미리보기)
$ aws s3 sync {로컬 디렉토리} s3://{버킷명} --dryrun
페이지네이션
대량의 결과를 페이지 단위로 조회
$ aws s3api list-objects-v2 --bucket {버킷명} --max-items 100
다음 페이지 조회
$ aws s3api list-objects-v2 --bucket {버킷명} --max-items 100 --starting-token {다음 토큰}
AWS CLI 자동 완성
Bash 자동 완성 활성화
1
2
$ echo 'complete -C aws_completer aws' >> ~/.bashrc
$ source ~/.bashrc
Zsh 자동 완성 활성화
1
2
3
$ echo 'autoload bashcompinit && bashcompinit' >> ~/.zshrc
$ echo 'complete -C aws_completer aws' >> ~/.zshrc
$ source ~/.zshrc
스크립트 활용 예시
모든 중지된 EC2 인스턴스 시작
1
2
3
4
aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=stopped" \
--query "Reservations[*].Instances[*].InstanceId" \
--output text | xargs -n1 aws ec2 start-instances --instance-ids
S3 버킷 크기 계산
1
aws s3 ls s3://{버킷명} --recursive --summarize | grep "Total Size"
30일 이상 된 CloudWatch 로그 그룹 삭제
1
aws logs describe-log-groups --query 'logGroups[?creationTime<`'$(date -d '30 days ago' +%s%3N)'`].logGroupName' --output text | xargs -n1 aws logs delete-log-group --log-group-name
AWS CLI 버전 확인 및 업데이트
현재 설치된 AWS CLI 버전 확인
$ aws --version
AWS CLI v2 업데이트 (macOS - Homebrew)
$ brew upgrade awscli
AWS CLI v2 업데이트 (Linux)
1
2
3
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install --update
참고 자료
AWS CLI 공식 문서
https://docs.aws.amazon.com/cli/
JMESPath 튜토리얼
https://jmespath.org/tutorial.html