S3 Replication Time Control로 규정 준수 요구 사항 충족하기
S3 Replication Time Control로 규정 준수 요구 사항 충족하기
S3 Replication Time Control(S3 RTC)은 데이터 복제에 대한 규정 준수나 비즈니스 요구 사항을 충족하는 데 도움을 주고, Amazon S3 복제 시간에 대한 가시성을 제공해요. S3 RTC는 Amazon S3에 업로드하는 대부분의 객체를 몇 초 안에 복제하고, 그중 99.9%는 15분 안에 복제합니다.
기본적으로 S3 RTC에는 복제 진행 상황을 추적하는 두 가지 방법이 포함돼요.
- S3 복제 지표 – S3 복제 지표를 사용해 복제가 보류 중인 S3 API 작업의 총 수, 복제 보류 중인 객체의 총 크기, 대상 리전까지의 최대 복제 시간, 복제에 실패한 작업의 총 수를 모니터링할 수 있어요. 복제하는 각 데이터 세트를 개별적으로 모니터링할 수도 있죠. S3 복제 지표는 S3 RTC와 별개로도 활성화할 수 있어요. 자세한 내용은 S3 복제 지표 사용 문서를 참고하세요.
- S3 RTC가 활성화된 복제 규칙은 S3 복제 지표를 게시합니다. 복제 지표는 S3 RTC를 활성화한 지 15분 안에 확인할 수 있어요. 복제 지표는 Amazon S3 콘솔, Amazon S3 API, AWS SDK, AWS Command Line Interface(AWS CLI), Amazon CloudWatch를 통해 확인할 수 있습니다. CloudWatch 지표에 대한 자세한 내용은 Amazon CloudWatch로 지표 모니터링 문서를, S3 콘솔에서 복제 지표를 보는 방법은 복제 지표 보기 문서를 참고하세요.
- S3 복제 지표는 Amazon CloudWatch 사용자 지정 지표와 같은 요율로 청구돼요. 자세한 내용은 Amazon CloudWatch 요금을 참고하세요.
- Amazon S3 Event Notifications – S3 RTC는
OperationMissedThreshold와OperationReplicatedAfterThreshold이벤트를 제공해서, 객체 복제가 15분 임계값을 초과하거나 그 이후에 발생하면 버킷 소유자에게 알려줘요. S3 RTC를 쓰면 Amazon S3 Event Notifications가 객체가 15분 안에 복제되지 않는 드문 경우와 그 객체가 15분 임계값 이후에 복제된 경우에 알려줄 수 있어요.- 복제 이벤트는 S3 RTC를 활성화한 지 15분 안에 확인할 수 있어요. Amazon S3 Event Notifications는 Amazon SQS, Amazon SNS, AWS Lambda를 통해 사용할 수 있어요. 자세한 내용은 Amazon S3 Event Notifications로 복제 실패 이벤트 받기 문서를 참고하세요.
출처: 문서
S3 RTC 모범 사례와 지침
S3 RTC를 활성화한 상태에서 Amazon S3 데이터를 복제할 때는 다음 모범 사례 지침을 따라 워크로드의 복제 성능을 최적화하는 게 좋아요.
Amazon S3 복제와 요청 속도 성능 지침
Amazon S3에서 스토리지를 업로드·검색할 때 애플리케이션은 요청 성능에서 초당 수천 건의 트랜잭션을 달성할 수 있어요. 예를 들어 애플리케이션은 S3 버킷의 접두사당 초당 PUT/COPY/POST/DELETE 최소 3,500건 또는 GET/HEAD 5,500건의 요청을 처리할 수 있는데, 여기에는 S3 복제가 사용자를 대신해 만드는 요청도 포함돼요. 버킷의 접두사 수에는 제한이 없습니다. 읽기를 병렬화하면 읽기·쓰기 성능을 높일 수 있어요. 예를 들어 S3 버킷에 접두사 10개를 만들어 읽기를 병렬화하면 읽기 성능을 초당 55,000개의 읽기 요청으로 확장할 수 있어요.
Amazon S3는 이 지침을 초과하는 지속적인 요청 속도, 또는 LIST 요청과 동시에 일어나는 지속적인 요청 속도에 자동으로 반응해 확장합니다. Amazon S3가 내부적으로 새 요청 속도에 맞게 최적화하는 동안에는 최적화가 끝날 때까지 HTTP 503 요청 응답을 일시적으로 받을 수도 있어요. 이런 동작은 초당 요청 수가 늘어나거나 S3 RTC를 처음 활성화할 때 발생할 수 있어요. 이 기간 동안에는 복제 지연 시간이 늘어날 수 있습니다. S3 RTC 서비스 수준 계약(SLA)은 Amazon S3의 초당 요청 수 성능 지침을 초과한 기간에는 적용되지 않아요.
S3 RTC SLA는 복제 데이터 전송 속도가 기본 할당량인 초당 1기가비트(Gbps)를 초과하는 기간에도 적용되지 않아요. 복제 전송 속도가 1Gbps를 넘을 것으로 예상된다면 AWS Support Center에 문의하거나 Service Quotas를 사용해 복제 전송 속도 할당량 증가를 요청할 수 있어요.
복제 요청 속도 추정
Amazon S3 복제가 사용자를 대신해 만드는 요청을 포함한 총 요청 속도는 복제 소스·대상 버킷 모두에 대한 Amazon S3 요청 속도 지침 범위 안에 있어야 해요. 복제되는 각 객체에 대해 Amazon S3 복제는 소스 버킷에 최대 5건의 GET/HEAD 요청과 1건의 PUT 요청, 그리고 대상 버킷 각각에 1건의 PUT 요청을 만들어요.
예를 들어 초당 100개의 객체를 복제할 것으로 예상한다면, Amazon S3 복제는 사용자를 대신해 추가로 PUT 요청 100건을 수행해서 소스 S3 버킷에 초당 총 200건의 PUT 요청이 됩니다. Amazon S3 복제는 최대 500건의 GET/HEAD 요청(복제되는 각 객체에 대해 GET/HEAD 5건)도 수행할 수 있어요.
참고: 복제되는 객체당
PUT요청 한 건에 대해서만 비용이 발생해요. 자세한 내용은 복제에 관한 Amazon S3 FAQ의 요금 정보를 참고하세요.
S3 RTC 데이터 전송 속도 할당량 초과
S3 RTC 데이터 전송 속도가 기본 할당량인 1Gbps를 초과할 것으로 예상되면 AWS Support Center에 문의하거나 Service Quotas를 사용해 복제 전송 속도 할당량 증가를 요청하세요. 전송 속도를 계산할 때 주석(annotation) 데이터도 포함하세요. 주석 바이트가 S3 RTC 데이터 전송 속도 할당량에 포함되기 때문이에요.
AWS KMS 암호화 객체 복제 요청 속도
AWS KMS 키(SSE-KMS)를 사용한 서버 측 암호화로 암호화된 객체를 복제할 때는 초당 AWS KMS 요청 할당량이 적용돼요. 요청 속도가 초당 요청 수 할당량을 초과하면 AWS KMS가 그 외에는 유효한 요청을 거부할 수 있어요. 요청이 스로틀링되면 AWS KMS는 ThrottlingException 오류를 반환합니다. AWS KMS 요청 속도 할당량은 직접 만드는 요청과 Amazon S3 복제가 사용자를 대신해 만드는 요청 모두에 적용돼요.
예를 들어 초당 1,000개의 객체를 복제할 것으로 예상한다면 AWS KMS 요청 속도 할당량에서 2,000건의 요청을 빼야 해요. 그 결과로 남는 초당 요청 수를 복제를 제외한 AWS KMS 워크로드에 쓸 수 있습니다. Amazon CloudWatch의 AWS KMS 요청 지표를 사용해 AWS 계정의 총 AWS KMS 요청 속도를 모니터링할 수 있어요.
AWS KMS 초당 요청 수 할당량 증가를 요청하려면 AWS Support Center에 문의하거나 Service Quotas를 사용하세요.
S3 Replication Time Control 활성화
S3 RTC는 새 복제 규칙이나 기존 복제 규칙에서 시작할 수 있어요. 복제 규칙을 버킷 전체에 적용하거나 특정 접두사·태그를 가진 객체에 적용할 수 있습니다. S3 RTC를 활성화하면 복제 규칙에서 S3 복제 지표도 함께 활성화돼요.
S3 RTC는 Amazon S3 콘솔, Amazon S3 API, AWS SDK, AWS Command Line Interface(AWS CLI)로 구성할 수 있어요.
단계별 지침은 같은 계정의 버킷 복제 구성하기 문서를 참고하세요. 이 문서에는 소스·대상 버킷이 같거나 다른 AWS 계정에 속할 때 복제 구성에서 S3 RTC를 활성화하는 지침이 있어요.
AWS CLI로 S3 RTC를 활성화한 상태에서 객체를 복제하려면 버킷을 만들고 버킷에서 버전 관리를 활성화한 뒤, Amazon S3에 객체 복제 권한을 주는 IAM 역할을 만들고 소스 버킷에 복제 구성을 추가해요. 다음 예시처럼 복제 구성에서 S3 RTC가 활성화되어 있어야 합니다.
AWS CLI로 복제 구성을 설정하는 단계별 지침은 같은 계정의 버킷 복제 구성하기 문서를 참고하세요.
다음 예시 복제 구성은 복제 규칙의 ReplicationTime과 EventThreshold 값을 활성화하고 설정해요. 이 값을 활성화·설정하면 규칙에서 S3 RTC가 활성화됩니다.
{
"Rules": [
{
"Status": "Enabled",
"Filter":{
"Prefix": "Tax"
},
"DeleteMarkerReplication":{
"Status": "Disabled"
},
"Destination":{
"Bucket": "arn:aws:s3:::amzn-s3-demo-destination-bucket",
"Metrics":{
"Status": "Enabled",
"EventThreshold":{
"Minutes": 15
}
},
"ReplicationTime":{
"Status": "Enabled",
"Time":{
"Minutes": 15
}
}
},
"Priority": 1
}
],
"Role": "IAM-Role-ARN"
}
중요:
Metrics:EventThreshold:Minutes와ReplicationTime:Time:Minutes는 값으로15만 허용해요.
다음 Java 예시는 S3 Replication Time Control(S3 RTC)이 활성화된 복제 구성을 추가해요.
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.model.DeleteMarkerReplication;
import software.amazon.awssdk.services.s3.model.Destination;
import software.amazon.awssdk.services.s3.model.Metrics;
import software.amazon.awssdk.services.s3.model.MetricsStatus;
import software.amazon.awssdk.services.s3.model.PutBucketReplicationRequest;
import software.amazon.awssdk.services.s3.model.ReplicationConfiguration;
import software.amazon.awssdk.services.s3.model.ReplicationRule;
import software.amazon.awssdk.services.s3.model.ReplicationRuleFilter;
import software.amazon.awssdk.services.s3.model.ReplicationTime;
import software.amazon.awssdk.services.s3.model.ReplicationTimeStatus;
import software.amazon.awssdk.services.s3.model.ReplicationTimeValue;
public class Main
{
public static void main(String[] args)
{
S3Client s3 = S3Client.builder()
.region(Region.US_EAST_1)
.credentialsProvider(() -> AwsBasicCredentials.create(
"AWS_ACCESS_KEY_ID",
"AWS_SECRET_ACCESS_KEY")
)
.build();
ReplicationConfiguration replicationConfig = ReplicationConfiguration
.builder()
.rules(
ReplicationRule
.builder()
.status("Enabled")
.priority(1)
.deleteMarkerReplication(
DeleteMarkerReplication
.builder()
.status("Disabled")
.build()
)
.destination(
Destination
.builder()
.bucket("destination_bucket_arn")
.replicationTime(
ReplicationTime.builder().time(
ReplicationTimeValue.builder().minutes(15).build()
).status(
ReplicationTimeStatus.ENABLED
).build()
)
.metrics(
Metrics.builder().eventThreshold(
ReplicationTimeValue.builder().minutes(15).build()
).status(
MetricsStatus.ENABLED
).build()
)
.build()
)
.filter(
ReplicationRuleFilter
.builder()
.prefix("testtest")
.build()
)
.build())
.role("role_arn")
.build();
// Put replication configuration
PutBucketReplicationRequest putBucketReplicationRequest = PutBucketReplicationRequest
.builder()
.bucket("source_bucket")
.replicationConfiguration(replicationConfig)
.build();
s3.putBucketReplication(putBucketReplicationRequest);
}
}