【AWS Backup】AWS CloudShell から CLIを使って EC2インスタンスのリストアを行う

脱・マネコンスクショ
2021.01.17

はじめに

AWS CloudShell は マネジメントコンソール(マネコン)から AWS CLIなど実行できるサービスです。 AWS re:Invent 2020 で発表されました。

ローカル環境に実行環境構築する必要なく、 ブラウザから AWS CLIや他スクリプトを試行できることが大きなメリットです。 個人的にはマネコンベースの手順書(いわゆるスクショドキュメント)が CloudShellに置き換わらないかなと、期待している部分があります。

そんな期待を込めながら、今回は CloudShell(AWS CLI)メインで EC2インスタンスのリストアを行ってみます。

前提

リージョンは東京(ap-northeast-1)、 バックアップ/リストア対象のEC2インスタンスは AWS Backup で日次バックアップを取得している環境を想定しています。

また、実施時の AWS CLI version情報は以下の通り。

aws --version
# aws-cli/2.0.58 Python/3.7.3 Linux/4.14.209-160.335.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2

※AWS Backup の仕組みについての解説は省きます。詳細は以下ブログがとても分かりやすいので参照ください。

手順

全体の流れは以下のとおりです。

  1. AWS CloudShell の起動
  2. バックアップ/リストア対象インスタンスの選択
  3. リカバリポイントの選択
  4. リストアジョブの実行
  5. 確認

1. AWS CloudShell の起動

まずはマネコンにログインします。

上部 にある CloudShellアイコンをクリック、もしくは 「CloudShell へのアクセスリンク」を開きます。

img

CloudShell コンソールへ入れること、 aws --versionaws sts get-caller-identity などで AWS CLIが実施できること確認できればOKです。

img

2. バックアップ/リストア対象インスタンスの選択

ここでは バックアップ/リストア対象のEC2インスタンスのIDを取得します。 後続の処理のために TARGET_ID に格納します。

まずは インスタンスID, Nameタグ 一覧の情報を確認します。

aws ec2 describe-instances --output table \
--query 'Reservations[*].Instances[].{ID: InstanceId, Name: Tags[?Key==`Name`]|[0].Value, State: State.Name}'
#### 出力サンプル
# ------------------------------------------------------
# |                  DescribeInstances                 |
# +----------------------+------------------+----------+
# |          ID          |      Name        |  State   |
# +----------------------+------------------+----------+
# |  i-09xxxxxxxxxxxxxxx |  xxx-instance    |  running |
# |  i-01xxxxxxxxxxxxxxx |  yyy-instance    |  stopped |
# |  i-0dxxxxxxxxxxxxxxx |  zzz-instance    |  stopped |
# +----------------------+------------------+----------+

バックアップ/リストア対象のEC2インスタンスが判れば、そのIDを変数に格納しましょう。

TARGET_ID=i-01xxxxxxxxxxxxxxx

3. リカバリポイントの選択

ここでは AWS Backup の バックアップジョブ情報を取得して、 リカバリポイント(どのAMIでリストアするか)を RECOVERY_POINT に格納します。

まずは バックアップジョブ情報を TARGET_ID のインスタンスに絞って出力します。

ACCOUNT_ID=`aws sts get-caller-identity --query Account --output text`
TARGET_ARN="arn:aws:ec2:ap-northeast-1:$ACCOUNT_ID:instance/$TARGET_ID"
echo "Listing RecoveryPointArn filterd by instance:${TARGET_ID} ...";\
aws backup list-backup-jobs --output table \
--query "BackupJobs[?ResourceArn=='${TARGET_ARN}'].{CompletionDate:CompletionDate, RecoveryPointArn:RecoveryPointArn, State:State}"
#### 出力サンプル
# Listing RecoveryPointArn filterd by instance:i-01xxxxxxxxxxxxxxx ...
# --------------------------------------------------------------------------------------------------------------
# |                                               ListBackupJobs                                               |
# +-----------------------------------+-----------------------------------------------------------+------------+
# |          CompletionDate           |                     RecoveryPointArn                      |   State    |
# +-----------------------------------+-----------------------------------------------------------+------------+
# |  2021-01-16T10:28:03.368000+00:00 |  arn:aws:ec2:ap-northeast-1::image/ami-0fxxxxxxxxxxxxxxx  |  COMPLETED |
# |  2021-01-15T11:52:14.449000+00:00 |  arn:aws:ec2:ap-northeast-1::image/ami-0axxxxxxxxxxxxxxx  |  COMPLETED |
# |  2021-01-14T08:51:19.970000+00:00 |  arn:aws:ec2:ap-northeast-1::image/ami-09xxxxxxxxxxxxxxx  |  COMPLETED |
# |  2021-01-13T09:23:27.157000+00:00 |  arn:aws:ec2:ap-northeast-1::image/ami-07xxxxxxxxxxxxxxx  |  COMPLETED |
# |  2021-01-12T09:20:39.076000+00:00 |  arn:aws:ec2:ap-northeast-1::image/ami-0axxxxxxxxxxxxxxx  |  COMPLETED |
# |  2021-01-11T11:01:24.057000+00:00 |  arn:aws:ec2:ap-northeast-1::image/ami-0exxxxxxxxxxxxxxx  |  COMPLETED |
# |  2021-01-10T11:33:46.677000+00:00 |  arn:aws:ec2:ap-northeast-1::image/ami-04xxxxxxxxxxxxxxx  |  COMPLETED |
# |  2021-01-09T09:13:29.506000+00:00 |  arn:aws:ec2:ap-northeast-1::image/ami-01xxxxxxxxxxxxxxx  |  COMPLETED |
# +-----------------------------------+-----------------------------------------------------------+------------+

リカバリポイントを選択して、変数に格納します。

RECOVERY_POINT=arn:aws:ec2:ap-northeast-1::image/ami-0fxxxxxxxxxxxxxxx

4. リストアジョブの実行

ここではリストアを実行します。 リストアに必要なパラメータを準備した上で、 aws backup start-restore-job でリストアを実行します。

▼ リストアのパラメータ取得

# バックアップボールト
VAULT=`aws backup list-backup-jobs --output text --query "BackupJobs[?RecoveryPointArn=='${RECOVERY_POINT}'].BackupVaultName"`

# IAMロール
IAM_ROLE=`aws backup list-backup-jobs --output text --query "BackupJobs[?RecoveryPointArn=='${RECOVERY_POINT}'].IamRoleArn"`

### 以下 リストアの際のEC2インスタンス 各種メタデータ
# VPC
VPC=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \
--query RestoreMetadata.VpcId`

# サブネット
SUBNET=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \
--query RestoreMetadata.SubnetId`

# インスタンスタイプ
INSTANCE_TYPE=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \
--query RestoreMetadata.InstanceType`

# セキュリティグループ
SG_IDS=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \
--query RestoreMetadata.SecurityGroupIds | sed -e 's/\"/\\\"/g'`

# IAMインスタンスプロファイル
INSTANCE_PROFILE=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \
--query RestoreMetadata.IamInstanceProfileName`

# EBS最適化
EBS_OPTIMIZED=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \
--query RestoreMetadata.EbsOptimized`

# 終了保護
SHUTDOWN_BEHAVIOR=`aws backup get-recovery-point-restore-metadata --output text --backup-vault-name $VAULT --recovery-point-arn $RECOVERY_POINT \
--query RestoreMetadata.InstanceInitiatedShutdownBehavior`

※今回は VPC, サブネット, インスタンスタイプ, セキュリティグループ, IAMインスタンスプロファイル, EBS最適化, 終了保護 の情報を引き継いでリストアさせます。 他に指定したい設定がある場合は aws backup get-recovery-point-restore-metadata でメタデータ情報を確認してください。

▼ リストアジョブの実行

aws backup start-restore-job --recovery-point-arn $RECOVERY_POINT --iam-role-arn $IAM_ROLE \
--metadata \
VpcId=$VPC,\
SubnetId=$SUBNET,\
InstanceType=$INSTANCE_TYPE,\
SecurityGroupIds="\"${SG_IDS}\"",\
IamInstanceProfileName=$INSTANCE_PROFILE,\
EbsOptimized=$EBS_OPTIMIZED,\
InstanceInitiatedShutdownBehavior=$SHUTDOWN_BEHAVIOR
### 出力サンプル
# {
#     "RestoreJobId": "CDXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
# }

後続のリストア状況確認のために出力されたジョブIDをメモしておきます。

JOB_ID=CDXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

5. 確認

aws backup describe-restore-job でリストアジョブの状況確認できます。

aws backup describe-restore-job --restore-job-id $JOB_ID --output table
#### 出力サンプル
# --------------------------------------------------------------------------------------------------
# |                                       DescribeRestoreJob                                       |
# +-------------------+----------------------------------------------------------------------------+
# |  AccountId        |  123456789012                                                              |
# |  BackupSizeInBytes|  8589934592                                                                |
# |  CreationDate     |  2021-01-17T02:28:23.488000+09:00                                          |
# |  IamRoleArn       |  arn:aws:iam::123456789012:role/service-role/AWSBackupDefaultServiceRole   |
# |  PercentDone      |  0.00%                                                                     |
# |  RecoveryPointArn |  arn:aws:ec2:ap-northeast-1::image/ami-0fxxxxxxxxxxxxxxx                   |
# |  RestoreJobId     |  CDXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX                                      |
# |  Status           |  RUNNING                                                                   |
# +-------------------+----------------------------------------------------------------------------+

Status:COMPLETED になれば完了です。

aws backup describe-restore-job --restore-job-id $JOB_ID --output table
#### 出力サンプル
# ---------------------------------------------------------------------------------------------------
# |                                       DescribeRestoreJob                                        |
# +--------------------+----------------------------------------------------------------------------+
# |  AccountId         |  123456789012                                                              |
# |  BackupSizeInBytes |  8589934592                                                                |
# |  CompletionDate    |  2021-01-17T07:03:31.079000+00:00                                          |
# |  CreatedResourceArn|  arn:aws:ec2:ap-northeast-1:123456789012:instance/i-0exxxxxxxxxxxxxxx      |
# |  CreationDate      |  2021-01-17T06:53:28.305000+00:00                                          |
# |  IamRoleArn        |  arn:aws:iam::123456789012:role/service-role/AWSBackupDefaultServiceRole   |
# |  PercentDone       |  0.00%                                                                     |
# |  RecoveryPointArn  |  arn:aws:ec2:ap-northeast-1::image/ami-0fxxxxxxxxxxxxxxx                   |
# |  RestoreJobId      |  CDXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX                                      |
# |  Status            |  COMPLETED                                                                 |
# +--------------------+----------------------------------------------------------------------------+

CreatedResourceArn に作成された EC2インスタンス情報があります。CloudShellやマネコンから確認しましょう。

NEW_INSTANCE=`aws backup describe-restore-job --restore-job-id $JOB_ID --query CreatedResourceArn --output text \
| awk -F/ '{ print $2 }'`
aws ec2 describe-instances --output yaml \
--query "Reservations[*].Instances[]|[?InstanceId=='$NEW_INSTANCE']"
### 出力サンプル
# - AmiLaunchIndex: 0
#   Architecture: x86_64
#   BlockDeviceMappings:
#   - DeviceName: /dev/xvda
#     Ebs:
#       AttachTime: '2021-01-17T06:53:31+00:00'
#       DeleteOnTermination: true
#       Status: attached
#       VolumeId: vol-01xxxxxxxxxxxxxxx
#   CapacityReservationSpecification:
#     CapacityReservationPreference: open
#   ClientToken: 83xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
#   CpuOptions:
#     CoreCount: 1
#     ThreadsPerCore: 2
#   EbsOptimized: true
#   EnaSupport: true
#   HibernationOptions:
#     Configured: false
#   Hypervisor: xen
#   IamInstanceProfile:
#     Arn: arn:aws:iam::123456789012:instance-profile/xxx
#     Id: AIPAXXXXXXXXXXXXXXXXX
#   ImageId: ami-0fxxxxxxxxxxxxxxx
#   InstanceId: i-0exxxxxxxxxxxxxxx
#   InstanceType: t3.nano
#   LaunchTime: '2021-01-17T06:53:30+00:00'
#   (略)

おわりに

AWS CloudShell から CLIを使って EC2インスタンスのリストアを行ってみました。 マネコンからのリストアのほうが直感的で分かりやすいですが、 手順書としてオペレーションミスの無いようにするにはこちら(CloudShell)の作業のほうが良いのではないでしょうか。

以上、少しでも参考になれば幸いです。

参考