No release in over 3 years
Validate S3 bucket names on your models against the official AWS rules (general purpose, directory buckets, and S3 Tables).
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

>= 1.17
>= 5.0
>= 10.0

Runtime

>= 7.0, < 9
>= 1.0
 Project Readme

ActiveModel S3 Bucket Name Validator

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.

Installation

Add to your Gemfile:

gem "activerecord-s3-bucket-name-validator"

Then bundle:

bundle install

Compatibility

  • 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)

Quickstart

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

Options

  • type:general_purpose (default), :directory, or :table
  • transfer_acceleration — when true, 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 }

i18n

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.

What’s validated (high level)

  • 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.

Examples

Valid (general purpose):

my-example-bucket
example.com

Invalid (general purpose):

ex..ample
192.168.5.4
xn--abc
foo--x-s3

Running tests (for contributors)

# 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

License

MIT — see LICENSE.txt.