콘솔과 API로 Amazon S3 Storage Lens 작업

콘솔과 API로 Amazon S3 Storage Lens 작업

Amazon S3 Storage Lens는 클라우드 스토리지 분석 기능으로, 객체 스토리지 사용량과 활동에 대한 조직 전체의 가시성을 얻는 데 사용할 수 있어요. S3 Storage Lens 지표를 사용해 조직 전체에 걸쳐 얼마나 많은 스토리지를 가지고 있는지, 가장 빠르게 성장하는 버킷과 접두사가 무엇인지 같은 요약 인사이트를 만들 수 있어요. 또한 S3 Storage Lens 지표로 비용 최적화 기회를 식별하고, 데이터 보호·보안 모범 사례를 구현하며, 애플리케이션 워크로드의 성능을 개선할 수 있어요. 예를 들어 7일이 넘은 불완전한 멀티파트 업로드를 만료시키는 S3 Lifecycle 규칙이 없는 버킷을 식별할 수 있어요. S3 복제나 S3 버전 관리 같은 데이터 보호 모범 사례를 따르지 않는 버킷도 식별할 수 있어요. S3 Storage Lens는 지표를 분석해 스토리지 비용을 최적화하고 데이터 보호를 위한 모범 사례를 적용하는 데 쓸 수 있는 상황별 권장사항을 제공해요.

출처: Working with Amazon S3 Storage Lens by using the console and API

본문

S3 Storage Lens는 지표를 집계해 Amazon S3 콘솔의 버킷(Buckets) 페이지에 있는 계정 스냅샷(Account snapshot) 섹션에 정보를 표시해요. 또한 S3 Storage Lens는 인사이트와 추세를 시각화하고, 이상값을 표시하며, 스토리지 비용 최적화와 데이터 보호 모범 사례 적용을 위한 권장사항을 받는 데 사용하는 대화형 대시보드를 제공해요. 대시보드에는 조직, 계정, AWS 리전, 스토리지 클래스, 버킷, 접두사, Storage Lens 그룹 수준에서 인사이트를 생성·시각화하는 드릴다운 옵션이 있어요. 또한 일일 지표 보고서를 CSV나 Parquet 형식으로 일반 목적 S3 버킷에 보내거나, 지표를 AWS 관리형 S3 테이블 버킷으로 직접 내보낼 수 있어요.

Storage Lens는 S3 일반 목적 버킷에 대한 지표만 집계해요.

다음 섹션에는 S3 Storage Lens 구성을 만들고, 업데이트하고, 보는 예제와 이 기능과 관련된 작업을 수행하는 예제가 포함돼 있어요. AWS Organizations와 함께 S3 Storage Lens를 사용한다면 이 예제들이 그 사용 사례도 다뤄요. 예제에서 자리 표시자 값을 교체하세요.

S3 Storage Lens 대시보드 생성

콘솔에서 대시보드를 만들려면 Amazon S3 Storage Lens 대시보드 생성을 참고하세요. 다음 예제 명령은 태그가 있는 Amazon S3 Storage Lens 구성을 만들어요. 이 예제를 사용하려면 사용자 입력 자리 표시자를 자신의 정보로 교체하세요.

aws s3control put-storage-lens-configuration --account-id= 111122223333 --config-id= example-dashboard-configuration-id --region= us-east-1 --storage-lens-configuration= file://./config.json --tags= file://./tags.json

다음 예제 명령은 태그 없이 Amazon S3 Storage Lens 구성을 만들어요. 이 예제를 사용하려면 사용자 입력 자리 표시자를 자신의 정보로 교체하세요.

aws s3control put-storage-lens-configuration --account-id= 222222222222 --config-id= your-configuration-id --region= us-east-1 --storage-lens-configuration= file://./config.json

Java SDK로 Amazon S3 Storage Lens 구성 생성 및 업데이트

다음 예제는 SDK for Java에서 Amazon S3 Storage Lens 구성을 만들고 업데이트해요.

package aws.example.s3control;

import software.amazon.awssdk.awscore.exception.AwsServiceException;
import software.amazon.awssdk.core.exception.SdkClientException;
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3control.S3ControlClient;
import software.amazon.awssdk.services.s3control.model.AccountLevel;
import software.amazon.awssdk.services.s3control.model.ActivityMetrics;
import software.amazon.awssdk.services.s3control.model.AdvancedCostOptimizationMetrics;
import software.amazon.awssdk.services.s3control.model.AdvancedDataProtectionMetrics;
import software.amazon.awssdk.services.s3control.model.AdvancedPerformanceMetrics;
import software.amazon.awssdk.services.s3control.model.BucketLevel;
import software.amazon.awssdk.services.s3control.model.CloudWatchMetrics;
import software.amazon.awssdk.services.s3control.model.DetailedStatusCodesMetrics;
import software.amazon.awssdk.services.s3control.model.Format;
import software.amazon.awssdk.services.s3control.model.Include;
import software.amazon.awssdk.services.s3control.model.OutputSchemaVersion;
import software.amazon.awssdk.services.s3control.model.PrefixLevel;
import software.amazon.awssdk.services.s3control.model.PrefixLevelStorageMetrics;
import software.amazon.awssdk.services.s3control.model.PutStorageLensConfigurationRequest;
import software.amazon.awssdk.services.s3control.model.S3BucketDestination;
import software.amazon.awssdk.services.s3control.model.SSES3;
import software.amazon.awssdk.services.s3control.model.SelectionCriteria;
import software.amazon.awssdk.services.s3control.model.StorageLensAwsOrg;
import software.amazon.awssdk.services.s3control.model.StorageLensConfiguration;
import software.amazon.awssdk.services.s3control.model.StorageLensDataExport;
import software.amazon.awssdk.services.s3control.model.StorageLensDataExportEncryption;
import software.amazon.awssdk.services.s3control.model.StorageLensExpandedPrefixesDataExport;
import software.amazon.awssdk.services.s3control.model.StorageLensTableDestination;
import software.amazon.awssdk.services.s3control.model.StorageLensTag;

import java.util.Arrays;
import java.util.List;

public class CreateAndUpdateDashboard {
    public static void main(String[] args) {
        String configurationId = " ConfigurationId ";
        String sourceAccountId = " 111122223333 ";
        String exportAccountId = " Destination Account ID ";
        String exportBucketArn = "arn:aws:s3::: destBucketName "; // The destination bucket for your metrics export must be in the same Region as your S3 Storage Lens configuration.
        String awsOrgARN = "arn:aws:organizations:: 123456789012 :organization/ o-abcdefgh ";
        Format exportFormat = Format.CSV;

        try {
            SelectionCriteria selectionCriteria = SelectionCriteria.builder()
                    .delimiter(" / ")
                    .maxDepth( 5 )
                    .minStorageBytesPercentage( 10.0 )
                    .build();

            PrefixLevelStorageMetrics prefixStorageMetrics = PrefixLevelStorageMetrics.builder()
                    .isEnabled( true )
                    .selectionCriteria(selectionCriteria)
                    .build();

            BucketLevel bucketLevel = BucketLevel.builder()
                    .activityMetrics(ActivityMetrics.builder().isEnabled( true ).build())
                    .advancedCostOptimizationMetrics(AdvancedCostOptimizationMetrics.builder().isEnabled( true ).build())
                    .advancedDataProtectionMetrics(AdvancedDataProtectionMetrics.builder().isEnabled( true ).build())
                    .advancedPerformanceMetrics(AdvancedPerformanceMetrics.builder().isEnabled( true ).build())
                    .detailedStatusCodesMetrics(DetailedStatusCodesMetrics.builder().isEnabled( true ).build())
                    .prefixLevel(PrefixLevel.builder().storageMetrics(prefixStorageMetrics).build())
                    .build();

            AccountLevel accountLevel = AccountLevel.builder()
                    .activityMetrics(ActivityMetrics.builder().isEnabled( true ).build())
                    .advancedCostOptimizationMetrics(AdvancedCostOptimizationMetrics.builder().isEnabled( true ).build())
                    .advancedPerformanceMetrics(AdvancedPerformanceMetrics.builder().isEnabled( true ).build())
                    .advancedDataProtectionMetrics(AdvancedDataProtectionMetrics.builder().isEnabled( true ).build())
                    .detailedStatusCodesMetrics(DetailedStatusCodesMetrics.builder().isEnabled( true ).build())
                    .bucketLevel(bucketLevel)
                    .build();

            Include include = Include.builder()
                    .buckets(Arrays.asList("arn:aws:s3::: bucketName "))
                    .regions(Arrays.asList(" us-west-2 "))
                    .build();

            StorageLensDataExportEncryption exportEncryption = StorageLensDataExportEncryption.builder()
                    .sses3(SSES3.builder().build())
                    .build();

            S3BucketDestination s3BucketDestination = S3BucketDestination.builder()
                    .accountId(exportAccountId)
                    .arn(exportBucketArn)
                    .encryption(exportEncryption)
                    .format(exportFormat)
                    .outputSchemaVersion(OutputSchemaVersion.V_1)
                    .prefix(" Prefix ")
                    .build();

            StorageLensTableDestination s3TablesDestination = StorageLensTableDestination.builder()
                    .encryption(exportEncryption)
                    .isEnabled( true )
                    .build();

            CloudWatchMetrics cloudWatchMetrics = CloudWatchMetrics.builder()
                    .isEnabled( true )
                    .build();

            StorageLensDataExport dataExport = StorageLensDataExport.builder()
                    .cloudWatchMetrics(cloudWatchMetrics)
                    .s3BucketDestination(s3BucketDestination)
                    .storageLensTableDestination(s3TablesDestination)
                    .build();

            StorageLensAwsOrg awsOrg = StorageLensAwsOrg.builder()
                    .arn(awsOrgARN)
                    .build();

            StorageLensExpandedPrefixesDataExport expandedPrefixesDataExport = StorageLensExpandedPrefixesDataExport.builder()
                    .s3BucketDestination(s3BucketDestination)
                    .storageLensTableDestination(s3TablesDestination)
                    .build();

            StorageLensConfiguration configuration = StorageLensConfiguration.builder()
                    .id(configurationId)
                    .accountLevel(accountLevel)
                    .include(include)
                    .dataExport(dataExport)
                    .awsOrg(awsOrg)
                    .expandedPrefixesDataExport(expandedPrefixesDataExport)
                    .prefixDelimiter(" / ")
                    .isEnabled( true )
                    .build();

            List<StorageLensTag> tags = Arrays.asList(
                    StorageLensTag.builder().key(" key-1 ").value(" value-1 ").build(),
                    StorageLensTag.builder().key(" key-2 ").value(" value-2 ").build()
            );

            S3ControlClient s3ControlClient = S3ControlClient.builder()
                    .region(Region. US_WEST_2 )
                    .credentialsProvider(ProfileCredentialsProvider.create())
                    .build();

            s3ControlClient.putStorageLensConfiguration(PutStorageLensConfigurationRequest.builder()
                    .accountId(sourceAccountId)
                    .configId(configurationId)
                    .storageLensConfiguration(configuration)
                    .tags(tags)
                    .build()
            );

        } catch (AwsServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it and returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}

S3 Storage Lens 그룹이나 확장 접두사에 액세스하려면 대시보드를 고급 티어를 사용하도록 업그레이드해야 해요. 추가 요금이 적용돼요. 무료 티어와 고급 티어에 대한 자세한 내용은 지표 선택을 참고하세요. S3 Storage Lens 그룹에 대한 자세한 내용은 S3 Storage Lens 그룹으로 필터링하고 지표 집계를 참고하세요.

더 알아보기