おぎろぐはてブロ

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

S3のバケットを100個以上使えるよう別アカウントのバケットの権限を移譲する

2015/08/12 Update

2015/08/04より、S3のバケットの作成上限100の上限緩和申請ができるようになりました。

Bucket Limit Increase: You can now increase your Amazon S3 bucket limit per AWS account. All AWS accounts have a default bucket limit of 100 buckets, and starting today you can now request additional buckets by visiting AWS Service Limits.

Amazon S3 Introduces New Usability Enhancements

以下、クロスアカウントでの利用には引き続き有用だと思いますので残しておきます。


AWSではいろいろなパラメータに上限値が定められていますが、S3のバケット数の1アカウント上限100件もその中の1つです。 上限緩和申請できるパラメータとそうでないパラメータがありますが、バケット数についてはどうも後者の模様

ということで、S3バッドノウハウ。アクセス権限を移譲することで、100個以上のバケットを利用する方法と、できないことについてまとめます。

制限についておさらい

バケットの制約と制限 - Amazon Simple Storage Service から

  • 各 AWS アカウントは、同時に最大100個のバケットを所有できます。
  • 1 つのバケット内に格納できるオブジェクトの数に制限はありません。
  • 使用するバケットの数によってパフォーマンスに差が出ることもありません。すべてのオブジェクトを 1 つのバケットに格納することができます。また、複数のバケットに分けて整理してもかまいません。

バケットは100個だけど中身の数は無制限。

(AWS ConsoleなどGUIではバケットの中にフォルダがあるイメージですが、バケットの下は実際はフラットで、delimiterとprefixを指定することでディレクトリっぽい階層構造のアクセスを行っています。 プレフィックスと区切り記号によるキーの階層的なリスト を参照)

100個の制限はアカウントに紐づく制限のため、IAMでは解決できません。

なぜバケットを分けるか

バケットを分けるケースを考えてみます。 独自ドメインのホスティングなどは当然必要ですが、それ以外について。

環境 (development/production) による分離

バケット名だけを差し替えて、開発環境と本番環境を切り替えられるように。 こちらについては、権限の強いアカウントでミスオペレーションをして困ったことにならないように、開発環境と本番環境で、アカウントも変えてもよいでしょう。

複数人で開発していて、各ブランチや各個人の開発環境でバケットを切り替えようとするとあっという間に100個なんぞ超えてしまうので、開発環境はバケット下にディレクトリを切って使うことになるかなと思うのですが、でも、そうすると本番と挙動がずれる感があり難しいところ。

権限管理のオペレーションのシンプルさ

IAMポリシーは arn:aws:s3:::my_corporate_bucket/home/bob/* みたいにバケットの一部へリソースを絞り込むことができるので、権限を管理することはできます。が、バケットに対して権限を指定するほうがシンプルで分かり易いという面はあります。 あと、GUIで見るときに、権限が無いのでバケットのrootとかが開けなくてわかりづらいとかはあります。(Windowsのフォルダアクセス管理と同じ感じ)

リージョンを変える必要がある

たとえば、サービスを日本を中心に展開していたり、日本語のコンテンツは東京リージョンに設置するのが、アップロードもダウンロードも高速でよいですし、コンテンツごとにアクセス元の偏りがはっきりしているなら、それに合わせたリージョン配置にするとレイテンシーが最適化されます。 が、そんなに偏ってもなかったり、管理がめんどいなら、CloudFrontを使いましょう。GET以外もエッジ経由でproxyできるようになっています。

解決案

Consolidated Billingで支払いについては複数アカウントを束ねることはできますが、権限についてはまったく分離された別アカウント状態となります。 バケットのGranteeに追加することで権限移譲ができだいたいの処理は可能です。 少なくとも最初のバケットを作って権限移譲をするまでは、バケットを作成したアカウントで作業をする必要があります。

操作用のアカウントをIAMで管理するAWSアカウントを A 、 S3バケットXを作成するAWSアカウントを B とします。

  1. BでS3バケットXを作成する
  2. BでS3バケットXのgranteeにAを設定する。あと、必要に応じてロギング設定をする
  3. AのIAMでXにアクセスできるpolicyのIAMアカウントをつくる。自身のバケットと同じように設定できます
  4. AのIAMアカウントでS3バケットXにアクセスする

シンプルですが、いくつかできないことがあります。

  • Bのアカウントでバケット一覧でXが表示されない
  • バケットXに対するオペレーションはBのアカウントでしかできない
    • バケット作成、削除、権限変更、アクセスログ設定
  • バケットのアクセスログは同じアカウントのバケットにしか設定できない

まとめ

サンタさん、100個以上バケットを使えるS3がほしいです。 100個以上使えるようになった!

  • 将来的にバケット100個が枯渇しそうな設計はなるべくしない
  • 100個超えるような場合は権限移譲である程度解決できる