안녕하세요 서후아빠입니다. ^_^
이번 세션은 지난번 진행한 aws cli를 통한 동기화가 아닌 DataSync 서비스를 이용하여 서로 다른 계정에 위치하는 S3 bucket을 동기화하는 실습을 해보겠습니다.
구성도
제약사항
DataSync 통해 버킷간 전송 시 작업당 2,500만개 이상의 객체는 복사가 불가능하므로 접두사로 구분하여 분할 전송
서로 다른 계정간 버킷 동기화는 aws cli를 이용하는 과정 필요 (모든 과정을 콘솔에서 지원하지 않음)
1단계 : IAM User 및 Role 생성 (A계정에서 진행)
IAM > Users > Add users > Name(user01), 권한(AdministratorAccess)
보안을 위해 MFA 설정 필수 (설명 SKIP) aws cli 작업을 위해 Access keys 발급 진행 필요 (설명 SKIP) |
IAM > Policies > Create policy > JSON (tab)
JSON 내용 | Name | 설명 | ||
아래 참조 | AWSDataSyncPolicyForDestinationS3BcketAccess | 필수 | ||
아래 참조 | AWSDataSyncPolicyForSourceS3BcketAccess | 4단계 과정에서 자동 생성 가능하므로 생략 가능 |
# AWSDataSyncPolicyForDestinationS3BcketAccess 내용
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucketB"
},
{
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:GetObjectTagging",
"s3:PutObjectTagging"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucketB/*"
}
]
}
# AWSDataSyncPolicyForSourceS3BcketAccess은 위 내용에서 bucketB를 bucketA로 수정하면 됨
IAM > Roles > Create role
Select trusted entity | Add permissions | Name, review, and create | 설명 | ||
Trusted entity type : AWS service Use case : DataSync |
AWSDataSyncFullAccess AWSDataSyncReadOnlyAccess AWSDataSyncPolicyForDestinationS3BcketAccess |
Role name : AWSDataSyncRoleForDestinationS3BcketAccess | 필수 | ||
Trusted entity type : Custom trust policy | AWSDataSyncPolicyForSourceS3BcketAccess | Role name : AWSDataSyncRoleForSourceS3BcketAccess | 4단계 과정에서 자동 생성 가능하므로 생략 가능 Trusted entity는 아래 참조 |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "datasync.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "111111111111"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:datasync:us-east-2:111111111111:*"
}
}
}
]
}
2단계 : S3 bucket 정책 생성 (B계정에서 진행)
S3 > Buckets > bucketB 선택 > Permissions (tab) > Bucket policy의 Edit
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "DataSyncCreateS3LocationAndTaskAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:role/AWSDataSyncRoleForDestinationS3BcketAccess"
},
"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:::bucketB",
"arn:aws:s3:::bucketB/*"
]
},
{
"Sid": "DataSyncCreateS3Location",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:user/user01"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::bucketB"
}
]
}
3단계 : EC2(Amazon Linux AMI) 생성하여 터미널 접속(설명 SKIP)
EC2는 권한 부여가 불필요하며, Amazon Linux AMI로 EC2를 생성하면 aws cli를 별도 설치할 필요가 없습니다. EC2를 접속하여 4단계를 진행합니다. |
4단계 : DataSync 대상 위치 생성 (A계정의 IAM User(ex : user01)를 이용하여 aws cli에서 진행
# 대상 위치 생성 명령어
aws datasync create-location-s3 --s3-bucket-arn arn:aws:s3:::bucketB --s3-config '{"BucketAccessRoleArn":"arn:aws:iam::111111111111:role/AWSDataSyncRoleForDestinationS3BcketAccess"}' --region ap-northeast-2
# 정상적으로 생성 시 아래처럼 출력됨
{
"LocationArn": "arn:aws:datasync:ap-northeast-2:111111111111:location/loc-01ecb6bf0c16db836"
}
# 2단계가 완료되지 않은 경우 아래처럼 에러 발생
An error occurred (InvalidRequestException) when calling the CreateLocationS3 operation: DataSync location access test failed: could not perform s3:HeadBucket on bucket MyBucketB. Access denied. Ensure bucket access role has s3:ListBucket permission.
위에서 언급한 것처럼 작업당 2,500만개 이상의 객체는 복사가 불가능하므로 접두사로 구분합니다. 대상 위치 생성 명령어의 "arn:aws:s3:::bucketB" 부분을 예를 들어 폴더 단위로 "arn:aws:s3:::bucketB/folderB1" 생성하고 아래 5단계에서도 Configure source location의 Folder 경로를 동일하게 forderA로 표기합니다. 즉, 여러개의 대상 위치를 생성하고, 여러개의 Task를 생성합니다. EC2 접속 및 aws cli 로그인 설명은 SKIP (https://sh-t.tistory.com/manage/newpost/62 3단계 참조) A계정의 S3 버킷과 B계정의 S3 버킷 리전이 다른 경우 명령어 마지막에 B계정의 리전을 지정 (ex : --region ap-northeast-2) A계정 콘솔 로그인하여 ap-northeast-2 리전 선택하여 아래 경로로 이동하면 생성 결과 확인 가능 - 경로 : DataSync > Locations |
5단계 : DataSync Task 생성하여 S3 bucket 동기화 실행 (A계정에서 진행)
DataSync > Tasks > Create task
Configure source location | Destination location options | Configure settings | ||
Choose the location that you want to transfer data from : Create a new location Location type : Amazon S3 Region : us-east-2 S3 bucket : bucketA Folder : / IAM role : AWSDataSyncRoleForSourceS3BcketAccess |
Choose the location that you want to transfer data from : Choose an existing location Choose existing location - Region : ap-northeast-2 - Existing locations : 3단계에서 생성한 location 선택 (ex : s3://bucketB/) |
Task Name : taskA Task execution configuration - Verify data : Verify only the data transferred - Set bandwidth limit : Use available - Queueing : Enable Data transfer configuration - Data to scan : Entire source location - Transfer mode : Transfer only data that has changed - Keep deleted files : Disabled - Overwrite files : Enable - Specific files and folders : - - Exclude patterns : - Schedule : Hourly, at minute (00) Task logging - Log level : Log basic information such as transfer errors - CloudWatch log group : taskA-cloudwatch-logs - Create a CloudWatch resource policy : Enable |
주의 : 2단계의 S3 버킷 정책에 지정한 IAM 사용자(ex : user01)로 콘솔 접속하여 4단계 진행해야 하며, 리전은 B계정의 S3 버킷 리전(ap-northeast-2)으로 선택합니다. AWSDataSyncRoleForSourceS3BcketAccess : 5단계에서 자동 생성 클릭으로 생성 가능하나 Name은 임의값으로 생성됨 Configure settings - Verify data : Verify only the data transferred, Check integrity during transfer(기본값), Verify all data in the destination - Set bandwidth limit : Use available(기본값), Set bandwidth limit (MiB/s) Data transfer configuration - Data to scan : Entire source location(기본값), Specific files and folders - Transfer mode : Transfer only data that has changed(기본값), Transfer all data - Keep deleted files : Enable 경우 소스에서 삭제해도 목적지에서는 삭제되지 않음 - Specific files and folders : Pattern(ex : /foler-to-include/*) 통해 전송할 대상 선택하는 옵션 - Exclude patterns : 패턴에 맞으면 전송 제외하는 옵션 Schedule : Hourly, Daily, Weekly, Days of the week, Custom Task logging - Log level : Log basic information such as transfer errors(기본값), Do not send logs, All |
DataSync > Tasks > MyDataSyncTask 선택 > 상단의 Start > Start with defaults
Start with defaults : 현재 Task 수정없이 즉시 실행 Start with overriding options : 현재 Task 실행전에 수정할 경우 선택 |
6단계 : S3 bucket 동기화 상태 확인 (B계정에서 진행)
S3 > Buckets > bucketB 선택 > 파일과 권한 모두 동일하게 동기화 되었음을 확인할 수 있음
기타 : CloudWatch Logs에서 Log 확인 (A계정에서 진행)
CloudWatch > Logs > taskA-cloudwatch-logs 선택
# Log 예시
2023-02-27T17:22:35.098+09:00
Copy
[INFO] Request to start task-09ab010e1a4bf95a8.
2023-02-27T17:25:20.100+09:00
Copy
[INFO] Execution exec-0e19e9998f6212360 started.
2023-02-27T17:25:20.733+09:00
Copy
[INFO] Started logging in destination hostId: host-0014cdcc4173d0f11 for Execution exec-0e19e9998f6212360
2023-02-27T17:25:25.146+09:00
Copy
[NOTICE] Created directory /AWS-PatchNow/32a7938e-3060-4f27-b38c-21c4a32f47f9
2023-02-27T17:25:26.524+09:00
Copy
[NOTICE] Transferred file /AWS-PatchNow/32a7938e-3060-4f27-b38c-21c4a32f47f9/i-01f4a42fdcb981d69/awsrunShellScript/PatchLinux/stdout, 125936 bytes
2023-02-27T17:25:27.277+09:00
Copy
[NOTICE] Verified directory /
2023-02-27T17:25:27.277+09:00
Copy
[NOTICE] Verified directory /AWS-PatchNow
2023-02-27T17:25:27.277+09:00
Copy
[NOTICE] Verified directory /AWS-PatchNow/1013e457-d51a-4fac-a119-c1be9f010a35
2023-02-27T17:25:27.797+09:00
Copy
[INFO] Execution exec-0e19e9998f6212360 finished with status Success.
주의사항
s3 sync 명령어를 옵션없이 실행할 경우 Server(=EC2)의 CPU 사용율이 100%까지 사용할 수 있습니다.
만약, 운영중인 서버에서 실행할 경우 장애가 발생할 수 있기 때문에 주의를 요합니다.
혹은 아래처럼 CPU 스레드를 조정한 후, 동기화를 진행하면 장애는 발생하지 않으나, 전송 속도는 떨어질 수 있습니다.
# 기본 프로필 설정 (기본값은 10, 1로 설정하는 경우)
aws configure set default.s3.max_concurrent_requests 1
# 사용자 프로필 설정
aws configure set s3.max_concurrent_requests 1 --profile [사용자 프로필]
# 세팅확인
cat .aws/config
누락 및 에러
s3 sync 명령어를 통해 복제된 파일이 누락이나 에러로 전송되지 않는 경우에 대한 의심을 하시는 분들을 위해서 아래 가이드를 권고 드립니다.
aws s3 ls 명령어는 1000개 이상 동시 조회 불가능하므로 1000개 이상일 경우 aws s3api list-objects 명령어를 사용해야 합니다.
# 작업전후 파일 비교 방법 (예시)
aws s3 ls --recursive s3://[버킷명] --summarize
Total Objects: 333
Total Size: 344375
aws s3api list-objects --bucket "[버킷명]" --prefix "prefix-name" --output json --query "[sum(Contents[].Size), length(Contents[])]"
# Output결과를 넣고, vi나 여러가지 방법으로 error 필터링하는 방법
aws s3 ls | tee -a "output.log"
# 디버깅 로그 기록 (예시)
aws s3 sync s3://bucketA s3://bucketB --debug& >> ./s3_debug.log
다른 방법
aws cli를 이용한 동기화 방법은 아래 링크를 참조하세요
2023.02.16 - [Storage] - [실습] AWS CLI 이용한 서로 다른 AWS 계정간 S3 bucket 동기화(sync) 구성하기
S3 버킷의 Replication rules을 이용하여 복제하는 방법도 있습니다.
- 사전 설정 : S3 버킷 선택 > Properties (tab) > Bucket Versioning의 Edit > Bucket Versioning (Enable) > Save changes
- 경로 : 출발지 S3 버킷 선택 > Management (tab) > Replication rules의 Create replication rule
Replication rule configuration | Source bucket | Destination | IAM role | 옵션 |
Replication rule name : 규칙명 입력 Status : Enabled (or Disabled) |
Source bucket name : 자동 선택 Choose a rule scope : 모든 오브젝트 (or 필터링된 오브젝트) |
Destination : 목적지 버킷 선택 | Create new role | Encryption Destination storage class Additional replication options |
'Storage' 카테고리의 다른 글
[실습] EKS - Persistent Volume을 pod에 연결하기 (EBS, EFS, FSX for Lustre) (0) | 2023.06.13 |
---|---|
[실습] EBS 볼륨(xfs 파일시스템) 연결 및 확장에 대해서 구성하기 (0) | 2023.03.10 |
[실습] EC2에 EFS 볼륨 연결(mount) 구성하기 (0) | 2023.02.27 |
[실습] FSx or PlugIn(goofys, s3fs) 이용하여 EC2에 S3 bucket 연결(mount) 구성하기 (0) | 2023.02.16 |
[실습] AWS CLI 이용한 서로 다른 AWS 계정간 S3 bucket 동기화(sync) 구성하기 (2) | 2023.02.16 |