LinuxのEC2のファイルリストアをするCloudFormationテンプレート

# はじめに

以前、LinuxのEC2インスタンスのバックアップから、ファイルリストアをする方法を記事にしました。

https://qiita.com/a_b_/items/6d322c0cf43252a0bcf3

今回はそれをCFnでテンプレート化しました。

# 概要

CloudFormation実行時に、リストアしたいファイルを含むスナップショットIDを指定します。
するとリストアしたボリュームをアタッチしたEC2インスタンスが起動します。
EC2インスタンスがあるVPCやサブネット、SSHで接続可能としたセキュリティグループなどは作成済みの想定です。

# CloudFormationテンプレート

以前、Windows Server用に作ったテンプレートとほぼ同じ内容になります。

https://qiita.com/a_b_/items/45a266a477815dace9df#cloudformation%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88

Defaultの部分は、リストア用にあらかじめ作ったリソースを設定している想定です。

```yaml:create_linuxForFileRestore.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: CloudFormation template to create a Linux EC2 instance for File Restore

Parameters:
  # Restore Configuration
  SnapshotId:
    Type: String
  # EC2 Environment Configuration
  VPCID:
    Type: AWS::EC2::VPC::Id
    Default: "vpc-xxxxxxxxxx"
    Description: The VPC ID where the instance will be created
  SubnetId:
    Type: AWS::EC2::Subnet::Id
    Default: "subnet-xxxxxxxxxx"
    Description: The Subnet ID where the instance will be created
  SecurityGroups:
    Type: List<AWS::EC2::SecurityGroup::Id>
    Default: "sg-xxxxxxxxxx"
    Description: Security Groups for the instance
  AvailabilityZone:
    Type: String
    Default: "xx-xxxxx-xx"
    Description: The Availability Zone for the instance
  KeyName:
    Type: AWS::EC2::KeyPair::KeyName
    Default: "xxxxxxxxxx"
    Description: The name of the existing EC2 KeyPair to enable RDP access
  ImageId:
    Type: String
    Default: "ami-xxxxxxxxxx"
    Description: Windows Server 2022 EC2 image for File Restore

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: "Restore Configuration"
        Parameters:
          - SnapshotId
      - Label:
          default: "EC2 Environment Configuration"
        Parameters:
          - VPCID
          - SubnetId
          - SecurityGroups
          - AvailabilityZone
          - KeyName
          - ImageId

Resources:
  RestoreVolume:
    Type: AWS::EC2::Volume
    Properties: 
      AvailabilityZone: !Ref AvailabilityZone
      SnapshotId: !Ref SnapshotId
    DeletionPolicy: Delete

  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref ImageId
      InstanceType: t2.micro
      KeyName: !Ref KeyName
      AvailabilityZone: !Ref AvailabilityZone
      NetworkInterfaces: 
        - AssociatePublicIpAddress: "true"
          DeleteOnTermination: true
          DeviceIndex: "0"
          SubnetId: !Ref SubnetId
          GroupSet: !Ref SecurityGroups
      Volumes:
        - Device: "/dev/xvdba"
          VolumeId: !GetAtt RestoreVolume.VolumeId
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash
          mkdir /data
          sudo xfs_admin -U generate /dev/xvdba1
          sudo mount /dev/xvdba1 /data
    DeletionPolicy: Delete
    DependsOn: RestoreVolume
```

# 実行
CloudFormationテンプレートを指定し、パラメータにSnapshotIdを指定して実行すると、以下のようなインスタンスが起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/19f5da06-d247-537f-792e-3980cd63cab2.png)

ファイルをサルベージしたあと、CloudFormationスタックを削除すれば、EC2インスタンスもボリュームも削除されます。

# おわりに
以前Windows Serverで行っていたものを、Linuxでも作ってみました。
AWSではWindowsよりLinuxの方が使われると思いますので、こちらの方が使われるかもしれません。
この記事がどなたかのお役に立てれば幸いです。