[AWS] S3 Cross Account Access

염도윤·2025년 9월 10일

🎯 개요

S3 Cross Account Access는 여러 AWS 계정을 사용하는 환경에서, 특정 계정이 소유한 S3 버킷에 다른 계정에서 접근해야 할 때 자주 사용됩니다. 이를 통해 각 계정 간 데이터 공유나 협업을 쉽게 할 수 있습니다.

🔍 언제 사용하나요?

1. 멀티 계정 구조

기업에서 보안 및 비용 관리를 위해 여러 AWS 계정을 운영하는 경우, 중앙 계정에서 S3 버킷을 생성하고 다른 계정이 해당 버킷에 접근해야 할 때 Cross Account Access를 설정합니다.

예시: 개발 계정과 운영 계정 간 데이터 공유

2. 데이터 공유

다른 AWS 계정에 데이터를 공유해야 할 때, S3 Cross Account Access를 설정해 특정 버킷에 접근할 수 있도록 권한을 부여할 수 있습니다.

3. 데이터 백업 및 복제

여러 계정에 걸쳐 데이터를 백업하거나 복제할 때, S3 Cross Account Access를 사용해 한 계정의 S3 버킷에서 다른 계정의 버킷으로 데이터를 전송하거나 동기화할 수 있습니다.

4. 보안 및 권한 관리

보안 및 권한 분리를 위해 각 계정마다 역할을 분리하고, 필요할 때만 S3 리소스에 접근 권한을 부여하여 보안을 강화할 수 있습니다.

5. 마이크로서비스 환경

각기 다른 팀이나 프로젝트가 개별 계정을 사용하는 마이크로서비스 아키텍처에서, 공통 데이터를 저장하는 S3 버킷을 하나의 계정에서 운영하고 각 계정이 접근하도록 설정할 수 있습니다.

📋 사전 요구사항

실습을 진행하기 전에 다음 사항들을 준비해주세요:

  • 동일하거나 다른 AWS 지역에 있는 두 개의 활성 AWS 계정
  • IAM Role 및 User에 대한 신뢰 관계 이해
  • Amazon Linux 2 환경 (실습 기준)

🏗️ 아키텍처 구성

graph TB
    A[Account A<br/>Source Bucket] --> |Cross Account Access| B[Account B<br/>Destination Bucket]
    A --> |IAM Role| C[yeom-accountA-s3]
    B --> |IAM Role| D[yeom-accountB-s3]
    C --> |AssumeRole| D

실습 구성:

  • A 계정 → Source Bucket
  • B 계정 → Destination Bucket
  • A 계정에서 B 계정으로 S3 데이터 마이그레이션

🔧 A 계정 설정

1. S3 버킷 생성

# S3 버킷 생성
aws s3api create-bucket \
  --bucket yeom-a-s3 \
  --region ap-northeast-2 \
  --create-bucket-configuration LocationConstraint=ap-northeast-2 \
  --profile yeom-a

2. B 계정 접근 정책 설정

정책 파일 생성:

# yeom-a-s3-access-b-s3.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "S3Access",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AccountB:role/yeom-accountB-s3"
      },
      "Action": [
        "s3:ListBucket",
        "s3:GetObject",
        "s3:GetObjectTagging",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionTagging"
      ],
      "Resource": [
        "arn:aws:s3:::yeom-a-s3",
        "arn:aws:s3:::yeom-a-s3/*"
      ]
    }
  ]
}

3. IAM 역할 생성

신뢰 관계 정책:

# yeom-a-role-access-b.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AccountB:user/yeom"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

역할 생성:

aws iam create-role \
  --role-name yeom-accountA-s3 \
  --assume-role-policy-document file://yeom-a-role-access-b.json \
  --profile yeom-a

응답 예시:

{
  "Role": {
    "Path": "/",
    "RoleName": "yeom-accountA-s3",
    "RoleId": "AROA3BSYMHURZ74RTAQ7X",
    "Arn": "arn:aws:iam::AccountA:role/yeom-accountA-s3",
    "CreateDate": "2024-09-21T10:22:06+00:00",
    "AssumeRolePolicyDocument": {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::AccountB:user/yeom"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
  }
}

🔧 B 계정 설정

1. IAM 역할 생성

신뢰 관계 정책:

# yeom-b-role-access-a.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AccountB:user/yeom-a"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

역할 생성:

aws iam create-role \
  --role-name yeom-accountB-s3 \
  --assume-role-policy-document file://yeom-b-role-access-a.json \
  --profile yeom-b

2. S3 버킷 생성

aws s3api create-bucket \
  --bucket yeom-b-s3 \
  --region ap-northeast-2 \
  --create-bucket-configuration LocationConstraint=ap-northeast-2 \
  --profile yeom-b

3. A 계정 접근 정책 설정

버킷 정책:

# yeom-b-s3-access-a-s3.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AccountA:root"
      },
      "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:PutObjectTagging",
        "s3:GetObjectTagging",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionTagging"
      ],
      "Resource": [
        "arn:aws:s3:::yeom-b-s3",
        "arn:aws:s3:::yeom-b-s3/*"
      ]
    }
  ]
}

정책 적용:

# 버킷 정책 적용
aws s3api put-bucket-policy \
  --bucket yeom-b-s3 \
  --policy file://yeom-b-s3-access-a-s3.json \
  --profile yeom-b

# 정책 확인
aws s3api get-bucket-policy \
  --bucket yeom-b-s3 \
  --profile yeom-b

📁 테스트 파일 업로드

# A 계정 S3에 테스트 파일 업로드
aws s3 cp ~/Desktop/1.jpg s3://yeom-a-s3 --profile yeom-a

# 파일 확인
aws s3 ls s3://yeom-a-s3 --profile yeom-a
# 출력: 2024-09-21 19:50:01 13788 1.jpg

🔄 Cross Account 데이터 마이그레이션

1. STS AssumeRole로 임시 권한 획득

aws sts assume-role \
  --role-arn "arn:aws:iam::AccountB:role/yeom-accountB-s3" \
  --role-session-name AWSCLI-session \
  --profile yeom-a

2. 환경 변수 설정

export AWS_ACCESS_KEY_ID=ASIA4RSDH4TSVI6UV35S
export AWS_SECRET_ACCESS_KEY=4pq3FaJURJoUBtEFBHhA8fC+kBVnVd/jYViy1ccn
export AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEFMaDmFwLW5vcnRoZWFzdC0yIkYw~

3. 역할 확인

aws sts get-caller-identity

응답:

{
  "UserId": "AROA4RSDH4TS3O7DQPAHA:AWSCLI-session",
  "Account": "862355711205",
  "Arn": "arn:aws:sts::AccountB:assumed-role/yeom-accountB-s3/AWSCLI-session"
}

4. S3 Sync로 데이터 마이그레이션

aws s3 sync s3://yeom-a-s3/ s3://yeom-b-s3/ \
  --source-region ap-northeast-2 \
  --region us-east-2 \
  --profile yeom-a

출력:

copy: s3://yeom-a-s3/1.jpg to s3://yeom-b-s3/1.jpg

✅ 결과 검증

# A 계정 프로파일로 B 계정 버킷 확인 (임시 권한 사용)
aws s3 ls s3://yeom-b-s3 --profile yeom-a
# 출력: 2024-09-21 20:12:48 13788 1.jpg

# B 계정 프로파일로 확인
aws s3 ls s3://yeom-b-s3 --profile yeom-b
# 출력: 2024-09-21 20:12:48 13788 1.jpg

🔐 보안 모범 사례

1. 최소 권한 원칙

  • 필요한 최소한의 권한만 부여
  • 특정 리소스에 대해서만 접근 허용

2. 시간 제한 설정

{
  "Condition": {
    "DateLessThan": {
      "aws:CurrentTime": "2024-12-31T23:59:59Z"
    }
  }
}

3. IP 주소 제한

{
  "Condition": {
    "IpAddress": {
      "aws:SourceIp": "203.0.113.0/24"
    }
  }
}

4. MFA 요구

{
  "Condition": {
    "Bool": {
      "aws:MultiFactorAuthPresent": "true"
    }
  }
}

🚨 주의사항

  1. 계정 ID 확인: 정책에서 계정 ID를 정확히 입력했는지 확인
  2. 리전 일치: 버킷과 역할이 동일한 리전에 있는지 확인
  3. 권한 전파 시간: IAM 정책 변경 후 전파되는 시간 고려 (최대 몇 분)
  4. 버킷 정책 크기 제한: 20KB 이하로 유지
  5. 로그 모니터링: CloudTrail을 통한 Cross Account 접근 로깅

📚 추가 활용 사례

1. 자동화된 백업 시스템

#!/bin/bash
# 매일 자정에 실행되는 크론잡
0 0 * * * /usr/local/bin/backup-cross-account.sh

2. CI/CD 파이프라인 연동

# GitHub Actions 예시
- name: Deploy to Production S3
  run: |
    aws sts assume-role --role-arn $PROD_ROLE_ARN --role-session-name github-actions
    aws s3 sync ./dist/ s3://prod-bucket/

3. 데이터 레이크 구축

여러 부서의 데이터를 중앙 집중화된 데이터 레이크로 수집

💡 마무리

S3 Cross Account Access는 엔터프라이즈 환경에서 필수적인 기능입니다. 올바른 권한 설정과 보안 모범 사례를 따라 안전하고 효율적인 다중 계정 아키텍처를 구축할 수 있습니다.

이 가이드를 통해 AWS 다중 계정 환경에서의 S3 데이터 공유 방법을 마스터하시길 바랍니다!


profile
AWS SA

0개의 댓글