테마
05. DynamoDB와 IAM - AWS 핵심 서비스 이해하기
AWS의 NoSQL 데이터베이스 서비스인 DynamoDB와, 접근 권한을 관리하는 IAM 서비스를 학습합니다.
실전 IAM 설계는 12장에서 이어집니다
이 문서는 IAM의 기본 개념을 소개하는 장입니다. OIDC 기반 GitHub Actions 연동, Task Role / Execution Role 구분, Secrets Manager / Parameter Store 같은 운영 맥락은 12. AWS 네트워킹과 보안에서 계속 정리합니다.
Part 1: DynamoDB
1. NoSQL의 장점 복습
관계형 데이터베이스(RDB, Relational Database)와 비교하여 NoSQL이 가진 핵심 장점을 다시 정리합니다.
스키마 없음 (Schema-less)
관계형 데이터베이스는 테이블을 만들 때 반드시 컬럼(Column)의 이름과 데이터 타입을 미리 정의해야 합니다. 예를 들어, "이름은 문자열, 나이는 정수"처럼 구조를 먼저 확정합니다. 이후 이 구조에 맞지 않는 데이터는 저장할 수 없습니다.
반면 NoSQL은 스키마가 없으므로 같은 테이블 안에서도 항목(Item)마다 서로 다른 필드를 가질 수 있습니다. A 항목에는 이름, 나이가 있고, B 항목에는 이름, 취미, 주소가 있어도 전혀 문제없습니다. 이런 유연성 덕분에 다양한 형태의 데이터를 하나의 테이블에 자유롭게 저장할 수 있습니다.
수평적 확장(Horizontal Scaling) 용이
데이터가 늘어날 때 대응하는 방식은 크게 두 가지입니다.
| 확장 방식 | 설명 | 비유 |
|---|---|---|
| 수직적 확장(Vertical Scaling) | 기존 서버의 CPU, 메모리를 증설 | 책상을 더 큰 것으로 교체 |
| 수평적 확장(Horizontal Scaling) | 서버를 여러 대 추가하여 분산 처리 | 책상을 여러 개 나란히 놓기 |
RDB는 데이터 간 관계(Join)가 복잡하여 여러 서버로 나누기 어렵습니다. NoSQL은 각 항목이 독립적이므로 서버를 추가하는 것만으로 손쉽게 확장할 수 있습니다.
대용량 로그 데이터에 적합
웹 서비스에서 발생하는 클릭 로그, 접속 기록, IoT 센서 데이터 등은 다음과 같은 특징이 있습니다.
- 데이터가 초당 수천~수만 건 쏟아짐
- 한 번 쓰면 수정보다 조회가 많음
- 각 로그의 형식이 조금씩 다를 수 있음
이런 데이터는 NoSQL의 유연한 스키마와 빠른 쓰기 성능이 큰 장점이 됩니다.
2. RDB vs NoSQL(DynamoDB) 데이터 저장 구조 비교
아래 다이어그램으로 RDB와 NoSQL의 근본적인 차이를 시각적으로 이해합니다.
핵심 차이점 정리:
| 구분 | RDB | NoSQL (DynamoDB) |
|---|---|---|
| 스키마 | 고정 (미리 정의 필수) | 유연 (항목마다 다를 수 있음) |
| 확장 방식 | 수직적 확장 중심 | 수평적 확장 용이 |
| 데이터 관계 | Join으로 테이블 간 연결 | 독립적 항목 (Join 없음) |
| 적합한 용도 | 정형 데이터, 복잡한 관계 | 대용량, 유연한 형태의 데이터 |
3. DynamoDB란?
DynamoDB는 AWS가 제공하는 완전 관리형(Fully Managed) Key-Value NoSQL 데이터베이스 서비스입니다.
Key-Value 구조 이해하기
DynamoDB의 구조는 프로그래밍 언어에서 이미 친숙한 자료구조와 같습니다.
| 언어 | 자료구조 | 예시 |
|---|---|---|
| Python | dict (Dictionary) | {"artist_id": "001", "name": "아이유"} |
| Java | HashMap | map.put("artist_id", "001") |
| JavaScript | Object | { artist_id: "001", name: "아이유" } |
**Key(키)**로 데이터를 구분하고, 해당 키에 **Value(값)**를 매핑하는 단순하면서도 강력한 구조입니다.
DynamoDB의 특징
- 완전 관리형: 서버 운영, 패치, 백업 등을 AWS가 알아서 처리
- 자동 확장: 트래픽 증가 시 자동으로 처리 용량 조절
- 밀리초 응답: 어떤 규모에서도 한 자릿수 밀리초(ms) 지연 시간 보장
- 서버리스(Serverless): 별도의 서버 인스턴스를 띄울 필요 없음
4. DynamoDB 핵심 개념
DynamoDB를 사용하려면 네 가지 핵심 개념을 반드시 이해해야 합니다.
4-1. 테이블(Table)
데이터를 저장하는 최상위 컨테이너입니다. RDB의 테이블과 이름은 같지만, 고정된 컬럼 구조가 없다는 점이 다릅니다.
- 하나의 AWS 계정에 여러 테이블을 만들 수 있음
- 테이블 이름은 리전(Region) 내에서 고유해야 함
4-2. 파티션 키(Partition Key)
각 항목을 고유하게 식별하는 기준 키입니다. 테이블 생성 시 반드시 지정해야 하는 유일한 필수 설정입니다.
- 파티션 키 값이 같은 항목은 존재할 수 없음 (고유성 보장)
- DynamoDB는 이 키를 기반으로 데이터를 내부적으로 분산 저장함
- 정렬 키(Sort Key)를 추가하면 파티션 키 + 정렬 키의 **복합 키(Composite Key)**로 고유성을 판단
비유: 도서관에서 책을 찾을 때 사용하는 "청구 기호"와 같습니다. 청구 기호만 알면 책의 위치를 바로 알 수 있듯이, 파티션 키만 알면 해당 데이터를 바로 찾을 수 있습니다.
4-3. 항목(Item)
하나의 데이터 레코드입니다. RDB의 행(Row)에 해당합니다.
- 파티션 키를 반드시 포함해야 함
- 나머지 속성은 자유롭게 추가/생략 가능
- 항목 하나의 최대 크기는 400KB
4-4. 속성(Attribute)
항목 내의 개별 데이터 필드입니다. RDB의 컬럼(Column)에 해당하지만, 결정적인 차이가 있습니다.
| RDB의 컬럼 | DynamoDB의 속성 |
|---|---|
| 모든 행에 동일한 컬럼 존재 | 항목마다 속성이 다를 수 있음 |
| 미리 정의된 타입만 허용 | 문자열, 숫자, 리스트, 맵 등 다양 |
| 컬럼 추가 시 ALTER TABLE 필요 | 새 항목에 새 속성을 그냥 넣으면 됨 |
이것이 바로 NoSQL의 유연성입니다. 항목 A에는 song_title 속성이 있지만, 항목 B에는 없어도 아무 문제가 없습니다.
5. 실습: Song DB 테이블 만들기
DynamoDB 콘솔에서 직접 테이블을 만들고 데이터를 넣어봅니다.
Step 1: 테이블 생성
- AWS 콘솔 접속 -> DynamoDB 서비스로 이동
- "테이블 만들기(Create table)" 클릭
- 설정 입력:
- 테이블 이름:
SongDB - 파티션 키:
artist_id(문자열 타입) - 나머지 설정은 기본값 유지 (온디맨드 모드 권장)
- 테이블 이름:
- "테이블 만들기" 클릭
온디맨드(On-Demand) 모드: 실제 사용한 만큼만 과금됩니다. 학습 목적에서는 이 모드가 적합합니다.
Step 2: 첫 번째 항목 추가
- 생성된
SongDB테이블 클릭 - "항목 탐색(Explore table items)" -> "항목 만들기(Create item)"
- 항목 입력:
json
{
"artist_id": "A001",
"artist": "아이유",
"song_title": "좋은 날"
}artist_id는 파티션 키이므로 자동으로 필드가 표시됩니다. "속성 추가(Add new attribute)" 를 눌러 artist와 song_title을 추가합니다.
Step 3: 두 번째 항목 추가
json
{
"artist_id": "A002",
"artist": "BTS",
"song_title": "Dynamite"
}Step 4: 세 번째 항목 추가 - NoSQL의 유연성 확인!
json
{
"artist_id": "A003",
"artist": "NewJeans"
}세 번째 항목에는 song_title 속성이 없습니다! RDB였다면 song_title 컬럼에 반드시 값을 넣거나 NULL로 지정해야 하지만, DynamoDB에서는 해당 속성 자체를 생략할 수 있습니다. 이것이 NoSQL의 핵심적인 유연성입니다.
Step 5: 스캔(Scan)과 필터링(Filtering) 조회
스캔(Scan) 은 테이블 전체를 순회하며 모든 항목을 가져오는 조회 방식입니다.
- "항목 탐색" 화면에서 "스캔(Scan)" 선택
- "실행(Run)" 클릭 -> 3개의 항목 모두 표시됨
필터 추가하기:
- "필터 추가(Add filter)" 클릭
- 속성 이름:
artist, 조건:같음(Equal), 값:아이유 - "실행" 클릭 ->
artist_id: A001항목만 표시됨
주의: 스캔은 테이블 전체를 읽으므로, 데이터가 많을수록 느리고 비용이 높아집니다. 실무에서는 쿼리(Query) 를 사용하여 파티션 키 기반으로 조회하는 것이 효율적입니다.
실습 결과 테이블 상태
| artist_id (파티션 키) | artist | song_title |
|---|---|---|
| A001 | 아이유 | 좋은 날 |
| A002 | BTS | Dynamite |
| A003 | NewJeans | (속성 없음) |
6. DynamoDB 비용 주의사항
중요: 실습 후 테이블을 반드시 삭제하세요!
DynamoDB는 테이블이 존재하는 것만으로도 비용이 발생할 수 있습니다.
- 프로비저닝 모드(Provisioned): 설정한 읽기/쓰기 용량에 따라 시간당 과금
- 온디맨드 모드(On-Demand): 실제 요청 수에 따라 과금 (테이블만 있고 요청이 없으면 비용 미미)
- 스토리지 비용: 저장된 데이터 용량에 따라 과금 (25GB까지 프리 티어 무료)
삭제 방법:
- DynamoDB 콘솔 -> 테이블 목록
SongDB선택 -> "삭제(Delete)" 클릭- 확인 메시지에 테이블 이름 입력 후 삭제
Part 2: IAM (Identity and Access Management)
1. IAM이 필요한 상황
실제 회사에서 AWS를 사용하는 상황을 가정해봅시다.
시나리오
회사에 세 명의 직원이 있습니다.
| 직원 | 역할 | 필요한 AWS 서비스 |
|---|---|---|
| 김개발 | 백엔드 개발자 | EC2 (서버 관리) |
| 이디자 | 웹 디자이너 | S3 (이미지 파일 저장) |
| 박운영 | 운영 담당 | EC2 + S3 + RDS 모두 |
문제 상황: 루트 계정 공유
가장 단순한 방법은 루트 계정(Root Account)의 아이디와 비밀번호를 모두에게 공유하는 것입니다. 하지만 이렇게 하면 심각한 문제가 발생합니다.
- 김개발이 실수로 S3의 중요한 파일을 삭제할 수 있음
- 이디자가 EC2 인스턴스를 잘못 종료할 수 있음
- 퇴사자가 여전히 모든 서비스에 접근 가능
- 누가 어떤 작업을 했는지 추적 불가
- 최소 권한 원칙(Principle of Least Privilege) 위반
최소 권한 원칙: 각 사용자에게 업무 수행에 꼭 필요한 최소한의 권한만 부여해야 한다는 보안 원칙입니다.
해결책: IAM
IAM을 사용하면 각 직원에게 개별 계정을 만들어주고, 필요한 서비스에만 접근할 수 있도록 권한을 제어할 수 있습니다.
2. IAM이란?
IAM(Identity and Access Management) 은 AWS 리소스에 대한 접근을 안전하게 제어하는 서비스입니다.
- Identity(신원): "누가" 접근하는가?
- Access(접근): "어디에" 접근할 수 있는가?
- Management(관리): 이를 어떻게 관리하는가?
IAM의 핵심 특징
- 무료 서비스: IAM 자체는 추가 비용이 전혀 없음
- 글로벌 서비스: 리전에 관계없이 전체 AWS 계정에 적용
- 세분화된 제어: 서비스별, 동작별(읽기/쓰기/삭제) 세밀한 권한 설정 가능
- 임시 자격 증명: 역할(Role) 기반의 임시 접근 권한 발급 가능
3. IAM 핵심 개념
IAM은 네 가지 핵심 구성 요소로 이루어져 있습니다.
3-1. 루트 사용자(Root User)
AWS 계정을 최초로 생성할 때 사용한 이메일 주소와 비밀번호로 로그인하는 계정입니다.
- AWS 계정의 모든 서비스와 리소스에 대한 완전한 접근 권한 보유
- 결제 정보 변경, 계정 해지 등 민감한 작업 수행 가능
- 일상 업무에는 절대 사용하지 않는 것이 AWS 보안 모범 사례(Best Practice)
비유: 건물의 마스터키와 같습니다. 모든 문을 열 수 있지만, 평소에는 금고에 보관하고 각 직원에게는 자기 사무실 키만 나눠주는 것이 안전합니다.
3-2. IAM 사용자(IAM User)
루트 사용자가 만든 하위 계정입니다. 각 사용자는 고유한 로그인 정보(사용자 이름 + 비밀번호)를 갖습니다.
- 처음 생성하면 아무 권한도 없음 (AWS 콘솔 로그인은 가능하지만 서비스 사용 불가)
- 정책(Policy)을 직접 연결하거나, 그룹에 소속시켜 권한 부여
- 프로그래밍 접근을 위한 액세스 키(Access Key) 발급 가능
3-3. 그룹(Group)
같은 권한이 필요한 IAM 사용자들의 묶음입니다.
- 그룹에 정책을 연결하면, 소속된 모든 사용자에게 해당 권한이 자동 적용
- 사용자를 그룹에 추가/제거하는 것만으로 권한 관리 가능
- 한 사용자가 여러 그룹에 소속될 수 있음
비유: 회사의 "부서"와 같습니다. "개발팀"에 소속되면 개발 서버 접근 권한을 받고, "디자인팀"에 소속되면 디자인 도구 접근 권한을 받는 것처럼요.
3-4. 정책(Policy)
어떤 AWS 서비스에 어떤 동작을 허용하거나 거부할지 정의한 JSON 문서입니다.
정책의 기본 구조를 예시로 살펴봅니다.
json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}| 필드 | 의미 | 예시 값 |
|---|---|---|
Effect | 허용 또는 거부 | Allow / Deny |
Action | 수행할 수 있는 동작 | s3:* (S3의 모든 동작), ec2:DescribeInstances (EC2 조회만) |
Resource | 대상 리소스 | * (모든 리소스), 특정 S3 버킷 ARN |
AWS는 자주 사용하는 권한 조합을 관리형 정책(AWS Managed Policy) 으로 미리 만들어두었습니다.
| 관리형 정책 이름 | 설명 |
|---|---|
AmazonS3FullAccess | S3의 모든 동작 허용 |
AmazonEC2FullAccess | EC2의 모든 동작 허용 |
AmazonDynamoDBFullAccess | DynamoDB의 모든 동작 허용 |
AdministratorAccess | 모든 AWS 서비스의 모든 동작 허용 |
AmazonS3ReadOnlyAccess | S3 읽기만 허용 (업로드/삭제 불가) |
4. IAM 접근 제어 흐름
IAM이 사용자의 요청을 어떻게 처리하는지 흐름을 따라가봅니다.
IAM의 권한 평가 규칙:
- 명시적 거부(Explicit Deny)가 최우선: 어떤 정책에서
Deny가 있으면 다른 정책의Allow보다 우선 - 명시적 허용(Explicit Allow): 정책에서
Allow가 있으면 접근 허용 - 암묵적 거부(Implicit Deny)가 기본값: 명시적으로
Allow하지 않은 모든 것은 자동 거부
이 규칙을 한 문장으로 요약하면: "허용하지 않은 것은 모두 거부되고, 거부한 것은 절대 허용되지 않는다."
5. 실습 흐름: IAM 그룹과 사용자 만들기
Step 1: 그룹 생성
- AWS 콘솔 -> IAM 서비스 이동
- 왼쪽 메뉴에서 "사용자 그룹(User groups)" 클릭
- "그룹 생성(Create group)" 클릭
- 설정 입력:
- 그룹 이름:
DesignGroup - 권한 정책 연결:
AmazonS3FullAccess검색 후 체크
- 그룹 이름:
- "그룹 생성" 클릭
이제 DesignGroup 그룹에 소속되는 모든 사용자는 자동으로 S3의 모든 권한을 갖게 됩니다.
Step 2: IAM 사용자 생성
- 왼쪽 메뉴에서 "사용자(Users)" 클릭
- "사용자 추가(Add users)" 클릭
- 설정 입력:
- 사용자 이름:
ai_school_user_1 - AWS Management Console에 대한 사용자 액세스 권한 제공 체크
- IAM 사용자를 생성하고 싶음 선택
- 사용자 지정 암호(Custom password) 입력 (임시 비밀번호)
- "사용자는 다음 로그인 시 새 암호를 생성해야 합니다" 체크
- 사용자 이름:
- "다음(Next)" 클릭
- "그룹에 사용자 추가" 에서
DesignGroup체크 - "다음" -> "사용자 생성" 클릭
중요: 사용자 생성 완료 화면에 표시되는 로그인 URL, 사용자 이름, 임시 비밀번호를 반드시 기록해두세요!
Step 3: IAM 사용자로 로그인
- 로그인 URL 에 접속 (형식:
https://<계정ID>.signin.aws.amazon.com/console) - IAM 사용자 이름:
ai_school_user_1 - 비밀번호: Step 2에서 설정한 임시 비밀번호 입력
- 새 비밀번호 설정 화면에서 본인이 원하는 비밀번호로 변경
Step 4: 권한 확인
S3 접근 테스트 (성공해야 정상):
- 상단 검색창에
S3입력 후 이동 - 버킷 목록이 정상적으로 표시됨
- 버킷 생성, 파일 업로드 등 모든 S3 작업 가능
EC2 접근 테스트 (실패해야 정상):
- 상단 검색창에
EC2입력 후 이동 - "You are not authorized to perform this operation" 또는 "API 오류" 메시지 표시
- 인스턴스 목록 조회, 생성 등 모든 EC2 작업 불가
이 결과가 정확히 예상대로라면, IAM이 정상적으로 동작하고 있는 것입니다. ai_school_user_1은 DesignGroup에 속해 있고, 이 그룹에는 AmazonS3FullAccess 정책만 연결되어 있으므로 S3만 사용 가능합니다.
Step 5: 정리 (실습 후 반드시 수행)
- 루트 계정으로 다시 로그인
- IAM -> 사용자 ->
ai_school_user_1삭제 - IAM -> 사용자 그룹 ->
DesignGroup삭제
6. 계정 별칭(Account Alias)
IAM 사용자가 AWS 콘솔에 로그인할 때, 기본 로그인 URL은 다음과 같습니다.
https://123456789012.signin.aws.amazon.com/console123456789012는 12자리 AWS 계정 ID입니다. 이 숫자를 매번 기억하고 입력하기는 매우 불편합니다.
별칭 설정 방법
- IAM 콘솔 -> 대시보드(Dashboard)
- 오른쪽에 있는 "AWS 계정" 섹션에서 "계정 별칭" 의 "만들기(Create)" 클릭
- 원하는 별칭 입력 (예:
my-company-aws) - "변경 사항 저장" 클릭
변경 결과
| 변경 전 | 변경 후 |
|---|---|
https://123456789012.signin.aws.amazon.com/console | https://my-company-aws.signin.aws.amazon.com/console |
별칭은 AWS 전체에서 고유해야 합니다. 이미 다른 계정에서 사용 중인 별칭은 사용할 수 없습니다.
팁: 별칭을 설정해도 12자리 계정 ID로의 로그인은 여전히 가능합니다. 별칭은 추가적인 편의 기능일 뿐입니다.
핵심 정리
DynamoDB 요약
| 개념 | 설명 |
|---|---|
| DynamoDB | AWS의 완전 관리형 Key-Value NoSQL 데이터베이스 |
| 테이블(Table) | 데이터 저장 단위 |
| 파티션 키(Partition Key) | 항목을 고유하게 식별하는 필수 키 |
| 항목(Item) | 하나의 데이터 레코드 (RDB의 Row) |
| 속성(Attribute) | 항목 내 필드, 항목마다 다를 수 있음 |
| 스키마 유연성 | 같은 테이블 내 항목마다 서로 다른 속성 가능 |
IAM 요약
| 개념 | 설명 |
|---|---|
| IAM | AWS 리소스 접근 권한 관리 서비스 (무료) |
| 루트 사용자(Root User) | 모든 권한 보유, 일상 사용 금지 |
| IAM 사용자(IAM User) | 개별 로그인 계정, 기본 권한 없음 |
| 그룹(Group) | 같은 권한의 사용자 묶음 |
| 정책(Policy) | 허용/거부 규칙을 정의한 JSON 문서 |
| 계정 별칭(Alias) | 12자리 숫자 대신 사용하는 로그인용 이름 |
비용 정리
| 서비스 | 비용 여부 | 주의사항 |
|---|---|---|
| DynamoDB | 유료 | 테이블 유지 시 비용 발생 가능, 실습 후 반드시 삭제 |
| IAM | 무료 | 추가 비용 없음, 안심하고 학습 가능 |