Amazon S3 관리 키를 사용한 서버 측 암호화(SSE-S3) 지정하기

Amazon S3 관리 키를 사용한 서버 측 암호화(SSE-S3) 지정하기 (Specifying server-side encryption with Amazon S3 managed keys (SSE-S3))

Amazon S3 관리 키(SSE-S3)를 사용한 서버 측 암호화는 Amazon S3의 모든 버킷에 대한 기본 암호화 구성이에요. 콘솔, REST API, AWS SDK, AWS CLI로 SSE-S3를 지정할 수 있어요.

출처: 문서

본문

모든 Amazon S3 버킷에는 기본적으로 암호화가 구성되어 있고, S3 버킷에 업로드되는 모든 새 객체는 저장 시 자동으로 암호화돼요. Amazon S3 관리 키(SSE-S3)를 사용한 서버 측 암호화는 Amazon S3의 모든 버킷에 대한 기본 암호화 구성이에요. 다른 유형의 암호화를 사용하려면 S3 PUT 요청에서 사용할 서버 측 암호화 유형을 지정하거나 대상 버킷의 기본 암호화 구성을 업데이트할 수 있어요.

PUT 요청에서 다른 암호화 유형을 지정하려면 AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS), AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS), 또는 고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 사용할 수 있어요. 대상 버킷에 다른 기본 암호화 구성을 설정하려면 SSE-KMS 또는 DSSE-KMS를 사용할 수 있어요.

범용 버킷의 기본 암호화 구성을 변경하는 방법에 대한 자세한 내용은 기본 암호화 구성을 참고하세요.

버킷의 기본 암호화 구성을 SSE-KMS로 변경해도 버킷에 있는 기존 Amazon S3 객체의 암호화 유형은 변경되지 않아요. 기본 암호화 구성을 SSE-KMS로 업데이트한 후 기존 객체의 암호화 유형을 변경하려면 Amazon S3 Batch Operations를 사용할 수 있어요. S3 Batch Operations에 객체 목록을 제공하면 Batch Operations가 해당 API 작업을 호출해요. 객체 복사(Copy objects) 작업을 사용해 기존 객체를 복사하면 같은 버킷에 SSE-KMS로 암호화된 객체로 다시 써요. 단일 Batch Operations 작업은 수십억 개의 객체에 지정된 작업을 수행할 수 있어요. 자세한 내용은 Batch Operations로 객체 작업을 일괄 수행하기와 AWS Storage Blog 게시물 S3 Inventory, Amazon Athena, S3 Batch Operations를 사용해 Amazon S3의 기존 객체를 소급해서 암호화하는 방법을 참고하세요.

S3 콘솔, REST API, AWS SDK, AWS Command Line Interface(AWS CLI)를 사용해 SSE-S3를 지정할 수 있어요. 자세한 내용은 Amazon S3 버킷의 기본 서버 측 암호화 동작 설정하기를 참고하세요.

이 주제에서는 AWS Management Console을 사용해 객체의 암호화 유형을 설정하거나 변경하는 방법을 설명해요. 콘솔로 객체를 복사하면 Amazon S3는 객체를 그대로 복사해요. 즉 원본 객체가 암호화되어 있으면 대상 객체도 암호화돼요. 콘솔을 사용해 객체에 암호화를 추가하거나 변경할 수 있어요.

참고

  • 객체가 5GB 미만이면 객체의 암호화를 변경할 수 있어요. 객체가 5GB보다 크면 AWS CLI 또는 AWS SDK를 사용해 객체의 암호화를 변경해야 해요.
  • 객체의 암호화 변경에 필요한 추가 권한 목록은 Amazon S3 API 작업에 필요한 권한을 참고하세요. 이 권한을 부여하는 예시 정책은 Amazon S3 아이덴티티 기반 정책 예시를 참고하세요.
  • 객체의 암호화를 변경하면 새 객체가 생성되어 기존 객체를 대체해요. S3 버전 관리가 활성화되어 있으면 객체의 새 버전이 생성되고 기존 객체는 이전 버전이 돼요. 속성을 변경하는 역할이 새 객체(또는 객체 버전)의 소유자가 돼요.

객체의 암호화를 변경하려면

  1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 열어요.
  2. 탐색 창에서 **버킷(Buckets)**을 선택한 다음 범용 버킷(General purpose buckets) 탭을 선택해요. 변경할 객체가 들어 있는 Amazon S3 버킷이나 폴더로 이동해요.
  3. 변경할 객체의 확인란을 선택해요.
  4. 작업(Actions) 메뉴에서 나타나는 옵션 목록 중 **서버 측 암호화 편집(Edit server-side encryption)**을 선택해요.
  5. 서버 측 암호화(Server-side encryption) 섹션까지 스크롤해요.
  6. 암호화 설정(Encryption settings) 아래에서 기본 암호화에 버킷 설정 사용(Use bucket settings for default encryption) 또는 **기본 암호화에 버킷 설정 재정의(Override bucket settings for default encryption)**를 선택해요.
  7. **기본 암호화에 버킷 설정 재정의(Override bucket settings for default encryption)**를 선택했다면 다음 암호화 설정을 구성해요. 암호화 유형(Encryption type) 아래에서 **Amazon S3 관리 키를 사용한 서버 측 암호화(SSE-S3)**를 선택해요. SSE-S3는 가장 강력한 블록 암호 중 하나인 256비트 고급 암호화 표준(AES-256)을 사용해 각 객체를 암호화해요. 자세한 내용은 Amazon S3 관리 키를 사용한 서버 측 암호화(SSE-S3)를 참고하세요.
  8. 추가 복사 설정(Additional copy settings) 아래에서 원본 설정 복사(Copy source settings), 설정 지정 안 함(Don't specify settings), 또는 설정 지정(Settings specified) 중 선택해요. **원본 설정 복사(Copy source settings)**가 기본 옵션이에요. 원본 설정 속성 없이 객체만 복사하려면 **설정 지정 안 함(Don't specify settings)**을 선택해요. 스토리지 클래스, ACL, 객체 태그, 메타데이터, 서버 측 암호화 및 추가 체크섬에 대한 설정을 지정하려면 **설정 지정(Settings specified)**을 선택해요.
  9. **변경 사항 저장(Save changes)**을 선택해요.

참고 이 작업은 지정된 모든 객체에 암호화를 적용해요. 폴더를 암호화할 때는 저장 작업이 끝날 때까지 폴더에 새 객체를 추가하지 마세요.

객체를 생성할 때 — 즉 새 객체를 업로드하거나 기존 객체를 복사할 때 — 요청에 x-amz-server-side-encryption 헤더를 추가하면 Amazon S3가 Amazon S3 관리 키(SSE-S3)로 데이터를 암호화하도록 지정할 수 있어요. 헤더 값을 Amazon S3가 지원하는 암호화 알고리즘인 AES256으로 설정해요. Amazon S3는 객체가 SSE-S3로 저장되었음을 x-amz-server-side-encryption 응답 헤더를 반환해 확인해요.

다음 REST 업로드 API 작업은 x-amz-server-side-encryption 요청 헤더를 수락해요.

  • PUT Object
  • PUT Object - Copy
  • POST Object
  • Initiate Multipart Upload

멀티파트 업로드 API 작업으로 대용량 객체를 업로드할 때 Initiate Multipart Upload 요청에 x-amz-server-side-encryption 헤더를 추가해 서버 측 암호화를 지정할 수 있어요. 기존 객체를 복사할 때는 원본 객체가 암호화되었는지와 관계없이 대상 객체에 서버 측 암호화를 명시적으로 요청하지 않으면 대상 객체가 암호화되지 않아요.

다음 REST API 작업의 응답 헤더는 객체가 SSE-S3로 저장되면 x-amz-server-side-encryption 헤더를 반환해요.

  • PUT Object
  • PUT Object - Copy
  • POST Object
  • Initiate Multipart Upload
  • Upload Part
  • Upload Part - Copy
  • Complete Multipart Upload
  • Get Object
  • Head Object

참고 객체가 SSE-S3를 사용하는 경우 GET 요청과 HEAD 요청에 암호화 요청 헤더를 보내지 마세요. 그렇지 않으면 HTTP 상태 코드 400(Bad Request) 오류가 발생해요.

AWS SDK를 사용할 때 Amazon S3가 Amazon S3 관리 암호화 키(SSE-S3)를 사용한 서버 측 암호화를 사용하도록 요청할 수 있어요. 이 섹션은 여러 언어로 AWS SDK를 사용하는 예제를 제공해요. 다른 SDK에 대한 정보는 샘플 코드 및 라이브러리로 이동하세요.

  • Java: AWS SDK for Java로 객체를 업로드할 때 SSE-S3로 암호화할 수 있어요. 서버 측 암호화를 요청하려면 PutObjectRequest의 ObjectMetadata 속성을 사용해 x-amz-server-side-encryption 요청 헤더를 설정해요. AmazonS3Client의 putObject() 메서드를 호출하면 Amazon S3가 데이터를 암호화하고 저장해요. 멀티파트 업로드 API 작업으로 객체를 업로드할 때도 SSE-S3 암호화를 요청할 수 있어요. 상위 수준 멀티파트 업로드 API 작업을 사용할 때는 TransferManager 메서드를 사용해 객체를 업로드하면서 서버 측 암호화를 적용해요. ObjectMetadata를 매개 변수로 받는 업로드 메서드 중 아무거나 사용할 수 있어요. 자세한 내용은 멀티파트 업로드를 사용한 객체 업로드를 참고하세요. 하위 수준 멀티파트 업로드 API 작업을 사용할 때는 멀티파트 업로드를 시작할 때 서버 측 암호화를 지정해요. InitiateMultipartUploadRequest.setObjectMetadata() 메서드를 호출해 ObjectMetadata 속성을 추가해요. 자세한 내용은 AWS SDK 사용하기(하위 수준 API)를 참고하세요. 객체의 암호화 상태를 직접 변경할 수는 없어요(암호화되지 않은 객체를 암호화하거나 암호화된 객체를 복호화하는 것). 객체의 암호화 상태를 변경하려면 객체의 복사본을 만들어 복사본에 원하는 암호화 상태를 지정한 다음 원본 객체를 삭제해요. Amazon S3는 서버 측 암호화를 명시적으로 요청할 때만 복사된 객체를 암호화해요. Java API를 통해 복사된 객체의 암호화를 요청하려면 ObjectMetadata 속성을 사용해 CopyObjectRequest에 서버 측 암호화를 지정해요.

    예제 다음 예제는 AWS SDK for Java로 서버 측 암호화를 설정하는 방법을 보여줘요. 다음 작업을 수행하는 방법을 보여줘요. SSE-S3를 사용해 새 객체 업로드하기. 객체를 복사해 객체의 암호화 상태 변경하기(이 예제에서는 이전에 암호화되지 않은 객체를 암호화). 객체의 암호화 상태 확인하기. 서버 측 암호화에 대한 자세한 내용은 REST API 사용하기를 참고하세요. 작동 샘플 생성 및 테스트 지침은 AWS SDK for Java 개발자 안내서의 시작하기를 참고하세요.

    import com.amazonaws.AmazonServiceException;
    import com.amazonaws.SdkClientException;
    import com.amazonaws.auth.profile.ProfileCredentialsProvider;
    import com.amazonaws.regions.Regions;
    import com.amazonaws.services.s3.AmazonS3;
    import com.amazonaws.services.s3.AmazonS3ClientBuilder;
    import com.amazonaws.services.s3.internal.SSEResultBase;
    import com.amazonaws.services.s3.model.*;
    
    import java.io.ByteArrayInputStream;
    
    public class SpecifyServerSideEncryption {
        public static void main(String[] args) {
            Regions clientRegion = Regions.DEFAULT_REGION;
            String bucketName = "*** Bucket name ***";
            String keyNameToEncrypt = "*** Key name for an object to upload and encrypt ***";
            String keyNameToCopyAndEncrypt = "*** Key name for an unencrypted object to be encrypted by copying ***";
            String copiedObjectKeyName = "*** Key name for the encrypted copy of the unencrypted object ***";
    
            try {
                AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                        .withRegion(clientRegion)
                        .withCredentials(new ProfileCredentialsProvider())
                        .build();
    
                // Upload an object and encrypt it with SSE.
                uploadObjectWithSSEEncryption(s3Client, bucketName, keyNameToEncrypt);
    
                // Upload a new unencrypted object, then change its encryption state
                // to encrypted by making a copy.
                changeSSEEncryptionStatusByCopying(s3Client,
                        bucketName,
                        keyNameToCopyAndEncrypt,
                        copiedObjectKeyName);
            } catch (AmazonServiceException e) {
                // The call was transmitted successfully, but Amazon S3 couldn't process
                // it, so it 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();
            }
        }
    
        private static void uploadObjectWithSSEEncryption(AmazonS3 s3Client, String bucketName, String keyName) {
            String objectContent = "Test object encrypted with SSE";
            byte[] objectBytes = objectContent.getBytes();
    
            // Specify server-side encryption.
            ObjectMetadata objectMetadata = new ObjectMetadata();
            objectMetadata.setContentLength(objectBytes.length);
            objectMetadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
            PutObjectRequest putRequest = new PutObjectRequest(bucketName,
                    keyName,
                    new ByteArrayInputStream(objectBytes),
                    objectMetadata);
    
            // Upload the object and check its encryption status.
            PutObjectResult putResult = s3Client.putObject(putRequest);
            System.out.println("Object \"" + keyName + "\" uploaded with SSE.");
            printEncryptionStatus(putResult);
        }
    
        private static void changeSSEEncryptionStatusByCopying(AmazonS3 s3Client,
                String bucketName,
                String sourceKey,
                String destKey) {
            // Upload a new, unencrypted object.
            PutObjectResult putResult = s3Client.putObject(bucketName, sourceKey, "Object example to encrypt by copying");
            System.out.println("Unencrypted object \"" + sourceKey + "\" uploaded.");
            printEncryptionStatus(putResult);
    
            // Make a copy of the object and use server-side encryption when storing the
            // copy.
            CopyObjectRequest request = new CopyObjectRequest(bucketName,
                    sourceKey,
                    bucketName,
                    destKey);
            ObjectMetadata objectMetadata = new ObjectMetadata();
            objectMetadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
            request.setNewObjectMetadata(objectMetadata);
    
            // Perform the copy operation and display the copy's encryption status.
            CopyObjectResult response = s3Client.copyObject(request);
            System.out.println("Object \"" + destKey + "\" uploaded with SSE.");
            printEncryptionStatus(response);
    
            // Delete the original, unencrypted object, leaving only the encrypted copy in
            // Amazon S3.
            s3Client.deleteObject(bucketName, sourceKey);
            System.out.println("Unencrypted object \"" + sourceKey + "\" deleted.");
        }
    
        private static void printEncryptionStatus(SSEResultBase response) {
            String encryptionStatus = response.getSSEAlgorithm();
            if (encryptionStatus == null) {
                encryptionStatus = "Not encrypted with SSE";
            }
            System.out.println("Object encryption status is: " + encryptionStatus);
        }
    }
    
  • .NET: 객체를 업로드할 때 Amazon S3에 암호화하도록 지시할 수 있어요. 기존 객체의 암호화 상태를 변경하려면 객체의 복사본을 만들고 원본 객체를 삭제해요. 기본적으로 복사 작업은 대상 객체의 서버 측 암호화를 명시적으로 요청할 때만 대상을 암호화해요. CopyObjectRequest에 SSE-S3를 지정하려면 다음을 추가해요. ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256. 객체 복사 방법의 작동 샘플은 AWS SDK 사용하기를 참고하세요. 다음 예제는 객체를 업로드해요. 요청에서 Amazon S3에 객체를 암호화하도록 지시해요. 그런 다음 객체 메타데이터를 검색하고 사용된 암호화 방법을 확인해요. 코드 예제 설정 및 실행에 대한 정보는 AWS SDK for .NET 개발자 안내서의 AWS SDK for .NET 시작하기를 참고하세요.

    using Amazon;
    using Amazon.S3;
    using Amazon.S3.Model;
    using System;
    using System.Threading.Tasks;
    
    namespace Amazon.DocSamples.S3
    {
        class SpecifyServerSideEncryptionTest
        {
            private const string bucketName = "*** bucket name ***";
            private const string keyName = "*** key name for object created ***";
            // Specify your bucket region (an example region is shown).
            private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
            private static IAmazonS3 client;
    
            public static void Main()
            {
                client = new AmazonS3Client(bucketRegion);
                WritingAnObjectAsync().Wait();
            }
    
            static async Task WritingAnObjectAsync()
            {
                try
                {
                    var putRequest = new PutObjectRequest
                    {
                        BucketName = bucketName,
                        Key = keyName,
                        ContentBody = "sample text",
                        ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256
                    };
    
                    var putResponse = await client.PutObjectAsync(putRequest);
    
                    // Determine the encryption state of an object.
                    GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest
                    {
                        BucketName = bucketName,
                        Key = keyName
                    };
                    GetObjectMetadataResponse response = await client.GetObjectMetadataAsync(metadataRequest);
                    ServerSideEncryptionMethod objectEncryption = response.ServerSideEncryptionMethod;
    
                    Console.WriteLine("Encryption method used: {0}", objectEncryption.ToString());
                }
                catch (AmazonS3Exception e)
                {
                    Console.WriteLine("Error encountered ***. Message:'{0}' when writing an object", e.Message);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
                }
            }
        }
    }
    
  • PHP: 이 주제에서는 AWS SDK for PHP 버전 3의 클래스로 Amazon S3에 업로드하는 객체에 SSE-S3를 추가하는 방법을 보여줘요. AWS SDK for Ruby API에 대한 자세한 내용은 AWS SDK for Ruby - 버전 2로 이동하세요. Amazon S3에 객체를 업로드하려면 Aws\S3\S3Client::putObject() 메서드를 사용해요. 업로드 요청에 x-amz-server-side-encryption 요청 헤더를 추가하려면 다음 코드 예제와 같이 ServerSideEncryption 매개 변수를 값 AES256으로 지정해요. 서버 측 암호화 요청에 대한 정보는 REST API 사용하기를 참고하세요.

    require 'vendor/autoload.php';
    
    use Aws\S3\S3Client;
    
    $bucket = '*** Your Bucket Name ***';
    $keyname = '*** Your Object Key ***';
    
    // $filepath should be an absolute path to a file on disk.
    $filepath = '*** Your File Path ***';
    
    $s3 = new S3Client([
        'version' => 'latest',
        'region'  => 'us-east-1'
    ]);
    
    // Upload a file with server-side encryption.
    $result = $s3->putObject([
        'Bucket'               => $bucket,
        'Key'                  => $keyname,
        'SourceFile'           => $filepath,
        'ServerSideEncryption' => 'AES256',
    ]);
    

    응답으로 Amazon S3는 객체 데이터를 암호화하는 데 사용한 암호화 알고리즘의 값과 함께 x-amz-server-side-encryption 헤더를 반환해요. 멀티파트 업로드 API 작업으로 대용량 객체를 업로드할 때 업로드하는 객체에 SSE-S3를 다음과 같이 지정할 수 있어요. 하위 수준 멀티파트 업로드 API 작업을 사용할 때 Aws\S3\S3Client::createMultipartUpload() 메서드를 호출할 때 서버 측 암호화를 지정해요. 요청에 x-amz-server-side-encryption 요청 헤더를 추가하려면 배열 매개 변수의 ServerSideEncryption 키를 값 AES256으로 지정해요. 하위 수준 멀티파트 업로드 API 작업에 대한 자세한 내용은 AWS SDK 사용하기(하위 수준 API)를 참고하세요. 상위 수준 멀티파트 업로드 API 작업을 사용할 때 CreateMultipartUpload API 작업의 ServerSideEncryption 매개 변수를 사용해 서버 측 암호화를 지정해요. 상위 수준 멀티파트 업로드 API 작업과 함께 setOption() 메서드를 사용하는 예제는 멀티파트 업로드를 사용한 객체 업로드를 참고하세요. 기존 객체의 암호화 상태를 확인하려면 다음 PHP 코드 예제와 같이 Aws\S3\S3Client::headObject() 메서드를 호출해 객체 메타데이터를 검색해요.

    require 'vendor/autoload.php';
    
    use Aws\S3\S3Client;
    
    $bucket = '*** Your Bucket Name ***';
    $keyname = '*** Your Object Key ***';
    
    $s3 = new S3Client([
        'version' => 'latest',
        'region'  => 'us-east-1'
    ]);
    
    // Check which server-side encryption algorithm is used.
    $result = $s3->headObject([
        'Bucket' => $bucket,
        'Key'    => $keyname,
    ]);
    echo $result['ServerSideEncryption'];
    

    기존 객체의 암호화 상태를 변경하려면 Aws\S3\S3Client::copyObject() 메서드를 사용해 객체의 복사본을 만들고 원본 객체를 삭제해요. 기본적으로 copyObject()는 ServerSideEncryption 매개 변수를 값 AES256으로 사용해 대상 객체의 서버 측 암호화를 명시적으로 요청하지 않으면 대상을 암호화하지 않아요. 다음 PHP 코드 예제는 객체의 복사본을 만들고 복사된 객체에 서버 측 암호화를 추가해요.

    require 'vendor/autoload.php';
    
    use Aws\S3\S3Client;
    
    $sourceBucket = '*** Your Source Bucket Name ***';
    $sourceKeyname = '*** Your Source Object Key ***';
    
    $targetBucket = '*** Your Target Bucket Name ***';
    $targetKeyname = '*** Your Target Object Key ***';
    
    $s3 = new S3Client([
        'version' => 'latest',
        'region'  => 'us-east-1'
    ]);
    
    // Copy an object and add server-side encryption.
    $s3->copyObject([
        'Bucket'               => $targetBucket,
        'Key'                  => $targetKeyname,
        'CopySource'           => "$sourceBucket/$sourceKeyname",
        'ServerSideEncryption' => 'AES256',
    ]);
    

    자세한 내용은 다음 주제를 참고하세요. Amazon S3용 AWS SDK for PHP, Aws\S3\S3Client 클래스, AWS SDK for PHP 문서.

  • Ruby: AWS SDK for Ruby로 객체를 업로드할 때 객체가 SSE-S3로 저장 시 암호화되도록 지정할 수 있어요. 객체를 다시 읽으면 자동으로 복호화돼요. 다음 AWS SDK for Ruby 버전 3 예제는 Amazon S3에 업로드된 파일이 저장 시 암호화되도록 지정하는 방법을 보여줘요.

    require 'aws-sdk-s3'
    
    # Wraps Amazon S3 object actions.
    class ObjectPutSseWrapper
      attr_reader :object
    
      # @param object [Aws::S3::Object] An existing Amazon S3 object.
      def initialize(object)
        @object = object
      end
    
      def put_object_encrypted(object_content, encryption)
        @object.put(body: object_content, server_side_encryption: encryption)
        true
      rescue Aws::Errors::ServiceError => e
        puts "Couldn't put your content to #{object.key}. Here's why: #{e.message}"
        false
      end
    end
    
    # Example usage:
    def run_demo
      bucket_name = "amzn-s3-demo-bucket"
      object_key = "my-encrypted-content"
      object_content = "This is my super-secret content."
      encryption = "AES256"
    
      wrapper = ObjectPutSseWrapper.new(Aws::S3::Object.new(bucket_name, object_content))
      return unless wrapper.put_object_encrypted(object_content, encryption)
    
      puts "Put your content into #{bucket_name}:#{object_key} and encrypted it with #{encryption}."
    end
    
    run_demo if $PROGRAM_NAME == __FILE__
    

    다음 코드 예제는 기존 객체의 암호화 상태를 확인하는 방법을 보여줘요.

    require 'aws-sdk-s3'
    
    # Wraps Amazon S3 object actions.
    class ObjectGetEncryptionWrapper
      attr_reader :object
    
      # @param object [Aws::S3::Object] An existing Amazon S3 object.
      def initialize(object)
        @object = object
      end
    
      # Gets the object into memory.
      #
      # @return [Aws::S3::Types::GetObjectOutput, nil] The retrieved object data if successful; otherwise nil.
      def object
        @object.get
      rescue Aws::Errors::ServiceError => e
        puts "Couldn't get object #{@object.key}. Here's why: #{e.message}"
      end
    end
    
    # Example usage:
    def run_demo
      bucket_name = "amzn-s3-demo-bucket"
      object_key = "my-object.txt"
    
      wrapper = ObjectGetEncryptionWrapper.new(Aws::S3::Object.new(bucket_name, object_key))
      obj_data = wrapper.get_object
      return unless obj_data
    
      encryption = obj_data.server_side_encryption.nil? ? 'no' : obj_data.server_side_encryption
      puts "Object #{object_key} uses #{encryption} encryption."
    end
    
    run_demo if $PROGRAM_NAME == __FILE__
    

    Amazon S3에 저장된 객체에 서버 측 암호화가 사용되지 않으면 메서드는 null을 반환해요. 기존 객체의 암호화 상태를 변경하려면 객체의 복사본을 만들고 원본 객체를 삭제해요. 기본적으로 복사 메서드는 서버 측 암호화를 명시적으로 요청하지 않으면 대상을 암호화하지 않아요. 다음 Ruby 코드 예제와 같이 옵션의 해시 인수에 server_side_encryption 값을 지정해 대상 객체의 암호화를 요청할 수 있어요. 코드 예제는 객체를 복사하고 복사본을 SSE-S3로 암호화하는 방법을 보여줘요.

    require 'aws-sdk-s3'
    
    # Wraps Amazon S3 object actions.
    class ObjectCopyEncryptWrapper
      attr_reader :source_object
    
      # @param source_object [Aws::S3::Object] An existing Amazon S3 object. This is used as the source object for
      #                                        copy actions.
      def initialize(source_object)
        @source_object = source_object
      end
    
      # Copy the source object to the specified target bucket, rename it with the target key, and encrypt it.
      #
      # @param target_bucket [Aws::S3::Bucket] An existing Amazon S3 bucket where the object is copied.
      # @param target_object_key [String] The key to give the copy of the object.
      # @return [Aws::S3::Object, nil] The copied object when successful; otherwise, nil.
      def copy_object(target_bucket, target_object_key, encryption)
        @source_object.copy_to(bucket: target_bucket.name, key: target_object_key, server_side_encryption: encryption)
        target_bucket.object(target_object_key)
      rescue Aws::Errors::ServiceError => e
        puts "Couldn't copy #{@source_object.key} to #{target_object_key}. Here's why: #{e.message}"
      end
    end
    
    # Example usage:
    def run_demo
      source_bucket_name = "amzn-s3-demo-bucket1"
      source_key = "my-source-file.txt"
      target_bucket_name = "amzn-s3-demo-bucket2"
      target_key = "my-target-file.txt"
      target_encryption = "AES256"
    
      source_bucket = Aws::S3::Bucket.new(source_bucket_name)
      wrapper = ObjectCopyEncryptWrapper.new(source_bucket.object(source_key))
      target_bucket = Aws::S3::Bucket.new(target_bucket_name)
      target_object = wrapper.copy_object(target_bucket, target_key, target_encryption)
      return unless target_object
    
      puts "Copied #{source_key} from #{source_bucket_name} to #{target_object.bucket_name}:#{target_object.key} and " \
           "encrypted the target with #{target_object.server_side_encryption} encryption."
    end
    
    run_demo if $PROGRAM_NAME == __FILE__
    

AWS CLI를 사용해 객체를 업로드할 때 SSE-S3를 지정하려면 다음 예제를 사용해요.

aws s3api put-object --bucket amzn-s3-demo-bucket1 --key object-key-name --server-side-encryption AES256 --body file path

자세한 내용은 AWS CLI 참조의 put-object를 참고하세요. AWS CLI로 객체를 복사할 때 SSE-S3를 지정하려면 copy-object를 참고하세요.

CloudFormation으로 암호화를 설정하는 예제는 AWS CloudFormation 사용자 안내서의 AWS::S3::Bucket ServerSideEncryptionRule 주제에서 기본 암호화로 버킷 만들기 및 S3 Bucket Key와 함께 AWS KMS 서버 측 암호화를 사용해 버킷 만들기 예제를 참고하세요.

더 알아보기 (Learn more)