프로젝트 서버를 이사하면서 다른건 다 옮겼는데 S3 를 팀원의 계정으로 사용하고 있어서 그것마저 옮기려고 한다.
준비
1. 기존 S3 데이터가 존재하는 AWS 계정
2. 타겟 AWS 계정
3. 타겟 AWS 계정의 EC2
를 준비해준다.
과정
1. 기존 AWS 계정 S3 Bucket 에 Policy 등록
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DelegateS3Access",
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:GetObjectTagging"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::{기존 버킷 이름}",
"arn:aws:s3:::{기존 버킷 이름}/*"
],
"Principal": {
"AWS": [
"{타겟 AWS 계정 ID}"
]
}
}
]
}
* AWS 계정 ID 는 AWS 의 아무 페이지의 우측 상단에 계정을 눌러보면 나온다.
2. 타겟 계정 IAM Policy 등록
IAM 사용자를 하나 만들어주고 새로운 정책을 등록하여 적용시켜 준다.
이름은 S3SyncPolicy 등으로 설정한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DestinationBucketAccess",
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:DeleteObject",
"s3:GetObjectAcl"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::{타겟 버킷 이름}",
"arn:aws:s3:::{타겟 버킷 이름}/*"
]
},
{
"Sid": "SourceBucketAccess",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::{기존 버킷 이름}",
"arn:aws:s3:::{기존 버킷 이름}/*"
]
}
]
}
3. S3 Sync 명령어 실행
타겟 EC2 에 접속해
aws s3 sync s3://{기존 버킷 이름} s3://{타겟 버킷 이름} --region ap-northeast-2 --dryrun
명령어를 실행시켜준다.
Troubleshoot
위 명령어를 실행했더니
fatal error: Unable to locate credentials
에러가 뜬다.
AWS CLI 가 필요한 자격 증명을 찾을 수 없기 때문인데
처음에 EC2 를 생성할 때 EC2 (Amazon Linux AMI) 로 생성하였다면 별도로 설정할 필요가 없지만
필자는 기본 ubuntu 로 생성을 하였기 때문에 aws cli 도 설치해야하고 credentials 도 따로 설정해야 했다.
해결
sudo apt install awscli
우선 awscli 를 설치해주고
aws configure
를 통해 요구하는 IAM 정보를 입력해준다.
AWS Access Key ID : IAM 계정 액세스 키
AWS Secret Access Key : IAM 계정 Secret 액세스 키
Default region name : EC2 리전 (서울 : ap-northeast-2a)
Default output format : json
Secret Access 키는 IAM 계정 생성 당시 .csv 형태로 저장 가능했을 것이다.
저장을 안했다면 새로운 액세스 키를 생성하면 된다.
설정을 다했다면
--dryrun 옵션을 추가한 상태로
aws s3 sync s3://{기존 버킷 이름} s3://{타겟 버킷 이름} --region ap-northeast-2 --dryrun
을 실행시켜주면
정상적으로 테스트 run 이 가능하다.
정상 실행이 되는 것을 확인했으니
aws s3 sync s3://{기존 버킷 이름} s3://{타겟 버킷 이름} --region ap-northeast-2
명령어로 데이터를 sync 시켜준다.
새로 만든 버킷에 데이터가 정상적으로 들어왔다!
+)
새로 만든 버킷을 Spring 프로젝트에 적용하려면 새 버킷에도 정책을 추가로 설정해줘야 하고
퍼블릭 엑세스 차단을 해제 시켜놔야 한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DelegateS3Access",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::{타겟 AWS 계정 ID}:root"
},
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:GetObjectTagging"
],
"Resource": [
"arn:aws:s3:::{타겟 버킷 이름}",
"arn:aws:s3:::{타겟 버킷 이름}/*"
]
}
]
}
출처
'개발 ━━━━━ > Dev' 카테고리의 다른 글
[Nginx] Blue / Green 배포 전략으로 Spring 프로젝트 EC2 에 무중단 배포하기 (0) | 2024.02.20 |
---|---|
[Docker] Docker Volume 을 이용한 MySQL 데이터 백업 (0) | 2024.01.11 |
[Docker] MySQL 컨테이너를 이미지화 하여 Docker Hub 에 push 하기 (0) | 2023.12.04 |
Github Actions 를 이용하여 AWS EC2 에 SpringBoot 애플리케이션 CI/CD 구축 (0) | 2023.09.27 |
Github Actions (0) | 2023.09.25 |