개인 공부 목적으로 작성된 글입니다. 왜곡된 내용이 포함되어 있습니다.
1. S3 마이그레이션
"아워메뉴" 프로젝트에는 사진 데이터 저장 및 조회 목적으로 S3를 사용하고 있다. 기존 계정에서 사용했던 S3 버킷 데이터를 새 계정 S3 버킷에 이동할 수 있는 방법 중, 가장 먼저 떠올랐던 것은 AWS DataSync였다.
AWS DataSync는 AWS에서 지원하는 마이그레이션 서비스인데, 기존 S3 버킷 용량이 대용량이 아니기 때문에 다소 오버엔지니어링이라 고 생각할 수 있지만 마이그레이션 도구를 사용해보는 것에 의의를 두고 진행하였다.
자습서:에서 Amazon S3 버킷 간에 데이터 전송 AWS 계정 - AWS DataSync
이 자습서의 메서드를 AWS 계정 사용하여 로 데이터를 전송하는 것은 Amazon S3에서만 작동합니다. 또한 이 자습서는 서로 다른 AWS 리전의 S3 버킷 간에 데이터를 전송하는 데 도움이 될 수 있습니다
docs.aws.amazon.com
IAM 생성
소스 계정(기존 S3 계정)에서 DataSync 를 통해 전달한 목적지 S3에 대한 IAM Role을 생성한다.
이때 role을 생성하는 것은 대상 계정(새 S3 계정)에서 소스계정(기존 S3 계정)에서 생성한 권한을 크로스 계정 리소스 엑세스를 위해 공유하기 위함이다.
IAM의 크로스 계정 리소스 액세스 - AWS Identity and Access Management
신뢰 관계가 설정된 엔터티에만 액세스 권한을 부여하고 필요한 최소 수준의 액세스 권한만 부여합니다. 신뢰할 수 있는 엔터티가 다른 AWS 계정인 경우에는 어떠한 IAM 보안 주체에게든 리소스
docs.aws.amazon.com
IAM Role 생성시에 사용사례중 DataSync를 선택하여 Role을 생성한 뒤, 소스 계정(기존 S3 계정)의 S3에 대한 권한을 인라인 정책 추가로 추가해준다.
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket"
},
{
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:GetObjectTagging",
"s3:PutObjectTagging"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
}
]
}
이때 정책의 Resoure에 대상 버킷에 대한 arn을 수정한다
대상 계정에서 크로스 계정 리소스 접근을 위한 설정을 해줘야한다.
소스 계정(기존 S3 계정)에서 생성한 IAM Role을 대상 계정(새 S3 계정)의 S3 버킷 정책을 수정하여 추가한다.
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "DataSyncCreateS3LocationAndTaskAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::source-account:role/source-datasync-role"
},
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:GetObjectTagging",
"s3:PutObjectTagging"
],
"Resource": [
"arn:aws:s3:::amzn-s3-demo-destination-bucket",
"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
]
}
]
}
마찬가지로 arn과 Principal에 소스 계정(기존 S3 계정)의 Iam Role arn으로 수정한다.
DataSync 생성
DataSync 콘솔에서 위치를 생성한다. 이때 S3 URI는 소스 계정(기존 S3 계정) S3 URI를 설정하고, 앞서 생성한 IAM Role을 설정한다.
대상 위치는 다른 계정의 S3 URI를 설정해야 하기 때문에 콘솔로 생성할 수 없고, aws cli를 사용해 생성한다.
aws datasync create-location-s3 \
--s3-bucket-arn arn:aws:s3:::s3-URI \
--region ap-northeast-2 \
--s3-config '{
"BucketAccessRoleArn":"arn:aws:iam::ID:role/role-name"
}'
DataSync 콘솔로 돌아오면 소스 계정(새 S3 계정)의 위치도 생성된 것을 확인 할 수 있다.
이제 태스크 생성하여 소스 위치 구성, 대상 위치 구성을 방급 생성한 위치로 설정한다.
설정 구성에서 현재 마이그레이션 작업이 빠른 성능을 요구하지 않기 때문에, 태스크 모드만 기본 모드로 변경하였다.
생성한 태스크에 대해서 시작을 통해 마이그레이션을 실행할 수 있다.
실행한 태스크에 대해 기록을 통해 성공 여부 및 Cloudwatch를 통해 로그를 확인할 수 있다.
나는 총 2개에 대한 S3 버킷 마이그레이션을 진행하였다.
2. DB S3 URL 전처리
S3 마이그레이션 관련하여 작업할 것이 하나 더 있다. 이전에 마이그레이션한 DB에 대해 S3 URL을 사용하는 모든 URL의 대해 버킷 경로를 변경해야한다.
UPDATE menu_folder
SET img_url = REPLACE(
img_url,
'기존 버킷 주소',
'새 버킷 주소'
)
WHERE img_url IS NOT NULL
AND img_url LIKE '%기존 버킷 주소%';
해당 테이블 이외에도 이미지를 사용하는 테이블에 대해 UPDATE 쿼리를 통해 S3 주소 값을 변경을 진행했다.
'인프라 > AWS' 카테고리의 다른 글
[AWS] AWS 프리티어 마이그레이션-1 (예약 인스턴스, RDS, Elasticache) (0) | 2025.05.14 |
---|---|
[AWS] AWS SAA-C03 합격 후기 (1) | 2025.04.22 |
[AWS] API Gateway, Lambda 및 DynamoDB를 사용한 CRUD HTTP API 생성 (0) | 2025.04.07 |