[小ネタ]任意のタグを持つリソースをAWS Backupで取得するCloudFormationテンプレート

2020.02.28

はじめに

こんにちは。大阪オフィスの林です。

AWS Bakcupを使っていたのですが、作成に際してGUIからの操作だと少々手間だったのでCloudFormationを作りました。そんな内容を今日はまとめておきたいと思います。

今回やること

  • AWS BakcupのバックアッププランをCloudFormationで作成する。
  • 指定したタグを持つリソースをバックアップするルールを作る。※AWS Bakcupでサポートしているリソースに限る。
  • 毎日N時にバックアップするスケジュールをセットする。
  • バックアップデータの有効期限をN日後に設ける。
  • まずCFnのコードです

    AWSTemplateFormatVersion: "2010-09-09"
    Description: "Backup Plan template"
    # ------------------------------------------------------------#
    # Input Parameters
    # ------------------------------------------------------------#
    Metadata:
      AWS::CloudFormation::Interface:
        ParameterGroups:
          -
            Parameters:
              - BackupPlanName
              - BackupVaultName
              - cron
              - SelectionName
              - Lifecycle
              - TagKey
              - TagValue
    Parameters:
      BackupPlanName:
        Description: Please type the BackupPlanName.
        Type: String
        Default: BackupPlanName
      BackupVaultName:
        Description: Please type the BackupVaultName.
        Type: String
        Default: BackupVaultName
      #バックアップスケジュールをスタック作成時のパラメータとして入力できるようにします。
      cron:
        Description: Please type the cron.
        Type: String
        Default: cron(00 14 * * ? *)
      SelectionName:
        Description: Please type the SelectionName.
        Type: String
        Default: TagBasedBackup
      #バックアップデータの有効期限をスタック作成時のパラメータとして入力できるようにします。
      Lifecycle:
        Description: Please type the Lifecycle.
        Type: String
        Default: 7
      #タグのキー名をスタック作成時のパラメータとして入力できるようにします。
      TagKey:
        Description: Please type the TagKey.
        Type: String
        Default: TagKey
      #タグの値をスタック作成時のパラメータとして入力できるようにします。
      TagValue:
        Description: Please type the TagValue.
        Type: String
        Default: TagValue
    Resources:
      BackupVaultWithThinBackups:
        Type: "AWS::Backup::BackupVault"
        Properties:
          BackupVaultName: !Ref BackupVaultName
    
      BackupPlanWithThinBackups:
        Type: "AWS::Backup::BackupPlan"
        Properties:
          BackupPlan:
            BackupPlanName: !Ref BackupPlanName
            BackupPlanRule:
              -
                RuleName: "RuleForDailyBackups"
                TargetBackupVault: !Ref BackupVaultWithThinBackups
                #今回はCronでスケジュールを指定しています。時間はUTCで指定します。上記パラメータで指定された値を挿入します。
                ScheduleExpression: !Ref cron 
                Lifecycle:
                  DeleteAfterDays: 7
                CompletionWindowMinutes: 120
                StartWindowMinutes: 60
        DependsOn: BackupVaultWithThinBackups
    
      TagBasedBackupSelection:
        Type: "AWS::Backup::BackupSelection"
        Properties:
          BackupSelection:
            SelectionName: !Ref SelectionName
            IamRoleArn: !Sub "arn:aws:iam::${AWS::AccountId}:role/service-role/AWSBackupDefaultServiceRole"
            ListOfTags:
             -
               ConditionType: "STRINGEQUALS"
                #上記パラメータで指定されたタグキーを挿入します。
               ConditionKey: !Ref TagKey
                #上記パラメータで指定されたタグの値を挿入します。
               ConditionValue: !Ref TagValue
          BackupPlanId: !Ref BackupPlanWithThinBackups
        DependsOn: BackupPlanWithThinBackups
    

    やってみた

    スタックを作ると幾つかパラメータを指定することが可能です。

    Nameと付く部分は任意の名前を付けて頂ければいいのですが、下記は環境に応じた値を指定してください。

  • cron
    UTC時間でスケジュールを設定します。例えば日本時間(JST)で0時にバックアップを実行したければcron(00 15 * * ? *)とします。23時にバックアップ実行したければcron(00 14 * * ? *)とします。

  • Lifecycle
    バックアップデータの有効期限(保持期間)を指定します。

  • TagKey
    バックアップ対象とするリソースに付けるタグのキー名を入力します。

  • TagValue
    バックアップ対象とするリソースに付けたタグの値を入力します。

    今回設定した内容だと、毎日23時BackupというタグでOnという値を持つリソースをバックアップするというプランが作成されます。また取得したバックアップデータの有効期限は7日に設定されます。

    まとめ

    手動でポチポチと設定していくとどんな設定があるのか視覚的に全体的にわかるのがメリットと思ってるのですが慣れてこれば手作業は手間ですよね。これに限らず様々な作業をどんどん効率的にしていきましょう!

    以上、大阪オフィスの林がお送りしました!

    参考

    AWS::Backup::BackupPlan
    AWS::Backup::BackupSelection