S3バケットを1000個作成してみる

# 内容
先日S3のバケット数の上限が1アカウントあたりデフォルト100個（最大1000個）からデフォルト10000個(最大100万個)に増加し大量のS3バケットを作成したい場合には嬉しいアップデートとなりました。大量のリソースを作成する場合は色々と他の制限事項等も出てくるため実際にS3バケットを1000個作成してみました。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/amazon-s3-up-1-million-buckets-per-aws-account/

# S3バケット作成概要
CloudFormation（以下CFn）で作成を行いました。S3のバケット名は`20241211-s連番-abcd`としてこの連番の箇所はSystem Manager（以下SSM）のパラメータストアにList形式として保存しています。CFnを実行することでSSMパラメータストアからこの連番の値を読込、テンプレートからS3バケットを作成する仕組みとなります。

![s31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/1f1f2e90-a905-9e27-9841-8027523a99f2.png)

# CFnコードの説明

```yaml:s3-test-01.yaml
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`の値が入っています。

```yaml
  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バケットを作成していきます。

```yaml
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でした。

![s32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/7a56f6ae-2c5c-664a-8d0d-ee0edcfba66c.png)

そのため、文字数を減らして1回目は`s0001・・・s0600`（600個作成）で作成してみます。

![s33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/0784b437-602f-8487-3a7b-b610e814390e.png)

# CFnリソースの上限で失敗

上記`s3-test-01.yaml`のテンプレートを使用してCFnのスタックを作成します。テンプレートファイル名とスタック名を入力後、デフォルト設定で実行します。

![s34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/0a7da4bb-c619-ba01-d168-41e1a417b99c.png)

スタック実行後、下記エラーで失敗しました。CFnの最大リソース数は～500でした。

![s35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/96fabbd9-f9b7-4ad3-1e34-9d8538e1a3bc.png)

# 500個作成

上記のため、SSMパラメータストア内の値を`s0001・・・s0500`とし、1回で500個作成してみます。

![s36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/c0cb0b10-576f-811e-6f31-f36f9668834c.png)

同様にCFnスタックを作成すると今回は成功しました。

![s37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/eb374116-9d3d-c9b2-df6f-af2f238ec530.png)

# 追加500個作成

もう一つ`s3-test-02.yaml`というテンプレートを作成して、SSMパラメータストア名を`s3list2`とします。`s3list2`というSSMパラメータストアを作成し、値に`s0501・・・s1000`をセットします。その後、同様にCFnを実行します。

```yaml:s3-test-02.yaml
  S3List:
    Type: AWS::SSM::Parameter::Value<List<String>>
    Default: s3list2
```

S3バケットが1000個作成されました。元々このアカウントには7個バケットがあったので1007個になりました。

![s38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/0c3e0608-2fc6-3180-c641-ba9eb41282b9.png)

大量のリソースを作成する際は思わぬクォータに引っかかる可能性があるため、事前にクォータ値の確認や申請により引き上げ可能な値かをチェックする必要があります。