【小ネタ】AWS BackupでIAMロールのパスにハマった話
はじめに
皆様こんにちは、あかいけです。
最近CloudFormationでAWS Backupのバックアップルールを作成するとき、IAMロールのパスで困ったことがありました。
遭遇するケースはレアだと思いますが、同じ事象に陥った方への手助けになれば幸いです。
IAMロール のパスって何?
そもそもIAMロールのパスとは何でしょうか?
実は私も今まで意識したことがなかったのですが、IAMロールにはパスという概念があります。
これは必須の設定ではなく、デフォルトではルート(/)がパスとして設定され、
以下のようにARNの一部として含まれます。
arn:aws:iam::<account-id>:role/<path>/<iam-role-name>
パスはAWS CLIやIaCなどでIAMロールを作成する場合は指定できますが、
マネジメントコンソールからは指定できないため、あまり存在感がないかもしれません。
またAWSが管理するIAMロールには以下のようなパスが付与されています。
/aws-service-role/
- AWS サービスが管理するサービスリンクロール用/service-role/
- AWS サービスが使用するサービスロール用/aws-reserved/sso.amazonaws.com/
- AWS SSO (Single Sign-On) 関連のロール用
ハマった内容
まず以下の内容でAWS Backupで利用するIAMロール、
およびVaultとバックアッププランを作成しました。
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
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ロールに飛びます。
またIAMロールにはAWS Backup用のAWS管理ポリシーを割り当てているので、権限も足りているはずです。
IAMロールも存在して権限もあるのに、なぜエラーが起こるのでしょうか…。
原因と解消方法
結論として、
バックアッププランで指定したIAMロールが存在しないため、エラーになっていました。
具体的には作成したIAMロールとバックアッププランで指定したものが異なっていました。
-
バックアップ選択で指定したIAMロールARN
- arn:aws:iam::<account-id>:role/
service-role
/AWSBackupDefaultServiceRole
- arn:aws:iam::<account-id>:role/
-
作成した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ロールのパスでハマった話でした。
遭遇するのはかなりレアかと思いますが、ハマった私は二時間ぐらい苦しんだのでお気をつけください。
皆さんが同じエラーに遭遇しないことを願っています…。