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
endActiveRecord model:
class Storage < ApplicationRecord
validates :bucket_name, s3_bucket_name: true
endtype—:general_purpose(default),:directory, or:tabletransfer_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_generalactivemodel.errors.messages.s3_bucket_name_invalid_transfer_accelerationactivemodel.errors.messages.s3_bucket_name_invalid_directoryactivemodel.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 testMIT — see LICENSE.txt.