본문 바로가기

AWS

[AWS] S3 - Cross Account Access

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 버킷을 하나의 계정에서 운영하고 각 계정이 접근하도록 설정할 수 있습니다.


실습을 진행하기 전에 하위에 있는 부분을 참조 부탁드립니다.

  1. 동일하거나 다른 AWS 지역에 있는 두 개의 활성 AWS 계정
  2. IAM Role 및 User에 대한 신뢰 관계를 이해하고 있어야 합니다.
  3. A 계정에서 B계정으로 S3 버킷
  4. A 계정 -> Source Bucket
  5. Amazon Linux 2 기준으로 진행

 

A 계정

  • S3 생성
S3 생성
aws s3api create-bucket --bucket yeom-a-s3 --region ap-northeast-2 --create-bucket-configuration LocationConstraint=ap-northeast-2 --profile yeom-a
  • B계정에서 접근할 수 있도록 정책 설정
정책 생성
vi 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/*"
      ]
    }
  ]
}
  • 정책 설정 및 역할 생성
정책 생성
vi 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 계정

  • Role 생성 및 정책 설정
정책 생성
vi 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
{
    "Role": {
        "Path": "/",
        "RoleName": "yeom-accountB-s3",
        "RoleId": "AROA4RSDH4TS3O7DQPAHA",
        "Arn": "arn:aws:iam::AccountB:role/yeom-accountB-s3",
        "CreateDate": "2024-09-21T10:31:45+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "AWS": "arn:aws:iam::AccountA:user/yeom-a"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    }
}
  • S3 생성
S3 생성
aws s3api create-bucket --bucket yeom-b-s3 --region ap-northeast-2 --create-bucket-configuration LocationConstraint=ap-northeast-2 --profile yeom-b
  • A 계정의 S3에서 접근할 수 있도록 정책 설정
정책 생성
vi 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/*"
            ]
        }
    ]
}
생성한 정책 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
{
    "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::759320821027:root\"},\"Action\":[\"s3:GetObject\",\"s3:PutObject\"],\"Resource\":[\"arn:aws:s3:::yeom-b-s3\",\"arn:aws:s3:::yeom-b-s3/*\"]}]}"
}

 

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

 

임시권한을 사용한 데이터 마이그레이션

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

export AWS_ACCESS_KEY_ID=ASIA4RSDH4TSVI6UV35S
export AWS_SECRET_ACCESS_KEY=4pq3FaJURJoUBtEFBHhA8fC+kBVnVd/jYViy1ccn
export AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEFMaDmFwLW5vcnRoZWFzdC0yIkYw~
  • sts get-caller-identity
aws sts get-caller-identity
{
    "UserId": "AROA4RSDH4TS3O7DQPAHA:AWSCLI-session",
    "Account": "862355711205",
    "Arn": "arn:aws:sts::AccountB:assumed-role/yeom-accountB-s3/AWSCLI-session"
}
  • 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
  • B 계정 버킷의 파일 확인
임시권한을 얻었기에 A계정 프로파일을 이용해서도 확인할 수 있음

aws s3 ls s3://yeom-b-s3 --profile yeom-a
2024-09-21 20:12:48      13788 1.jpg

aws s3 ls s3://yeom-b-s3 --profile yeom-b
2024-09-21 20:12:48      13788 1.jpg