[S3] AWS 크로스 계정 S3 데이터 접근 가이드
Prerequisite
본 가이드를 진행하기 전에 다음 항목이 준비되어 있어야 합니다:
- 두 개의 AWS 계정 접근 권한: 소스 계정(데이터 소유)과 대상 계정(데이터 접근)의 관리자 권한이 필요합니다
- 계정 ID 확인: 각 계정의 AWS 계정 ID를 알고 있어야 합니다 (예: 123456789012)
- IAM 권한: 두 계정 모두에서 IAM Role, IAM Policy, S3 Bucket Policy를 수정할 수 있는 권한이 필요합니다
- S3 버킷 정보: 소스 계정의 S3 버킷 이름과 대상 데이터의 경로를 알고 있어야 합니다
Process
1단계: 계정 정보 확인 및 정리
크로스 계정 작업을 시작하기 전에 필요한 정보를 정리합니다.
소스 계정 정보 확인
- 소스 계정(데이터 소유)의 AWS 콘솔에 접속합니다
- 우측 상단의 계정 이름을 클릭하고 계정 또는 My Account 메뉴를 선택합니다

- 계정 ID (12자리 숫자)를 확인하고 메모합니다 (예: 123456789123)

- S3 콘솔로 이동하여 데이터가 있는 버킷 이름을 확인합니다 (예:
company-data-bucket)
- 버킷 내 데이터의 경로(Prefix)를 확인합니다 (예:
data/images/)
대상 계정 정보 확인
- 대상 계정(데이터 접근)의 AWS 콘솔에 접속합니다

- 계정 ID를 확인하고 메모합니다 (예:
088646600584)
- 필요하면 데이터를 복사할 목적지 S3 버킷 이름을 확인합니다
정보 정리 예시
소스 계정 (Source Account):
- 계정 ID: 123123123123
- 계정 이름: source-account
- 버킷 이름: source-account-bucket
- 데이터 경로: data/training-data/
대상 계정 (Destination Account):
- 계정 ID: 321321321321
- 계정 이름: destination-account
- 버킷 이름: destination-account-bucket
2단계: 소스 계정 설정 (Bucket Policy 수정)
소스 계정에서 S3 버킷 정책을 수정하여 대상 계정에 접근 권한을 부여합니다.
S3 Bucket Policy 추가
- 소스 계정으로 AWS 콘솔에 접속합니다
- S3 서비스로 이동하고 대상 버킷(예:
company-data-bucket)을 선택합니다 - Permissions(권한) 탭을 클릭합니다

- Bucket Policy(버킷 정책) 섹션에서 Edit(편집) 버튼을 클릭합니다

- 다음 정책 문서를 기존 정책에 추가합니다 (기존 정책이 있으면 Statement 배열에 추가):
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCrossAccountRead", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::[Destination Account ID]:root" }, "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::source-data-bucket", "arn:aws:s3:::source-data-bucket/*" ] } ] }
정책 설명
Principal: 대상 계정의 AWS 계정 ARN321321321321를 실제 대상 계정 ID로 변경합니다
Action: 허용하는 작업 (사용 사례별로 다음 항목 중 선택)- 읽기 관련 작업
s3:GetObject: 객체(파일) 다운로드 및 읽기s3:GetObjectVersion: 객체의 특정 버전 다운로드 (버전 관리 활성화 시)s3:ListBucket: 버킷의 객체 목록 조회s3:GetBucketVersioning: 버킷의 버전 관리 설정 확인s3:GetBucketLocation: 버킷의 리전 정보 확인
- 메타데이터 관련 작업
s3:GetObjectTagging: 객체의 태그 정보 조회s3:GetObjectMetadata: 객체의 메타데이터 확인s3:HeadObject: 객체의 존재 여부 및 기본 정보 확인 (다운로드 없이)s3:HeadBucket: 버킷의 존재 여부 및 접근 권한 확인
- 쓰기 관련 작업 (필요한 경우만 추가)
s3:PutObject: 객체 업로드 또는 생성s3:PutObjectTagging: 객체에 태그 추가s3:DeleteObject: 객체 삭제s3:DeleteObjectVersion: 객체의 특정 버전 삭제
- 대량 작업 관련
s3:ListBucketVersions: 버킷의 모든 버전 목록 조회s3:GetObjectAcl: 객체의 접근 제어 목록 확인s3:ListBucketMultipartUploads: 진행 중인
- 읽기 관련 작업
Resource: 권한이 적용되는 S3 리소스- 버킷 자체와 버킷 내 모든 객체에 권한을 부여합니다
- 정책 입력을 확인하고 Save changes 버튼을 클릭합니다

3단계: 대상 계정 IAM 역할 생성 (Cross-Account IAM Role)
대상 계정에서 EC2 인스턴스나 로컬 환경이 소스 계정의 S3에 접근할 수 있도록 IAM Role을 생성합니다.
IAM Role 생성
-
대상 계정의 AWS 콘솔에 접속합니다

-
IAM 서비스로 이동합니다

-
왼쪽 메뉴에서 Roles을 클릭합니다

-
Create role 버튼을 클릭합니다

-
신뢰할 수 있는 엔티티 선택:

- AWS Service를 선택합니다
- 사용 사례에서 EC2 (EC2 인스턴스에서 사용할 경우) 또는 Lambda (Lambda 함수에서 사용할 경우)를 선택합니다
-
Next 버튼을 클릭합니다
-
이 단계에서는 Role이 S3에 접근하기 위한 권한을 부여합니다.

Permissions policie 페이지에서 검색창을 사용하여 기존 정책을 찾거나, 새로운 정책을 생성할 수 있습니다
- 옵션 A: 기존 AWS 관리 정책 사용 (빠른 방법)
- 이미 AWS에서 제공하는 정책을 사용하려면:
- 검색창에서 정책명을 입력합니다
- 읽기 전용:
AmazonS3ReadOnlyAccess - 전체 접근:
AmazonS3FullAccess - 체크박스를 클릭하여 정책을 선택합니다
- 읽기 전용:
- 옵션 A: 기존 AWS 관리 정책 사용 (빠른 방법)
-
역할의 이름을 입력하고 역할을 생성합니다.

-
방금 생성한 권한을 선택후 권한 추가와 인라인정책 생성을 클릭합니다.

-
JSON 탭을 선택하고 다음 정책을 입력합니다:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadFromSourceBucket", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::source-data-bucket", "arn:aws:s3:::source-data-bucket/*" ] } ] }
-
다음을 클릭후 정책 이름을 입력합니다 (예:
CrossAccountS3ReadPolicy)
-
Create policy 버튼을 클릭합니다
4단계 : EC2 IAM 수정
-
AWS Console에 로그인하고 EC2 서비스로 이동합니다.

-
좌측 메뉴에서 인스턴스(Instances)를 클릭합니다.

-
인스턴스 목록에서 IAM 역할을 변경할 대상 인스턴스를 찾아 체크하고 작업->보안->IAM 역할 수정을 클릭합니다.

-
3단계에서 만들었든 IAM Role을 찾아 IAM 역할 업데이트를 클릭합니다.
5단계 : 크로스 리전 S3 연결 확인
-
대상 계정에 인스턴스에 SSH로 접속을 위해 아래 명령어로 입력합니다. •
ssh -i [다운로드한 키 경로/내키이름.pem] ec2-user@서버아이피
예시 :
ssh -i /Users/bradkim/Downloads/test-brad-kim.pem [ubuntu@54.180.31.115](<mailto:ubuntu@54.180.31.115>)

2. 연결 확인을 합니다.
source 계정의 s3 버킷 내용이 보이면 성공입니다.
aws s3 ls s3://source-account-s3

3. CLI 명령어로 데이터 사용 (내 S3처럼 접근)
별도의 비밀번호나 키 입력은 필요 없습니다. Source 계정의 S3를 다룰 때와 똑같은 명령어로, 버킷 이름만 지정해서 사용하면 됩니다.