AWS Backup構築ハンズオン

## はじめに
AWS Backup を利用したIAMのバックアップや Amazon EBS（Amazon Data Lifecycle Manager）によるスナップショットの取得などが不慣れのため、まずは AWS Backupを構築してみて リソースのサワリを体験したいと思います。

------------

## 構成図
![](https://cloud5.jp/wp-content/uploads/2023/02/スクリーンショット-2023-02-05-21.00.44.png)

------------

## ハンズオン
### 構築のながれ
#### 1.AWS Backup作成

-----------


### 1.AWS Backup作成
#### 1.1.CFnによる構築リソース一覧

|構築リソース名|ざっくり概要|
|:-:|:-:|
|BackupValut|バックアップを保存および整理するためのコンテナ|
|BackupPlan|AWS リソースをいつどのようにバックアップするかを定義|
|BackSelection| 対象となる選択の範囲|
|IAM Role|アクセス許可|

参考：　[AWS Backup とは?](https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/whatisbackup.html)

#### 1.2.テンプレート留意点
##### 1.2.1.BackupPlan部分
・Cron式でバックアップを取得する時間はUTCとなるため、日本時間にする場合は修正ください
・非同期での実行のため、Cronで設定した時間調度に起動はしません
・バックアップのライフサイクルとして、作成後2日で削除されるように設定

##### 1.2.2.BackupSelection部分
・タグ名（`TagKey`,`TagValue`）が付帯している、リソースのバックアップを取得する

#### 1.3.CFnテンプレート

```yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: Create AWS Backup
# ------------------------------------------------------------#
#  Metadata
# ------------------------------------------------------------#
Metadata:
  "AWS::CloudFormation::Interface":
    ParameterGroups:
      - Label:
          default: "AWS Backup Configuration"
        Parameters:
        - MyBackupName
        - Cron
        - TagKey
        - TagValue

# ------------------------------------------------------------#
#  InputParameters
# ------------------------------------------------------------#
Parameters:
  MyBackupName:
    Description: Backup plan name
    Type: String
    Default: EC2-Backupplan
  Cron:
    Description: type the cron.
    Type: String
    Default: cron(* 0 * * ? *)
  TagKey:
    Description: TagKey for backup
    Type: String
    Default: Backup
  TagValue:
    Description: TagValue for backup
    Type: String
    Default: True
# ------------------------------------------------------------#
#  Resources
# ------------------------------------------------------------#
Resources:
# ------------------------------------------------------------#
#  BackupVault
# ------------------------------------------------------------#
  BackupVault:
    Type: "AWS::Backup::BackupVault"
    Properties:
      BackupVaultName: !Sub ${MyBackupName}-vault
# ------------------------------------------------------------#
#  BackupPlane
# ------------------------------------------------------------#
  BackupPlan:
    Type: AWS::Backup::BackupPlan
    Properties: 
      BackupPlan: 
        BackupPlanName: !Ref MyBackupName
        AdvancedBackupSettings:
          -
            ResourceType: EC2
            BackupOptions:
              WindowsVSS: enabled
        BackupPlanRule: 
          - RuleName: !Sub ${MyBackupName}-rule
            TargetBackupVault: !Ref BackupVault
            ScheduleExpression: !Ref Cron
            CompletionWindowMinutes: 720
            StartWindowMinutes: 60
            Lifecycle:
              DeleteAfterDays: 2
# ------------------------------------------------------------#
#  BackupSelection
# ------------------------------------------------------------#
  BackupSelection:
    Type: AWS::Backup::BackupSelection
    Properties:
      BackupPlanId: !Ref BackupPlan
      BackupSelection:
        SelectionName: !Ref MyBackupName
        IamRoleArn: !GetAtt BackupIAMrole.Arn
        ListOfTags:
          - ConditionType: "STRINGEQUALS"
            ConditionKey: !Ref TagKey
            ConditionValue: !Ref TagValue
# ------------------------------------------------------------#
#  IAM Role 
# ------------------------------------------------------------#
  BackupIAMrole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${MyBackupName}-Role
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
        - Effect: Allow
          Action: sts:AssumeRole
          Principal:
            Service: backup.amazonaws.com
      ManagedPolicyArns:
      - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup
      - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores
      Path: "/service-role/"
```

<br />

### 挙動の確認
#### 1.バックアップ取得用EC2を作成（VPC＋サブネット＋EC2）
```yaml
 AWSTemplateFormatVersion: "2010-09-09"
Description:
  Create NetWork EC2 SSM
# ------------------------------------------------------------#
#  Metadata
# ------------------------------------------------------------#
Metadata:
  "AWS::CloudFormation::Interface":
    ParameterGroups:
      - Label:
          default: "VPC Configuration"
        Parameters:
          - Name
          - VPCCIDR
          - PrivateSubnetCIDR
      - Label:
          default: "EC2 Configuration"
        Parameters:
          - AMIId
          - InstanceType
          - KeyPair
      - Label:
          default: "Tags"
        Parameters:
          - UserName
# ------------------------------------------------------------#
#  InputParameters
# ------------------------------------------------------------#
Parameters:
  Name:
    Type: String
    Default: 【リソースプレフィックス】

  VPCCIDR:
    Type: String
    Default: 192.168.0.0/16

  PrivateSubnetCIDR:
    Type: String
    Default: 192.168.0.0/24

  AMIId:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-windows-latest/Windows_Server-2016-Japanese-Full-Base

  InstanceType:
    Type: String
    Default: t2.micro

  KeyPair:
    Type: String
    Default: 【キーペア】
  
  UserName:
    Type: String
    Default: 【ユーザタグ】

# ------------------------------------------------------------#
#  Resources
# ------------------------------------------------------------#
Resources:
# ------------------------------------------------------------#
#  VPC
# ------------------------------------------------------------#
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCIDR
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Sub ${Name}-VPC
        - Key: User
          Value: !Ref UserName
# ------------------------------------------------------------#
#  Subnet
# ------------------------------------------------------------#
  PrivateSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Select [0, !GetAZs ""]
      CidrBlock: !Ref PrivateSubnetCIDR
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub ${Name}-PrivateSubnet
        - Key: User
          Value: !Ref UserName
# ------------------------------------------------------------#
#  RouteTable
# ------------------------------------------------------------#
  PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub ${Name}-PrivateRouteTable
        - Key: User
          Value: !Ref UserName

  PrivateSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet
      RouteTableId: !Ref PrivateRouteTable
# ------------------------------------------------------------#
#  EC2
# ------------------------------------------------------------#
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref InstanceType
      SubnetId: !Ref PrivateSubnet
      ImageId: !Ref AMIId
      SecurityGroupIds:
        - !Ref EC2SecurityGroup
      IamInstanceProfile: !Ref EC2InstanceProfile
      KeyName: !Ref KeyPair
      Tags:
        - Key: Name
          Value: !Sub ${Name}-EC2Instance
        - Key: User
          Value: !Ref UserName
        - Key: Backup
          Value: true
# ------------------------------------------------------------#
#  EC2 Role
# ------------------------------------------------------------#
  EC2IAMRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${Name}-SSM-role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles:
        - Ref: EC2IAMRole
      InstanceProfileName: !Sub ${Name}-EC2InstanceProfile
# ------------------------------------------------------------#
#  EC2 SG
# ------------------------------------------------------------#
  EC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: EC2SecurityGroup
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub ${Name}-EC2SecurityGroup
        - Key: User
          Value: !Ref UserName
```
<br />
【EC2のタグを確認】
タグを確認すると`Backup`,`true`が含まれていることを確認できる

![](https://cloud5.jp/wp-content/uploads/2023/02/スクリーンショット-2023-02-05-21.17.37-640x295.png)

<br />

#### 2.AWS Backのテンプレート更新
UTCを考えて`Cron`を修正、画面だと日本時刻`21:15`から1時間以内にバックアップの取得を行うと指定しなおして更新をかける
![](https://cloud5.jp/wp-content/uploads/2023/02/スクリーンショット-2023-02-05-21.10.32.png)
<br />
#### 3.AWS Backup に EC2のAMIが取得されていることを確認
`AWS Backup` > 左ペイン `バックアップボールト` > 構築したバックアップボールドの名前をクリックする
【復旧ポイント（バックアップ)取得前】
![](https://cloud5.jp/wp-content/uploads/2023/02/スクリーンショット-2023-02-05-21.14.46-1-640x216.png)

<br />
【復旧ポイント（バックアップ)取得後】

無事に取得できると、赤枠部分に取得した一覧が表示されます

![](https://cloud5.jp/wp-content/uploads/2023/02/スクリーンショット-2023-02-05-21.44.05-640x174.png)

<br />

※`AWS Backup`リソースを削除する際は、`取得した復旧ポイント（バックアップ）`を削除しないと、削除することができないので注意ください。


------------


## さいごに
運用があってこそ取得するべきものが決まってくると思うので、本当お触り程度の構築となってしまいましたが、今まで構築したものを組み合わせ個人的に運用をしていけば、今より深く利用方法を学んでいけるのかなと思います。