일반 목적 버킷 생성

일반 목적 버킷 생성

데이터를 Amazon S3에 업로드하려면 먼저 AWS 리전 중 하나에 Amazon S3 일반 목적 버킷을 만들어야 해요. 버킷을 만든 AWS 계정이 그 버킷을 소유해요. 버킷을 만들 때는 버킷 이름과 리전을 선택해야 하고, 생성 과정에서 선택적으로 다른 스토리지 관리 옵션도 지정할 수 있어요.

중요: 버킷을 만든 후에는 버킷 이름, 버킷 소유자, 리전을 변경할 수 없어요.

기본적으로 AWS 계정당 최대 10,000개의 일반 목적 버킷을 만들 수 있어요. Service Quotas 콘솔에서 할당량 증가를 요청할 수 있어요.

버킷에는 객체를 몇 개든 저장할 수 있어요.

출처: 문서

본문

일반 목적 버킷 설정 (General purpose bucket settings)

일반 목적 버킷을 만들 때 먼저 전역 일반 목적 버킷을 만들지, 아니면 계정 리전별 네임스페이스에 버킷을 만들지 결정해야 해요. 이 결정은 버킷 이름과 리전과 함께 생성 후에 변경할 수 없어요.

버킷을 만들 때 다음 설정으로 버킷 동작의 여러 측면을 제어할 수 있어요.

  • S3 버킷 네임스페이스 – 기본적으로 일반 목적 버킷은 전역 네임스페이스에 존재해요. 공유 전역 네임스페이스 또는 계정 리전별 네임스페이스 중에서 선택할 수 있어요. 계정 리전별 네임스페이스는 전역 네임스페이스의 하위 구역으로 내 계정만 버킷을 만들 수 있어요. 이렇게 만든 버킷은 내 계정에만 고유하며 다른 계정이 다시 만들 수 없어요.
  • S3 객체 소유권 (Object Ownership) – 버킷에 업로드되는 객체의 소유권을 제어하고 액세스 제어 목록(ACL)을 비활성화/활성화하는 버킷 수준 설정이에요. 기본값은 Bucket owner enforced이며 모든 ACL이 비활성화돼요. ACL이 비활성화되면 버킷 소유자가 버킷 안의 모든 객체를 소유하고 정책만으로 데이터 접근을 관리해요.
  • S3 Object Lock – 객체가 일정 기간 또는 무기한 삭제·덮어쓰기되는 것을 방지해요. WORM(write-once-read-many) 모델로 객체를 저장하므로 규제 요건을 충족하거나 객체 변경·삭제에 대한 추가 보호 계층을 더할 수 있어요.
  • 태그 – AWS 태그는 메타데이터를 담는 키-값 쌍이에요. 버킷 같은 리소스에 붙일 수 있고, AWS Billing and Cost Management에서 비용 할당에 사용하거나 속성 기반 접근 제어(ABAC)에 사용할 수 있어요.

버킷을 만든 후 또는 콘솔로 만들 때 다음 설정도 사용할 수 있어요.

  • S3 Block Public Access – 버킷, 액세스 포인트, 계정에 대한 공개 접근을 관리하는 설정을 제공해요. 기본적으로 새 버킷·액세스 포인트·객체는 공개 접근을 허용하지 않지만, 사용자가 정책을 수정해 공개 접근을 허용할 수 있어요. Block Public Access 설정은 이런 정책을 덮어써요.
  • S3 버전 관리 (Versioning) – 같은 버킷에 객체의 여러 버전을 유지하는 방법이에요. 실수로 인한 사용자 작업과 애플리케이션 실패에서 쉽게 복구할 수 있어요. 기본적으로 버킷의 버전 관리는 비활성화돼 있어요.
  • 기본 암호화 (Default encryption) – 버킷 안 모든 객체의 기본 암호화 유형을 설정할 수 있어요. 모든 버킷의 기본 암호화 구성은 Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)예요. SSE-KMS, DSSE-KMS, SSE-C도 사용할 수 있어요.

콘솔로 일반 목적 버킷 만들기

AWS Management Console에 로그인하고 Amazon S3 콘솔(https://console.aws.amazon.com/s3/)을 엽니다. 탐색 모음에서 현재 표시된 AWS 리전 이름을 선택한 다음, 버킷을 만들 리전을 선택해요.

참고: 버킷을 만든 후에는 리전을 변경할 수 없어요. 지연 시간과 비용을 줄이고 규제 요건을 충족하려면 가까운 리전을 선택하세요. 리전에 저장된 객체는 명시적으로 옮기지 않는 한 그 리전을 벗어나지 않아요.

왼쪽 탐색 창에서 General purpose buckets를 선택하고 Create bucket을 선택해요. Bucket name에 버킷 이름을 입력해요. 이름은 파티션 안에서 고유해야 하고(현재 파티션: aws, aws-cn, aws-us-gov), 3~63자, 소문자·숫자·마침표(.)·하이픈(-)만 사용하고, 문자나 숫자로 시작·끝나야 해요.

중요: 버킷을 만든 후에는 이름을 변경할 수 없어요. 버킷 이름에 민감한 정보를 포함하지 마세요. 버킷 이름은 버킷 안 객체를 가리키는 URL에 표시돼요.

선택 사항으로 General configuration에서 기존 버킷의 설정을 새 버킷에 복사할 수 있어요. 이 옵션은 AWS CLI에서는 사용할 수 없고 Amazon S3 콘솔에서만 가능하며, 버킷 정책은 복사하지 않아요.

Object Ownership에서 다음 중 하나를 선택할 수 있어요.

  • ACL 비활성화 — Bucket owner enforced(기본값): ACL이 비활성화되고 버킷 소유자가 버킷의 모든 객체를 자동으로 소유·완전 제어해요. 버킷은 정책만으로 접근 제어를 정의해요. 대부분의 현대 사용 사례는 ACL이 필요 없어요.
  • ACL 활성화 — Bucket owner preferred: 다른 계정이 bucket-owner-full-control 캐넌 ACL로 쓴 새 객체를 버킷 소유자가 소유하고 제어해요.
  • Object writer: 객체를 업로드한 AWS 계정이 객체를 소유하고, ACL로 다른 사용자에게 접근을 부여할 수 있어요.

참고: 기본 설정을 적용하려면 s3:CreateBucket 권한만 필요해요. ACL을 활성화하려면 s3:PutBucketOwnershipControls 권한이 필요해요.

Block Public Access settings for this bucket에서 적용할 설정을 선택해요. 기본적으로 네 가지 설정이 모두 활성화돼 있어요. 모든 설정을 활성화하려면 s3:CreateBucket 권한만 필요하고, 끄려면 s3:PutBucketPublicAccessBlock 권한이 필요해요.

선택 사항으로 Bucket Versioning을 활성화하거나, Tags를 추가하거나, Default encryption을 구성할 수 있어요. SSE-KMS 또는 DSSE-KMS를 선택하면 AWS KMS 키를 지정해야 해요. SSE-KMS 기본 암호화를 구성할 때는 S3 Bucket Keys를 사용할 수 있어요(콘솔에서 기본적으로 활성화). S3 Object Lock을 활성화하려면 Advanced settings에서 선택할 수 있으며, 활성화하면 버킷에 버전 관리가 자동으로 활성화돼요.

참고: Object Lock 활성화 버킷을 만들려면 s3:CreateBucket, s3:PutBucketVersioning, s3:PutBucketObjectLockConfiguration 권한이 필요해요.

마지막으로 Create bucket을 선택하면 버킷이 생성돼요.

AWS SDK로 일반 목적 버킷 만들기

AWS SDK로 버킷을 만들 때는 클라이언트를 만든 뒤 그 클라이언트로 버킷 생성 요청을 보내요. 모범 사례는 클라이언트와 버킷을 같은 AWS Region에서 만드는 거예요. 리전을 지정하지 않으면 기본 리전인 US East (N. Virginia)가 사용돼요.

Java:

  • AWS SDK for Java v2를 사용할 때는 버킷 이름에 GUID를 붙여 고유성을 보장할 수 있어요. UUID.randomUUID().toString().replace("-", "")로 GUID를 생성해 기본 이름과 연결하세요.

.NET 예시:

using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using Amazon.S3.Util;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class CreateBucketTest
    {
        private const string bucketName = "*** bucket name ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;
        public static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            CreateBucketAsync().Wait();
        }

        static async Task CreateBucketAsync()
        {
            try
            {
                if (!(await AmazonS3Util.DoesS3BucketExistAsync(s3Client, bucketName)))
                {
                    var putBucketRequest = new PutBucketRequest
                    {
                        BucketName = bucketName,
                        UseClientRegion = true
                    };
                    PutBucketResponse putBucketResponse = await s3Client.PutBucketAsync(putBucketRequest);
                }
                // Retrieve the bucket location.
                string bucketLocation = await FindBucketLocationAsync(s3Client);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. 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);
            }
        }
        static async Task<string> FindBucketLocationAsync(IAmazonS3 client)
        {
            string bucketLocation;
            var request = new GetBucketLocationRequest() { BucketName = bucketName };
            GetBucketLocationResponse response = await client.GetBucketLocationAsync(request);
            bucketLocation = response.Location.ToString();
            return bucketLocation;
        }
    }
}

Ruby 예시:

require 'aws-sdk-s3'

# Wraps Amazon S3 bucket actions.
class BucketCreateWrapper
  attr_reader :bucket

  def initialize(bucket)
    @bucket = bucket
  end

  # Creates an Amazon S3 bucket in the specified AWS Region.
  def create?(region)
    @bucket.create(create_bucket_configuration: { location_constraint: region })
    true
  rescue Aws::Errors::ServiceError => e
    puts "Couldn't create bucket. Here's why: #{e.message}"
    false
  end

  # Gets the Region where the bucket is located.
  def location
    if @bucket.nil?
      'None. You must create a bucket before you can get its location!'
    else
      @bucket.client.get_bucket_location(bucket: @bucket.name).location_constraint
    end
  rescue Aws::Errors::ServiceError => e
    "Couldn't get the location of #{@bucket.name}. Here's why: #{e.message}"
  end
end

# Example usage:
def run_demo
  region = "us-west-2"
  wrapper = BucketCreateWrapper.new(Aws::S3::Bucket.new("amzn-s3-demo-bucket-#{Random.uuid}"))
  return unless wrapper.create?(region)
  puts "Created bucket #{wrapper.bucket.name}."
  puts "Your bucket's region is: #{wrapper.location}"
end

run_demo if $PROGRAM_NAME == __FILE__

AWS CLI로 일반 목적 버킷 만들기

US West (N. California) 리전(us-west-1)에 이름 끝에 GUID를 사용한 버킷을 만들 수 있어요:

aws s3api create-bucket \
    --bucket amzn-s3-demo-bucket1 $(uuidgen | tr -d - | tr '[:upper:]' '[:lower:]') \
    --region us-west-1 \
    --create-bucket-configuration LocationConstraint=us-west-1

더 알아보기 (Learn more)