0
0

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

Posted at

はじめに

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を指定するようにしました。

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

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

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

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を使う際にご参考ください。
この記事がどなたかのお役に立てれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0