内容
先日S3のバケット数の上限が1アカウントあたりデフォルト100個(最大1000個)からデフォルト10000個(最大100万個)に増加し大量のS3バケットを作成したい場合には嬉しいアップデートとなりました。大量のリソースを作成する場合は色々と他の制限事項等も出てくるため実際にS3バケットを1000個作成してみました。
S3バケット作成概要
CloudFormation(以下CFn)で作成を行いました。S3のバケット名は20241211-s連番-abcd
としてこの連番の箇所はSystem Manager(以下SSM)のパラメータストアにList形式として保存しています。CFnを実行することでSSMパラメータストアからこの連番の値を読込、テンプレートからS3バケットを作成する仕組みとなります。
CFnコードの説明
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Parameters:
S3List:
Type: AWS::SSM::Parameter::Value<List<String>>
Default: s3list
Resources:
Fn::ForEach::S3Loop:
- S3Items
- !Ref S3List
- 'S3Bucket${S3Items}':
Type: 'AWS::S3::Bucket'
Properties:
BucketName: !Sub '20241211-${S3Items}-abcd'
下記の箇所でこの後作成するSSMパラメータストアのリスト名を指定しています。SSMパラメータストアの中にs0001,s0002,s0003・・・s1000
の値が入っています。
S3List:
Type: AWS::SSM::Parameter::Value<List<String>>
Default: s3list
今回S3バケットの設定はBucketName: !Sub '20241211-${S3Items}-abcd'
の箇所で作成するS3バケット名のみ指定しています。${S3Items}
の箇所ですがFn::ForEach::
を使用して、SSMパラメータストア内に保存しているs0001,s0002,s0003・・・s1000
の値を順番に取得してS3バケットを作成していきます。
Resources:
Fn::ForEach::S3Loop:
- S3Items
- !Ref S3List
- 'S3Bucket${S3Items}':
Type: 'AWS::S3::Bucket'
Properties:
BucketName: !Sub '20241211-${S3Items}-abcd'
パラメータストアの上限で失敗
SSMパラメータストアを作成します。名前をs3list
タイプをStringList
として値をs0001,s0002 ・・・s1000
と指定します。ここで文字数の上限に引っかかります。最大文字数は~4096でした。
そのため、文字数を減らして1回目はs0001・・・s0600
(600個作成)で作成してみます。
CFnリソースの上限で失敗
上記s3-test-01.yaml
のテンプレートを使用してCFnのスタックを作成します。テンプレートファイル名とスタック名を入力後、デフォルト設定で実行します。
スタック実行後、下記エラーで失敗しました。CFnの最大リソース数は~500でした。
500個作成
上記のため、SSMパラメータストア内の値をs0001・・・s0500
とし、1回で500個作成してみます。
同様にCFnスタックを作成すると今回は成功しました。
追加500個作成
もう一つs3-test-02.yaml
というテンプレートを作成して、SSMパラメータストア名をs3list2
とします。s3list2
というSSMパラメータストアを作成し、値にs0501・・・s1000
をセットします。その後、同様にCFnを実行します。
S3List:
Type: AWS::SSM::Parameter::Value<List<String>>
Default: s3list2
S3バケットが1000個作成されました。元々このアカウントには7個バケットがあったので1007個になりました。
大量のリソースを作成する際は思わぬクォータに引っかかる可能性があるため、事前にクォータ値の確認や申請により引き上げ可能な値かをチェックする必要があります。