CloudFormationのインポート機能を使って、既存のS3バケットのストレージクラス分析を設定する

2021.02.16

AWS事業本部の梶原@福岡オフィスです。 S3バケットのストレージクラス分析を設定する機会がありましたので、CloudFormationでの設定実施に寄せてみました。

なんで、こんなことしてるのか?という疑問もあると思いますが 1つだけなら特に問題ないですが、今後多くのバケットをコンソールでポチポチやるのは大変だなと思ったのと、 CLIでもいいですが、有効、無効の状態管理できなくなる、有効にしたバケットを大量のバケットの中から見つけるのももちょっとやだなといったモチベーションでCloudFormationでの管理に寄せてます。

また、ストレージクラス分析自体が最初の表示が48時間後、正確な情報表示には30日前後かかるとのことで、実行管理にも役立ることもできるかと思ってます。

ストレージクラス分析以外にも、CloudFormationのインポート機能を使うとこで、0からの作成でなくて、ちょっとした設定にも活用できるかと思います。

ということで、サクサク行きます。

ストレージクラス分析 とは?

Amazon S3 分析 – ストレージクラス分析

Amazon S3 分析のストレージクラス分析を使用することにより、ストレージアクセスパターンを分析し、適切なデータをいつ適切なストレージクラスに移行すべきかを判断できます

大体1か月くらいかな、えいや!となりがちな、ライフサイクル設定の指標となる情報を提示してくれます。 有料の設定にはなりますが、大容量のバケットで標準ストレージで塩漬けしているオブジェクトなどが多い状況だけど、アクセス状況がわからない とかいう場合には、コストを最適化する際に役に立つかと思います。

リージョン 料金
アジアパシフィック(東京)の料金 モニタリングされるオブジェクト 100 万個あたり/月 0.10USD 

CloudFormation スタックへの既存リソースのインポートとは?

新機能 – CloudFormation スタックへの既存リソースのインポート

すでに、あるリソースをCloudFormationのスタックに取り込みことができ、スタックの管理下に置くことができます。 今回はこの機能をつかって、
既存のS3バケットを一度、CloudFormationの配下におき、そのあと
ストレージクラス分析を有効にします。

※※※ 注意 ※※※

すでにS3バケットがCloudFormationで管理されている場合

すでに、CloudFormationを用いて、S3バケットを管理している場合は、インポートを実施せずに 既存のスタックに対して、変更を加えてください。後程ご案内するテンプレートのAnalyticsConfigurations の部分を加える ことで、ストレージクラス分析が有効になります

スタックの削除時

今回、インポートを行っているため、DeletionPolicyがRetain(スタック削除時に保持する)となっています。 ですので、ストレージクラス分析を有効にした後に、スタックを削除しても、S3バケットには影響はなく ストレージクラス分析を無効にしませんので、ご注意ください

ストレージクラス分析を無効にしたい場合は、一度、スタックの更新で無効に(EnableAnalyticsConfigurationパラメータをNo) にして、スタックを更新し、解析設定を削除したた後に、スタック削除を実施してください。

やってみる

テンプレート(抜粋)

実際のテンプレートは最後に記載しています。 今回は、余計な設定をつけると既存のリソースの設定に影響がでるため、解析設定の部分だけの最低限の設定を記述したテンプレートを使用します。
また、IF条件を使用して、インポート時には無効にしています。

Resources:
  MyBucket:
    DeletionPolicy: Retain # スタック削除時にリソース削除しない
    Type: AWS::S3::Bucket
    Properties:
      AnalyticsConfigurations: !If
        - EnableAnalyticsConfiguration # 条件
        - # 条件がTrueの場合配列の値を指定
          - Id: SCA-AAAAAAAA # IDを指定
            StorageClassAnalysis: {} # 空指定は{}
        - !Ref AWS::NoValue # 条件がFalseの場合はAnalyticsConfigurationsプロパティを削除

インポートを行うため、 DeletionPolicy: Retain を指定

また、AnalyticsConfigurations を設定しています 特にオプションを指定する必要がなければ StorageClassAnalysis の指定は{}で指定します。

事前準備

  • 分析対象のS3バケット
  • 分析対象のS3バケットの名称をメモっておいてください
  • 分析対象のS3バケットがすでに、CloudFormationのスタックと紐づいていないか確認してください
    • S3バケットのプロパティに
      aws:cloudformation:stack-id,aws:cloudformation:stack-name, aws:cloudformation:logical-id    が無ければそのバケットはスタックと紐づいていません。

AWSコンソールからインポートを実施します。

  • [次へ]を選択してください

テンプレートの指定

  • Amazon S3 URLに今回のテンプレートのURLを記載、もしくはテンプレートファイルをアップロードします
  • [次へ]を選択してください
項目
Amazon S3 URL https://pub-devio-blog-qrgebosd.s3-ap-northeast-1.amazonaws.com/template/cfn-s3-storage-analytics.yml 

リソースを識別

  • インポートするリソースを指定します
  • 準備しておいたS3バケット名を入力します
    • これで、テンプレートのS3定義と既存のリソースを紐づけます

スタックの詳細を指定

  • スタックの名前を入力します
  • EnableAnalyticsConfigurationNoを選択してください
  • Yesの場合、現在のバケットの解析設定とズレてしまい、正常に状態の紐づけが行われません。
項目
EnableAnalyticsConfiguration No 

インポートの最終確認

  • [リソースをインポート]を選択して、インポートを実施します
  • インポートが正常に行えますとスタックのステータスがIMPORT_COMPLETEになるかと思います。

更新の実施

  • 作成したスタック選択し、[更新する]を選択します

スタックの更新

  • [現在のテンプレートの使用]を選択し
  • [次へ]を選択します

スタックの詳細を指定

  • EnableAnalyticsConfigurationYesを選択してください
  • [次へ]を選択します
項目 備考
EnableAnalyticsConfiguration Yes ストレージ解析を有効にします
Prefix <入力してください> 解析対象をPrefixで絞り込む場合に指定します
TagFilterKey <入力してください> 解析対象をTagで絞り込む場合のKeyを指定します
TagFilterValue <入力してください> 解析対象をTagで絞り込む場合のValueを指定します

変更セットのプレビュー

  • アクションがModify
  • 置換がFalse
  • であることを確認し、[スタックの更新]を選択します
  • スタックが更新され、ストレージ解析が設定されます。

ストレージ解析設定の確認

  • スタックの出力にURLStorageClassAnalysisを出力しているので、URLに遷移
  • もしくは該当のS3バケットのメトリクス> ストレージクラス分析 >に遷移します
  • 設定直後はデータがなにもないですが、48時間後にデータ表示されますので、解析データを参考にライフサイクル設定等を実施します

まとめ

S3バケットの解析設定はコンソールだと、S3バケットのコンソールの深いところなので、CloudFormationでやってみました。 1つのバケットであれば、特にコンソールでやってしまって問題ないとは思いますが、複数のバケットを実施する場合につまりそうなので、便利に使いたいと思います。

参考

Amazon S3 分析 – ストレージクラス分析 https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/analytics-storage-class.html

新機能 – CloudFormation スタックへの既存リソースのインポート https://aws.amazon.com/jp/blogs/news/new-import-existing-resources-into-a-cloudformation-stack/

【新機能】S3 Analytics, Storage Class Analysisを試してみた #reinvent

テンプレート

AWSTemplateFormatVersion: "2010-09-09"

Parameters:
  EnableAnalyticsConfiguration:
    Description: Specifies the configuration and any analyses for the analytics filter of an Amazon S3 bucket.
    Type: String
    AllowedValues: ["yes", "no"]
    Default: "no"

  Prefix:
    Description: The prefix that an object must have to be included in the analytics results. If not specified, empty.
    Type: String
    Default: ""

  TagFilterKey:
    Description: The tag key to use when evaluating an analytics filter. If not specified, empty.
    Type: String
    Default: ""

  TagFilterValue:
    Description: The tag value to use when evaluating an analytics filter. If not specified, empty.
    Type: String
    Default: ""

Conditions:
  EnableAnalyticsConfiguration: !Equals [!Ref EnableAnalyticsConfiguration, "yes"]

  Prefix: !Not [!Equals [!Ref Prefix, ""]]

  TagFilterKey: !Not [!Equals [!Ref TagFilterKey, ""]]

  TagFilterValue: !Not [!Equals [!Ref TagFilterValue, ""]]

  TagFilter: !And
    - !Condition TagFilterKey
    - !Condition TagFilterValue

Resources:
  MyBucket:
    DeletionPolicy: Retain
    Type: AWS::S3::Bucket
    Properties:
      AnalyticsConfigurations: !If
        - EnableAnalyticsConfiguration # 条件
        - # 条件がTrueの場合配列の値を指定
          - Id: !Sub
              - SCA-${UniqueId} # StorageClassAnalysisIDをスタック名でユニークにつくる
              # SCA-XXXXXXXX
              - UniqueId: !Select [0, !Split ['-', !Select [2, !Split [/, !Ref 'AWS::StackId']]]]
                # 例 arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123 の51af3dc0
                # AWS::StackId -> (/で分割して最後) 51af3dc0-da77-11e4-872e-1234567db123 -> (-で分割して最初) 51af3dc0 だけもってくる
            StorageClassAnalysis: {} # 空指定は{}
            Prefix: !If [Prefix, !Ref Prefix, !Ref 'AWS::NoValue']
            TagFilters: !If
              - TagFilter
              - - Key: !Ref TagFilterKey
                  Value: !Ref TagFilterValue
              - !Ref AWS::NoValue
        - !Ref AWS::NoValue # 条件がFalseの場合はAnalyticsConfigurationsプロパティを削除

Outputs:
  URLStorageClassAnalysis:
    Value: !Sub
      - https://console.aws.amazon.com/s3/bucket/${MyBucket}/metrics/storage_class_analysis/view?region=${AWS::Region}&id=SCA-${UniqueId}
      - UniqueId: !Select [0, !Split ['-', !Select [2, !Split [/, !Ref 'AWS::StackId']]]]
    Condition: EnableAnalyticsConfiguration

今回のCloudFormation テンプレート小ネタ集

CloudFormationでスタック毎に一意な値を設定したい場合

UniqueIdはAWSが提供しているサンプルテンプレートなどでよく使われています。

- Id: !Sub
  - SCA-${UniqueId} # StorageClassAnalysisIDをスタック名でユニークにつくる
  - UniqueId: !Select [0, !Split ['-', !Select [2, !Split [/, !Ref 'AWS::StackId']]]]

CloudFormationでAnd条件を使いたい場合

まとめて、書きたくなるんですが、見通しが悪くなるので、分割しています

  TagFilterKey: !Not [!Equals [!Ref TagFilterKey, ""]]
  TagFilterValue: !Not [!Equals [!Ref TagFilterValue, ""]]
  TagFilter: !And
    - !Condition TagFilterKey
    - !Condition TagFilterValue

CloudFormationでIF条件の中にリストを書きたい場合の書き方

-ハイフンがならぶのが、どうしても慣れないですね。

TagFilters: !If
    - TagFilter
    - - Key: !Ref TagFilterKey
        Value: !Ref TagFilterValue
    - !Ref AWS::NoValue

CloudFormationでKeyだけ指定して、Valueは空にしたいとき

{} 知らないとまずわかんないです。

StorageClassAnalysis: {}