일반 목적 버킷 생성
일반 목적 버킷 생성
데이터를 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