Cloudformationで作ったAWS Backup設定が作動せずエラーログも出なかったので調べた話

2020.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どーもsutoです。

以前投稿したブログでAWS Backup設定をCloudformation(CFn)で作ったのですが、これを利用してとある新規AWSアカウントで使用した結果、バックアップが動作しなかったためトラシューした内容を残しておきます。

結論としては”リソースの割り当てに付与するIAMロールが存在してなかった”という正直初歩的なことだったのですが、エラーログに現れない事象だったのでブログに書いておこうと思いました。

事象

CFnスタックでは”CREATE_COMPLETE”且つAWS Backupの各リソースも問題なく正常に作成されたのですが、なぜかバックアップジョブが動いていませんでした。

作成したテンプレートは自分のAWSアカウントで検証して正常に動いていたのですが、AWSアカウントを新規作成されたお客様の環境でバックアップジョブが開始されずCloudTrailにもログがまったく吐き出されていませんでした。

ジョブ関連のエラーがない上そもそもジョブの開始すらないのならば

  • リソースの割り当て設定で対象リソースの該当がない(タグ付の値が間違っている)
  • バックアッププランの設定内容に誤りがある(時刻設定など)
  • リソースの割り当て設定にてアタッチしたIAMロールに何かしら問題がある

となる。上2つは自分のアカウントでは正常動作する理由が説明できないので、IAMロールに当たりをつけて一覧を覗いて見ると

あ〜存在しないRoleアタッチしていたらそりゃ動作しませんよね。それにしてもこのような場合CloudTrail側に権限に関するエラーが出たりするのかなと思っていましたが何もログは出ないんですね。またCFnのスタック実行時のイベントでもエラーでロールバックされないという。

自分のAWSアカウントでは検証などでいろいろやっていたので気づかなかったです。またAWS Backupのコンソール画面で手動作成した場合は出会うことのない事象ですね。(リソースの割り当てを設定する際にデフォルトIAMロールを自動で作ってくれますから)

解決策

あまりロールを作られていないまっさらなAWS環境で利用することも多いので、以下にIAMロールもまとめて新規作成するテンプレートに修正しました。

AWSTemplateFormatVersion: '2010-09-09'
Description: AWS Backup Setting
Parameters:
  MyBackupName:
    Description: Backup plan name
    Type: String
    Default: ''
  Cron:
    Description: type the cron.
    Type: String
    Default: cron(0 19 * * ? *)
  TagKey:
    Description: TagKey for backup
    Type: String
    Default: ''
  TagValue:
    Description: TagValue for backup
    Type: String
    Default: ''
Resources:
  BackupVault:
    Type: "AWS::Backup::BackupVault"
    Properties:
      BackupVaultName: !Sub ${MyBackupName}-vault
  BackupPlan:
    Type: AWS::Backup::BackupPlan
    Properties: 
      BackupPlan: 
        BackupPlanName: !Ref MyBackupName
        BackupPlanRule: 
          - RuleName: !Sub ${MyBackupName}-rule
            TargetBackupVault: !Ref BackupVault
            ScheduleExpression: !Ref Cron
            CompletionWindowMinutes: 720
            StartWindowMinutes: 60
            Lifecycle:
              DeleteAfterDays: 14
  BackupSelection:
    Type: AWS::Backup::BackupSelection
    Properties:
      BackupPlanId: !Ref BackupPlan
      BackupSelection:
        SelectionName: !Ref MyBackupName
        IamRoleArn: !GetAtt BackupIAMrole.Arn
        ListOfTags:
         - ConditionType: "STRINGEQUALS"
           ConditionKey: !Ref TagKey
           ConditionValue: !Ref TagValue
  BackupIAMrole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: AWSBackupDefaultServiceRole
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
        - Effect: Allow
          Action: sts:AssumeRole
          Principal:
            Service: backup.amazonaws.com
      ManagedPolicyArns:
      - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup
      - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores
      Path: "/service-role/"

まとめ

自作のAWS Backup設定を自動構築するCFnテンプレートのトラシューでした。存在しないIAMロールを指定してもスタック作成時にエラーは出ず、構築後のジョブが動かないにもかかわらずCloudTrailにもログが記録されなかったので小一時間ほど悩みました。

1つ1つ、作成リソースと関連リソースを調べて行った結果発見できたのでとりあえず謎のまま放置せずに済んで安心しました。今思えば正直くだらないミスですが、気付きにくそうなものだなと感じたためここに残しておこうと思います。