はじめに
AWS BackupのオンデマンドバックアップをStep Functionsから実行しようとした際に、権限回りで苦労しましたので、備忘録的に記事にします。
概要
AWS BackupをStep Functionsから実行する際、以下の権限を宛がう必要があります。
- AWS Backup用権限
- バックアップを実行できる権限
- Step Functions用権限
- 上記のロールを別サービスに渡せる権限
- 保存先のBackupVaultに対して、StartBackupJobが実行できる権限
上記を含む、Step Functionsでオンデマンドバックアップを実行するCloudFormationのコードを記載します。
参考
CloudFormationのコード
もっともシンプルな構成として、以下を作成します。
- BackupVault
- バックアップ用Role
- Step Functions用Role
- オンデマンドバックアップを実行するStateMachine
CloudFormationコードは以下になります。実行時のパラメータに対象のEC2のARNを指定するようにしました。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
Ec2Arn:
Type: String
Default: tokyo-endpoint
Resources:
MyBackupVault:
Type: AWS::Backup::BackupVault
Properties:
BackupVaultName: 'for-stepfunctions'
MyBackupRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- backup.amazonaws.com
Action:
- 'sts:AssumeRole'
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup
# - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores
SMRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- states.amazonaws.com
Action:
- 'sts:AssumeRole'
Path: /
Policies:
# - PolicyName: allowSsm
# PolicyDocument:
# Version: "2012-10-17"
# Statement:
# - Effect: Allow
# Action:
# - ssm:SendCommand
# Resource: '*'
- PolicyName: allowBackupJob
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- backup:StartBackupJob
Resource:
# - !Sub arn:aws:backup:${AWS::Region}:${AWS::AccountId}:backup-vault:*
- !GetAtt MyBackupVault.BackupVaultArn
- Effect: Allow
Action:
- iam:PassRole
Resource:
- !GetAtt MyBackupRole.Arn
executeEc2BackupStateMachine:
Type: AWS::StepFunctions::StateMachine
Properties:
RoleArn: !GetAtt SMRole.Arn
Definition:
StartAt: StartBackupJob
States:
StartBackupJob:
Type: Task
Resource: arn:aws:states:::aws-sdk:backup:startBackupJob
Parameters:
BackupVaultName: !Ref MyBackupVault
IamRoleArn: !GetAtt MyBackupRole.Arn
ResourceArn: !Ref Ec2Arn
End: true
余分なコメント等ありますので、各リソースを若干説明します。
バックアップ用Role
MyBackupRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- backup.amazonaws.com
Action:
- 'sts:AssumeRole'
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup
# - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores
- 各サービスに対してバックアップするサービスロール:
AWSBackupServiceRolePolicyForBackup
を宛がいます- リストアにも使う際は
AWSBackupServiceRolePolicyForRestores
を宛がいます。(ここではコメントアウトしてます)- 一度でもAWS Backupを実行した方は、
AWSBackupDefaultServiceRole
という、バックアップ・リストア両方とも宛がわれたロールが自動作成されているようです
- 一度でもAWS Backupを実行した方は、
- リストアにも使う際は
Step Functions用Role
SMRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- states.amazonaws.com
Action:
- 'sts:AssumeRole'
Path: /
Policies:
# - PolicyName: allowSsm
# PolicyDocument:
# Version: "2012-10-17"
# Statement:
# - Effect: Allow
# Action:
# - ssm:SendCommand
# Resource: '*'
- PolicyName: allowBackupJob
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- backup:StartBackupJob
Resource:
# - !Sub arn:aws:backup:${AWS::Region}:${AWS::AccountId}:backup-vault:*
- !GetAtt MyBackupVault.BackupVaultArn
- Effect: Allow
Action:
- iam:PassRole
Resource:
- !GetAtt MyBackupRole.Arn
-
allowBackupJob
にて以下を宛がっています- 先に作成したバックアップ用Roleを宛がう権限
- コードの最初に作成している、BackupVaultへのStartBackupJobの権限
- 任意のBackupVaultに対しても用いる場合は、コメントアウトされている方を使います
- コメントアウトされている
allowSsm
は、Systems ManagerのSendCommandを許可するものです- 「バックアップの前後にサービスを停止/起動するスクリプトを実行」することを想定しています
Step FunctionsからSendCommandを実行する際は、以前の記事を参考にしてください。
State
Step Functionsに単一で定義している、オンデマンドバックアップを実行するStateは以下です。
States:
StartBackupJob:
Type: Task
Resource: arn:aws:states:::aws-sdk:backup:startBackupJob
Parameters:
BackupVaultName: !Ref MyBackupVault
IamRoleArn: !GetAtt MyBackupRole.Arn
ResourceArn: !Ref Ec2Arn
End: true
backup:startBackupJobのパラメータは以下になります。
おわりに
今回はAWS Backupに関する権限を、Step Functionsから利用する場合を例として記事にしました。
AWS Backupのスケジュール機能でバックアップされている場合もあるかと思います。前後に何か処理をしたい場合等でStep Functionsを使う際にご参考ください。
この記事がどなたかのお役に立てれば幸いです。