おぎろぐはてブロ

なんだかんだエンジニアになって10年以上

boto.s3で大文字を含むバケットにアクセスする

大文字を含むバケットをUS Standardでは作ることができるのですが、そのバケットにbotoでアクセスしようとすると以下のように怒られます。

Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format.

言ってることは解りますが、じゃ、どうしたらアクセスできるのか。というと、calling_formatというオプションを明示的に指定する必要があります。

calling format とは

S3へのアクセススタイル。以下が定義されている。 詳しくは s3/connection.py を参照。

  • SubdomainCallingFormat: サブドメイン。これがデフォルト
  • VHostCallingFormat: 独自ドメインだと思う
  • OrdinaryCallingFormat: パススタイル
  • ProtocolIndependentOrdinaryCallingFormat: Ordinaryだけどscheme (http/https) を明示しない何か

大文字を含んでいる場合は OrdinaryCallingFormat を利用すればよいです。

指定方法

設定ファイル

[s3]
calling_format = boto.s3.connection.OrdinaryCallingFormat

S3Connectionのコンストラクタ

from boto.s3.connection import OrdinaryCallingFormat, S3Connection

conn = S3Connection(calling_format=OrdinaryCallingFormat)

2.13.2 以前のboto

仕様が変わっていて、設定ファイルでの指定は不可。また、クラスもしくはクラス名ではなく、インスタンスを渡す必要がある。

from boto.s3.connection import OrdinaryCallingFormat, S3Connection

conn = S3Connection(calling_format=OrdinaryCallingFormat())