ActiveModel validator for Amazon S3 bucket names. It implements the official AWS naming rules for:
- General purpose buckets (classic S3)
- Directory buckets (S3 Express One Zone)
- S3 Tables buckets
Works in any class using ActiveModel::Validations and in Rails/ActiveRecord models. Ships with i18n messages in multiple locales.
Add to your Gemfile:
gem "activerecord-s3-bucket-name-validator"
Then bundle:
bundle install
- Ruby: 3.1, 3.2, 3.3, 3.4 (CI runs 3.2–3.4)
- ActiveModel: 7.2, 8.0 (CI targets)
- Rails/ActiveRecord: supported via ActiveModel::Validations (no Rails runtime dependency)
Plain ActiveModel:
class StorageConfig
include ActiveModel::Model
attr_accessor :bucket_name
validates :bucket_name, s3_bucket_name: true
end
ActiveRecord model:
class Storage < ApplicationRecord
validates :bucket_name, s3_bucket_name: true
end
type
—:general_purpose
(default),:directory
, or:table
transfer_acceleration
— whentrue
, periods are forbidden for general-purpose buckets
Examples:
validates :bucket_name, s3_bucket_name: { transfer_acceleration: true }
validates :bucket_name, s3_bucket_name: { type: :directory }
validates :bucket_name, s3_bucket_name: { type: :table }
Error keys provided:
activemodel.errors.messages.s3_bucket_name_invalid_general
activemodel.errors.messages.s3_bucket_name_invalid_transfer_acceleration
activemodel.errors.messages.s3_bucket_name_invalid_directory
activemodel.errors.messages.s3_bucket_name_invalid_table
Locales shipped: en, es, it, fr, de, pt-BR, ja, ko, zh-CN, zh-TW, ru, nl.
Rails loads locales via a Railtie; plain ActiveModel loads them at require-time. Override by adding your own YAML with the same keys.
- Length 3–63, allowed characters, begin/end alphanumeric
- No adjacent periods; not IP-like (general purpose)
- Reserved prefixes/suffixes per AWS docs (for example
xn--
,sthree-
,amzn-s3-demo-
,-s3alias
,--ol-s3
,.mrap
,--x-s3
,--table-s3
) - Directory buckets must end with
--<zone-id>--x-s3
- S3 Tables buckets disallow periods and underscores
- Optional TA mode forbids periods
Note: Global/partition uniqueness and immutability are service-side constraints and not enforced locally.
Valid (general purpose):
my-example-bucket
example.com
Invalid (general purpose):
ex..ample
192.168.5.4
xn--abc
foo--x-s3
# ActiveModel-only
bundle install
bundle exec rake test
# With ActiveRecord integration (in-memory sqlite)
AR_INTEGRATION=1 ACTIVERECORD_VERSION="~> 8.0" bundle install
AR_INTEGRATION=1 ACTIVERECORD_VERSION="~> 8.0" bundle exec rake test
MIT — see LICENSE.txt
.