Post

자주 쓰는/쓰일 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)
--queryJMESPath를 사용한 출력 필터링

실행 중인 인스턴스만 조회 (간결한 출력)
$ 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


추가적인 좋은 기능이 있다면 이메일로 남겨주시면 감사하겠습니다 😀

This post is licensed under CC BY 4.0 by the author.