【小ネタ】AWS BackupでIAMロールのパスにハマった話

【小ネタ】AWS BackupでIAMロールのパスにハマった話

Clock Icon2025.05.01

はじめに

皆様こんにちは、あかいけです。

最近CloudFormationでAWS Backupのバックアップルールを作成するとき、IAMロールのパスで困ったことがありました。
遭遇するケースはレアだと思いますが、同じ事象に陥った方への手助けになれば幸いです。

IAMロール のパスって何?

そもそもIAMロールのパスとは何でしょうか?
実は私も今まで意識したことがなかったのですが、IAMロールにはパスという概念があります。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_manage.html

これは必須の設定ではなく、デフォルトではルート(/)がパスとして設定され、
以下のようにARNの一部として含まれます。

  • arn:aws:iam::<account-id>:role/<path>/<iam-role-name>

パスはAWS CLIやIaCなどでIAMロールを作成する場合は指定できますが、
マネジメントコンソールからは指定できないため、あまり存在感がないかもしれません。

https://dev.classmethod.jp/articles/aws-iam-with-path/

またAWSが管理するIAMロールには以下のようなパスが付与されています。

  • /aws-service-role/ - AWS サービスが管理するサービスリンクロール用
  • /service-role/ - AWS サービスが使用するサービスロール用
  • /aws-reserved/sso.amazonaws.com/ - AWS SSO (Single Sign-On) 関連のロール用

https://dev.classmethod.jp/articles/iam-how-to-identify-service-linked-roles/

ハマった内容

まず以下の内容でAWS Backupで利用するIAMロール、
およびVaultとバックアッププランを作成しました。

iam.yaml
Resources:
  IamRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: "AWSBackupDefaultServiceRole"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: backup.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup
        - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores
backup.yaml
Resources:
  BackupVault:
    Type: AWS::Backup::BackupVault
    Properties:
      BackupVaultName: "backup-vault"

  BackupPlan:
    Type: AWS::Backup::BackupPlan
    Properties:
      BackupPlan:
        BackupPlanName: "backup-plan"
        BackupPlanRule: "backup-rule-daily"
            TargetBackupVault: !Ref BackupVault
            ScheduleExpression: "cron(0 15 * * ? *)"
            StartWindowMinutes: 60
            CompletionWindowMinutes: 120
            Lifecycle:
              DeleteAfterDays: 7

  BackupSelection:
    Type: AWS::Backup::BackupSelection
    Properties:
      BackupPlanId: !Ref BackupPlan
      BackupSelection:
        SelectionName: "backup-selection"
        IamRoleArn: !Sub "arn:aws:iam::${AWS::AccountId}:role/service-role/AWSBackupDefaultServiceRole"
        Resources:
          - !Sub "arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:instance/*"
        ListOfTags:
          - ConditionType: STRINGEQUALS
            ConditionKey: aws-backup
            ConditionValue: enable

なおこのIAMロールについて、マネジメントコンソールからバックアッププランを作成すると、
自動的にサービスロール(AWSBackupDefaultServiceRole)が作成されます。
しかしCloudFormationでバックアッププランを作成すると自動作成されないので、IAMロールを明示的に作成しています。

そしてこの状態でバックアップをすると権限不足のエラーが出ます。

エラーメッセージ
アクセスが拒否されました
Your backup job failed as AWS Backup does not have permission to describe resource arn:aws:ec2:ap-northeast-1:<account-id>:instance/<instance-id>.
Please review your IAM policies to ensure AWS Backup can protect your resources.

ただしバックアッププランにIAMロールは割り当てられており、
バックアップジョブの詳細の「デフォルトのロール」をクリックすると作成したIAMロールに飛びます。

スクリーンショット 2025-05-01 14.22.21

またIAMロールにはAWS Backup用のAWS管理ポリシーを割り当てているので、権限も足りているはずです。
IAMロールも存在して権限もあるのに、なぜエラーが起こるのでしょうか…。

スクリーンショット 2025-05-01 14.22.38

原因と解消方法

結論として、
バックアッププランで指定したIAMロールが存在しないため、エラーになっていました。
具体的には作成したIAMロールとバックアッププランで指定したものが異なっていました。

  • バックアップ選択で指定したIAMロールARN

    • arn:aws:iam::<account-id>:role/service-role/AWSBackupDefaultServiceRole
  • 作成したIAMロールARN

    • arn:aws:iam::<account-id>:role/AWSBackupDefaultServiceRole

そのため以下のようにIAMロール作成時に明示的にパスを指定して作成し、
バックアッププランで指定するIAMロールに合わせることでエラーは解消します。

Resources:
  IamRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: "AWSBackupDefaultServiceRole"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: backup.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup
        - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores
      Path: "/service-role/"

なお、指定したIAMロールではないにもかかわらず、
バックアッププランの「デフォルトのロール」からIAMロールへのリンクが機能したのは不思議ですが、
おそらくこの部分はARNではなくIAMロール名で判断しているためと推測されます。
(これは推測ですので、参考程度にお考えください)

さいごに

以上、
AWS BackupのバックアッププランのIAMロールのパスでハマった話でした。

遭遇するのはかなりレアかと思いますが、ハマった私は二時間ぐらい苦しんだのでお気をつけください。
皆さんが同じエラーに遭遇しないことを願っています…。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.