일반 목적 버킷의 네임스페이스
일반 목적 버킷의 네임스페이스
기본적으로 일반 목적 버킷은 **전역 네임스페이스(global namespace)**에 존재해요. 즉 파티션 안의 모든 AWS 리전과 모든 AWS 계정에 걸쳐 각 버킷 이름이 고유해야 해요. 파티션은 리전의 묶음이에요. AWS에는 현재 4개의 파티션이 있어요: aws(표준 리전), aws-cn(중국 리전), aws-us-gov(AWS GovCloud (US)), aws-eusc(European Sovereign Cloud). 일반 목적 버킷을 만들 때 공유 전역 네임스페이스 또는 계정 리전별 네임스페이스(account regional namespace) 중 하나를 선택할 수 있어요. 계정 리전별 네임스페이스는 전역 네임스페이스의 하위 구역으로, 내 계정만 버킷을 만들 수 있어요.
출처: 문서
본문
전역 일반 목적 버킷 (Global general purpose buckets)
기본적으로 공유 전역 네임스페이스에 전역 일반 목적 버킷을 만들어요. 공유 전역 네임스페이스에 버킷을 만든 후에는 파티션 안에서 다른 누구도 그 이름으로 버킷을 만들 수 없어요. 전역 일반 목적 버킷을 삭제하면 이름은 다시 누구나 쓸 수 있게 돼요.
전역 일반 목적 버킷을 만들 때 명명 규칙을 지키는 어떤 이름이든 요청할 수 있어요. 이름은 최소 3자에서 최대 63자 사이여야 하고, 소문자, 숫자, 마침표(.), 하이픈(-)만 쓸 수 있어요. 버킷 이름은 문자나 숫자로 시작·끝나야 하고 인접한 두 개의 마침표를 포함할 수 없어요.
전역 일반 목적 버킷 이름을 정할 때는 파티션 안에서 아직 사용되지 않는 고유한 이름을 선택해야 해요. 이미 존재하고 다른 사람이 소유한 버킷을 만들려고 하면 HTTP 409 BucketAlreadyExists 오류가 나고, 내가 소유한 버킷을 다시 만들려고 하면 HTTP 409 BucketAlreadyOwnedByYou 오류가 나요.
전역 일반 목적 버킷은 원하는 이름을 고를 때 가장 유연해요. 공유 전역 네임스페이스이므로 다른 계정이 비슷한 버킷 이름을 만들 수 있고, 내가 삭제한 이름을 다시 만들 수도 있어요. 특정 명명 규칙을 가용성이나 보안 검증에 의존하면 안 돼요. 이미 버킷을 만들지 않았다면 선택한 이름이 사용 가능하다고 가정하는 코드를 작성하지 마세요. 예측 불가능한 버킷 이름을 만드는 한 가지 방법은 버킷 이름에 GUID를 붙이는 거예요. 예: amzn-s3-demo-bucket-a1b2c3d4-5678-90ab-cdef-example11111.
계정 리전별 네임스페이스 일반 목적 버킷 (Account regional namespace general purpose buckets)
일반 목적 버킷이 공유 전역 네임스페이스에 존재하지만, 계정 리전별 네임스페이스에 버킷을 만들 수도 있어요. 이 네임스페이스는 전역 버킷 네임스페이스의 예약된 하위 구역으로, 오직 내 계정만 일반 목적 버킷을 만들 수 있어요. 계정 리전별 네임스페이스에 만든 새 버킷은 내 계정에만 고유하며, 다른 계정은 절대 다시 만들 수 없어요. 이런 버킷은 공유 전역 네임스페이스의 버킷이 지원하는 모든 S3 기능과 AWS 서비스를 지원해요. 애플리케이션을 변경할 필요 없이 상호작용할 수 있어요.
참고: Middle East (Bahrain)과 Middle East (UAE)를 제외한 모든 AWS 리전에서 계정 리전별 네임스페이스에 버킷을 만들 수 있어요.
계정 리전별 네임스페이스에 버킷을 만드는 것은 보안 모범 사례예요. 이 버킷 이름은 오직 내 계정만 쓸 수 있어요. 여러 AWS 리전에 걸쳐 일반 목적 버킷 이름을 쉽게 템플릿화할 수 있고, 다른 계정이 내 네임스페이스에 버킷 이름을 만들 수 없다는 보장을 받아요. 다른 계정이 내 계정 리전별 접미사를 가진 버킷을 만들려고 하면 CreateBucket 요청이 거부돼요.
계정 리전별 네임스페이스 명명 규칙
계정 리전별 네임스페이스의 일반 목적 버킷은 특정 명명 규칙을 따라야 해요. 버킷 이름은 내가 만드는 **접두사(prefix)**와 12자리 AWS 계정 ID, AWS 리전 코드가 포함되고 -an으로 끝나는 접미사로 구성돼요.
bucket-name-prefix-accountId-region-an
예를 들어, AWS 계정 111122223333의 us-west-2 리전 계정 리전별 네임스페이스에 존재하는 일반 목적 버킷은 다음과 같아요:
amzn-s3-demo-bucket-111122223333-us-west-2-an
계정 리전별 네임스페이스에 버킷을 만들려면 CreateBucket 요청을 하고, x-amz-bucket-namespace 요청 헤더 값에 account-regional을 지정해요. 그리고 <고객이-선택한-이름>-<AWS-계정-ID>-<AWS-리전>-an 형식의 버킷 이름을 지정해요.
참고: 콘솔로 계정 리전별 네임스페이스에 버킷을 만들면 내가 입력한 접두사에 접미사가 자동으로 추가돼요. CreateBucket API로 만들 때는 전체 접미사(계정 ID와 리전 포함)를 직접 제공해야 해요.
CloudFormation 템플릿에 계정 리전별 네임스페이스 통합
CloudFormation 같은 IaC 도구를 업데이트해 계정 리전별 네임스페이스에 버킷을 만드는 작업을 간단히 할 수 있어요. CloudFormation의 의사 파라미터 AWS::AccountId와 AWS::Region을 사용하면 쉽게 템플릿을 만들 수 있어요.
예시 1 — BucketName과 Sub 사용:
BucketName: !Sub "amzn-s3-demo-bucket-${AWS::AccountId}-${AWS::Region}-an"
BucketNamespace: "account-regional"
예시 2 — BucketNamePrefix 사용:
BucketNamePrefix: 'amzn-s3-demo-bucket'
BucketNamespace: "account-regional"
BucketNamePrefix 속성을 쓰면 버킷 이름의 고객 정의 부분만 제공하면 되고, 요청한 AWS 계정과 리전을 기준으로 계정 리전별 접미사가 자동으로 추가돼요.
제한 및 고려 사항 (Restrictions and considerations)
공유 전역 네임스페이스에 버킷을 만들 때의 고려 사항:
- 공유 전역 네임스페이스의 버킷 이름은 버킷이 삭제되기 전까지 같은 파티션의 다른 AWS 계정이 쓸 수 없어요. 삭제 후에는 다른 계정이 같은 이름을 쓸 수 있고, 삭제된 버킷을 대상으로 한 요청을 받을 수도 있어요.
- 원하는 버킷 이름이 이미 다른 계정에 사용 중일 수 있고, 다른 계정의 이름이 내 것과 비슷할 수 있다는 점을 고려하세요.
- Amazon S3는 버킷을 이름으로 식별하므로, 잘못된 버킷 이름을 사용한 애플리케이션은 의도치 않게 다른 버킷에 작업을 수행할 수 있어요. 이를 막으려면 bucket owner condition을 사용할 수 있어요.
계정 리전별 네임스페이스에 버킷을 만들 때의 제한:
- 이미 소유한 계정 리전별 네임스페이스 버킷을 어느 AWS 리전에서 다시 만들려고 해도
HTTP 409 BucketAlreadyOwnedByYou오류가 나요. - 계정 리전별 네임스페이스에 버킷을 만들 때는 S3 리전별 엔드포인트를 사용해야 해요. 역호환성을 위해 US East (N. Virginia) 리전에서는 기존 전역 엔드포인트를 사용해 만들 수도 있어요.
- 계정 리전별 접미사는 일반 목적 버킷 이름의 63자 제한에 포함돼요. 예를 들어 접미사가
-012345678910-us-east-1-an이면 접두사에 37자를 쓸 수 있어요.
AWS 리전 코드 형식
계정 리전별 네임스페이스에 버킷을 만들려면 접미사에 AWS 리전을 포함해야 해요. 전체 리전 코드(예: us-west-2)를 지정해야 해요. 예:
amzn-s3-demo-bucket-012345678910-ap-southeast-1-anamzn-s3-demo-bucket-987654321012-eu-north-1-an
계정 리전별 네임스페이스 버킷 생성을 강제하기
s3:x-amz-bucket-namespace 조건 키를 사용해 IAM 주체가 계정 리전별 네임스페이스에서만 버킷을 만들도록 강제할 수 있어요. IAM 정책, 리소스 제어 정책(RCP), 서비스 제어 정책(SCP)으로 적용하는 예시를 살펴볼게요.
IAM 정책 — x-amz-bucket-namespace 헤더가 account-regional이 아닌 요청에 대해 s3:CreateBucket을 거부:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RequireAccountRegionalBucketCreation",
"Effect": "Deny",
"Action": "s3:CreateBucket",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-bucket-namespace": "account-regional"
}
}
}
]
}
리소스 제어 정책 (RCP) — 위와 동일하게 모든 사용자에게 s3:CreateBucket 거부:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "OnlyCreateBucketsInAccountRegionalNamespace",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:CreateBucket",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-bucket-namespace": "account-regional"
}
}
}
]
}
서비스 제어 정책 (SCP) — 위와 동일한 내용을 SCP로 적용:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RequireAccountRegionalBucketCreation",
"Effect": "Deny",
"Action": "s3:CreateBucket",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-bucket-namespace": "account-regional"
}
}
}
]
}
계정 리전별 네임스페이스에 버킷 만들기
AWS CLI를 사용해 AWS 계정 012345678910의 US West (N. California) 리전(us-west-1) 계정 리전별 네임스페이스에 일반 목적 버킷을 만들 수 있어요:
aws s3api create-bucket \
--bucket amzn-s3-demo-bucket-012345678910-us-west-1-an \
--bucket-namespace account-regional \
--region us-west-1 \
--create-bucket-configuration LocationConstraint=us-west-1