Skip to content

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의 근본적인 차이를 시각적으로 이해합니다.

핵심 차이점 정리:

구분RDBNoSQL (DynamoDB)
스키마고정 (미리 정의 필수)유연 (항목마다 다를 수 있음)
확장 방식수직적 확장 중심수평적 확장 용이
데이터 관계Join으로 테이블 간 연결독립적 항목 (Join 없음)
적합한 용도정형 데이터, 복잡한 관계대용량, 유연한 형태의 데이터

3. DynamoDB란?

DynamoDB는 AWS가 제공하는 완전 관리형(Fully Managed) Key-Value NoSQL 데이터베이스 서비스입니다.

Key-Value 구조 이해하기

DynamoDB의 구조는 프로그래밍 언어에서 이미 친숙한 자료구조와 같습니다.

언어자료구조예시
Pythondict (Dictionary){"artist_id": "001", "name": "아이유"}
JavaHashMapmap.put("artist_id", "001")
JavaScriptObject{ 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: 테이블 생성

  1. AWS 콘솔 접속 -> DynamoDB 서비스로 이동
  2. "테이블 만들기(Create table)" 클릭
  3. 설정 입력:
    • 테이블 이름: SongDB
    • 파티션 키: artist_id (문자열 타입)
    • 나머지 설정은 기본값 유지 (온디맨드 모드 권장)
  4. "테이블 만들기" 클릭

온디맨드(On-Demand) 모드: 실제 사용한 만큼만 과금됩니다. 학습 목적에서는 이 모드가 적합합니다.

Step 2: 첫 번째 항목 추가

  1. 생성된 SongDB 테이블 클릭
  2. "항목 탐색(Explore table items)" -> "항목 만들기(Create item)"
  3. 항목 입력:
json
{
  "artist_id": "A001",
  "artist": "아이유",
  "song_title": "좋은 날"
}

artist_id는 파티션 키이므로 자동으로 필드가 표시됩니다. "속성 추가(Add new attribute)" 를 눌러 artistsong_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) 은 테이블 전체를 순회하며 모든 항목을 가져오는 조회 방식입니다.

  1. "항목 탐색" 화면에서 "스캔(Scan)" 선택
  2. "실행(Run)" 클릭 -> 3개의 항목 모두 표시됨

필터 추가하기:

  1. "필터 추가(Add filter)" 클릭
  2. 속성 이름: artist, 조건: 같음(Equal), 값: 아이유
  3. "실행" 클릭 -> artist_id: A001 항목만 표시됨

주의: 스캔은 테이블 전체를 읽으므로, 데이터가 많을수록 느리고 비용이 높아집니다. 실무에서는 쿼리(Query) 를 사용하여 파티션 키 기반으로 조회하는 것이 효율적입니다.

실습 결과 테이블 상태

artist_id (파티션 키)artistsong_title
A001아이유좋은 날
A002BTSDynamite
A003NewJeans(속성 없음)

6. DynamoDB 비용 주의사항

중요: 실습 후 테이블을 반드시 삭제하세요!

DynamoDB는 테이블이 존재하는 것만으로도 비용이 발생할 수 있습니다.

  • 프로비저닝 모드(Provisioned): 설정한 읽기/쓰기 용량에 따라 시간당 과금
  • 온디맨드 모드(On-Demand): 실제 요청 수에 따라 과금 (테이블만 있고 요청이 없으면 비용 미미)
  • 스토리지 비용: 저장된 데이터 용량에 따라 과금 (25GB까지 프리 티어 무료)

삭제 방법:

  1. DynamoDB 콘솔 -> 테이블 목록
  2. SongDB 선택 -> "삭제(Delete)" 클릭
  3. 확인 메시지에 테이블 이름 입력 후 삭제

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) 으로 미리 만들어두었습니다.

관리형 정책 이름설명
AmazonS3FullAccessS3의 모든 동작 허용
AmazonEC2FullAccessEC2의 모든 동작 허용
AmazonDynamoDBFullAccessDynamoDB의 모든 동작 허용
AdministratorAccess모든 AWS 서비스의 모든 동작 허용
AmazonS3ReadOnlyAccessS3 읽기만 허용 (업로드/삭제 불가)

4. IAM 접근 제어 흐름

IAM이 사용자의 요청을 어떻게 처리하는지 흐름을 따라가봅니다.

IAM의 권한 평가 규칙:

  1. 명시적 거부(Explicit Deny)가 최우선: 어떤 정책에서 Deny가 있으면 다른 정책의 Allow보다 우선
  2. 명시적 허용(Explicit Allow): 정책에서 Allow가 있으면 접근 허용
  3. 암묵적 거부(Implicit Deny)가 기본값: 명시적으로 Allow하지 않은 모든 것은 자동 거부

이 규칙을 한 문장으로 요약하면: "허용하지 않은 것은 모두 거부되고, 거부한 것은 절대 허용되지 않는다."


5. 실습 흐름: IAM 그룹과 사용자 만들기

Step 1: 그룹 생성

  1. AWS 콘솔 -> IAM 서비스 이동
  2. 왼쪽 메뉴에서 "사용자 그룹(User groups)" 클릭
  3. "그룹 생성(Create group)" 클릭
  4. 설정 입력:
    • 그룹 이름: DesignGroup
    • 권한 정책 연결: AmazonS3FullAccess 검색 후 체크
  5. "그룹 생성" 클릭

이제 DesignGroup 그룹에 소속되는 모든 사용자는 자동으로 S3의 모든 권한을 갖게 됩니다.

Step 2: IAM 사용자 생성

  1. 왼쪽 메뉴에서 "사용자(Users)" 클릭
  2. "사용자 추가(Add users)" 클릭
  3. 설정 입력:
    • 사용자 이름: ai_school_user_1
    • AWS Management Console에 대한 사용자 액세스 권한 제공 체크
    • IAM 사용자를 생성하고 싶음 선택
    • 사용자 지정 암호(Custom password) 입력 (임시 비밀번호)
    • "사용자는 다음 로그인 시 새 암호를 생성해야 합니다" 체크
  4. "다음(Next)" 클릭
  5. "그룹에 사용자 추가" 에서 DesignGroup 체크
  6. "다음" -> "사용자 생성" 클릭

중요: 사용자 생성 완료 화면에 표시되는 로그인 URL, 사용자 이름, 임시 비밀번호를 반드시 기록해두세요!

Step 3: IAM 사용자로 로그인

  1. 로그인 URL 에 접속 (형식: https://<계정ID>.signin.aws.amazon.com/console)
  2. IAM 사용자 이름: ai_school_user_1
  3. 비밀번호: Step 2에서 설정한 임시 비밀번호 입력
  4. 새 비밀번호 설정 화면에서 본인이 원하는 비밀번호로 변경

Step 4: 권한 확인

S3 접근 테스트 (성공해야 정상):

  1. 상단 검색창에 S3 입력 후 이동
  2. 버킷 목록이 정상적으로 표시됨
  3. 버킷 생성, 파일 업로드 등 모든 S3 작업 가능

EC2 접근 테스트 (실패해야 정상):

  1. 상단 검색창에 EC2 입력 후 이동
  2. "You are not authorized to perform this operation" 또는 "API 오류" 메시지 표시
  3. 인스턴스 목록 조회, 생성 등 모든 EC2 작업 불가

이 결과가 정확히 예상대로라면, IAM이 정상적으로 동작하고 있는 것입니다. ai_school_user_1DesignGroup에 속해 있고, 이 그룹에는 AmazonS3FullAccess 정책만 연결되어 있으므로 S3만 사용 가능합니다.

Step 5: 정리 (실습 후 반드시 수행)

  1. 루트 계정으로 다시 로그인
  2. IAM -> 사용자 -> ai_school_user_1 삭제
  3. IAM -> 사용자 그룹 -> DesignGroup 삭제

6. 계정 별칭(Account Alias)

IAM 사용자가 AWS 콘솔에 로그인할 때, 기본 로그인 URL은 다음과 같습니다.

https://123456789012.signin.aws.amazon.com/console

123456789012는 12자리 AWS 계정 ID입니다. 이 숫자를 매번 기억하고 입력하기는 매우 불편합니다.

별칭 설정 방법

  1. IAM 콘솔 -> 대시보드(Dashboard)
  2. 오른쪽에 있는 "AWS 계정" 섹션에서 "계정 별칭""만들기(Create)" 클릭
  3. 원하는 별칭 입력 (예: my-company-aws)
  4. "변경 사항 저장" 클릭

변경 결과

변경 전변경 후
https://123456789012.signin.aws.amazon.com/consolehttps://my-company-aws.signin.aws.amazon.com/console

별칭은 AWS 전체에서 고유해야 합니다. 이미 다른 계정에서 사용 중인 별칭은 사용할 수 없습니다.

: 별칭을 설정해도 12자리 계정 ID로의 로그인은 여전히 가능합니다. 별칭은 추가적인 편의 기능일 뿐입니다.


핵심 정리

DynamoDB 요약

개념설명
DynamoDBAWS의 완전 관리형 Key-Value NoSQL 데이터베이스
테이블(Table)데이터 저장 단위
파티션 키(Partition Key)항목을 고유하게 식별하는 필수 키
항목(Item)하나의 데이터 레코드 (RDB의 Row)
속성(Attribute)항목 내 필드, 항목마다 다를 수 있음
스키마 유연성같은 테이블 내 항목마다 서로 다른 속성 가능

IAM 요약

개념설명
IAMAWS 리소스 접근 권한 관리 서비스 (무료)
루트 사용자(Root User)모든 권한 보유, 일상 사용 금지
IAM 사용자(IAM User)개별 로그인 계정, 기본 권한 없음
그룹(Group)같은 권한의 사용자 묶음
정책(Policy)허용/거부 규칙을 정의한 JSON 문서
계정 별칭(Alias)12자리 숫자 대신 사용하는 로그인용 이름

비용 정리

서비스비용 여부주의사항
DynamoDB유료테이블 유지 시 비용 발생 가능, 실습 후 반드시 삭제
IAM무료추가 비용 없음, 안심하고 학습 가능