S3 StorageLensをCloudFormationで作成する

こんにちは

今回はCloudFormationでシンプルなStorageLensを作成するコードの書き方についてです。

メトリクスの有料・無料を記述する部分が意外とややこしかったりするので、誰かのお役に立てば幸いです。

## サンプルコード
```yaml
StandardStorageLensConfiguration:
    Type: AWS::S3::StorageLens
    Properties:
      StorageLensConfiguration:
        Id: SampleStorageLensDashboard #StorageLensダッシュボード名
        IsEnabled: true
        AccountLevel: #アカウント単位のメトリクス設定（有料メトリクス）
          ActivityMetrics: #--アクティビティメトリクス
            IsEnabled: true
          AdvancedCostOptimizationMetrics: #--高度なコスト最適化メトリクス
            IsEnabled: true
          AdvancedDataProtectionMetrics: #--高度なデータ保護メトリクス
            IsEnabled: true
          DetailedStatusCodesMetrics: #--詳細なステータスコードのメトリクス
            IsEnabled: true
          BucketLevel: #--バケット単位のメトリクス設定（有料メトリクス）
            ActivityMetrics:
              IsEnabled: true
            AdvancedCostOptimizationMetrics:
              IsEnabled: true
            AdvancedDataProtectionMetrics:
              IsEnabled: true
            DetailedStatusCodesMetrics:
              IsEnabled: true
            PrefixLevel: #--プレフィックス集約の設定
              StorageMetrics:
                IsEnabled: true
                SelectionCriteria:
                  MaxDepth: 10 #---プレフィックスの深さ
                  MinStorageBytesPercentage: 1 #---プレフィックスのしきい値 (%)
                  Delimiter: "/" #---区切り文字
        Include: #対象とするリージョンとバケット
          Buckets: 
            - BacketArn #--対象とするバケットArnを列挙
          Regions: 
            - !Ref AWS::Region
       Tags: 
        - Key: "tag1"
          Value: "value1
```
## 説明
こちらのCloudFormationで作成されるStorageLensの構成は、以下のとおりです。
（マネジメントコンソールベースの順番と名称で記載しています。）

**StorageLensの構成**
- ダッシュボード名： SampleStorageLensDashboard
- ホームリージョン：(Stackを作成したリージョン）
- ステータス：有効
- タグ： キー：tag1　値：value1
- リージョンとバケットを選択：リージョンとバケットを含める
- 含めるリージョンを指定：(Stackを作成したリージョン）
- 含めるバケットを選択：「 Buckets:」で指定したバケット
- メトリクスの選択：高度なメトリクスとレコメンデーション
  - 高度なメトリクス：有効
    - アクティビティメトリクス
    - 詳細なステータスコードのメトリクス
    - 高度なコスト最適化メトリクス
    - 高度なコスト最適化メトリクス
  - CloudWatch パブリッシュ：無効
  - プレフィックス集約：有効
    - プレフィックスのしきい値 (%)：1
    - プレフィックスの深さ：10
    - 区切り文字：/
- メトリクスのエクスポート：無効

今回はCloudWatchパブリッシュやメトリクスのエクスポート（S3に１日１回エクスポートする機能）などは設定していませんが、これらの機能もCFnで設定可能です。

## 無料メトリクスのみ利用したい場合
```yaml
StandardStorageLensConfiguration:
    Type: AWS::S3::StorageLens
    Properties:
      StorageLensConfiguration:
        Id: SampleStorageLensDashboard
        IsEnabled: true
        AccountLevel: #無料メトリクスのみとする
          BucketLevel: {}
        Include: 
          Buckets: 
            - BacketArn
          Regions: 
            - !Ref AWS::Region
       Tags: 
        - Key: "tag1"
          Value: "value1
```
無料メトリクスのみを利用したい場合は上記のようにしてください。
先程のコードとの変更点・ポイントは、AccountLevel 下の BucketLevel を要素としては指定するものの、内容を空欄としている点です。
AccountLevel、BucketLevel は必須項目のため、有料メトリクスは不要だからとこの部分のコード自体を削除すると、スタック作成時にエラーになってしまいます。
ここの書き方はちょっと感覚的ではないのでつまづく人も居そうです（私がそのひとり）。

以上、お役に立てば幸いです。
ご覧いただきありがとうございました。

## 参考情報
- https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-s3-storagelens.html
- https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-storagelensconfiguration.html
- https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-accountlevel.html
- https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-bucketlevel.html