AWS BackupをStep Functionsで実行する際の権限

# はじめに
AWS BackupのオンデマンドバックアップをStep Functionsから実行しようとした際に、権限回りで苦労しましたので、備忘録的に記事にします。


# 概要
AWS BackupをStep Functionsから実行する際、以下の権限を宛がう必要があります。

- AWS Backup用権限
    - バックアップを実行できる権限
- Step Functions用権限
    - 上記のロールを別サービスに渡せる権限
    - 保存先のBackupVaultに対して、StartBackupJobが実行できる権限

上記を含む、Step Functionsでオンデマンドバックアップを実行するCloudFormationのコードを記載します。




# 参考

https://docs.aws.amazon.com/aws-backup/latest/devguide/integrate-cloudformation-with-aws-backup.html



# CloudFormationのコード

もっともシンプルな構成として、以下を作成します。

- BackupVault
- バックアップ用Role
- Step Functions用Role
- オンデマンドバックアップを実行するStateMachine

CloudFormationコードは以下になります。実行時のパラメータに対象のEC2のARNを指定するようにしました。

```yaml:create_backup-statemachine.yaml
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
```
以下のようなStateMachineが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/24885b05-0b99-012c-a225-4f7c9828bcf6.png)

余分なコメント等ありますので、各リソースを若干説明します。

## バックアップ用Role

```yaml
  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`という、バックアップ・リストア両方とも宛がわれたロールが自動作成されているようです

https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/iam-service-roles.html#default-service-roles

## Step Functions用Role

```yaml
  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を実行する際は、以前の記事を参考にしてください。

https://qiita.com/a_b_/items/9a6e7fbd203577f08be7


## State
Step Functionsに単一で定義している、オンデマンドバックアップを実行するStateは以下です。
```yaml
        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のパラメータは以下になります。

https://docs.aws.amazon.com/aws-backup/latest/devguide/API_StartBackupJob.html

# おわりに

今回はAWS Backupに関する権限を、Step Functionsから利用する場合を例として記事にしました。
AWS Backupのスケジュール機能でバックアップされている場合もあるかと思います。前後に何か処理をしたい場合等でStep Functionsを使う際にご参考ください。
この記事がどなたかのお役に立てれば幸いです。