
【AWS Backup】AWS CloudShell から CLIを使って EC2インスタンスのリストアを行う
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
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 の仕組みについての解説は省きます。詳細は以下ブログがとても分かりやすいので参照ください。
手順
全体の流れは以下のとおりです。
- AWS CloudShell の起動
- バックアップ/リストア対象インスタンスの選択
- リカバリポイントの選択
- リストアジョブの実行
- 確認
1. AWS CloudShell の起動
まずはマネコンにログインします。
上部 にある CloudShellアイコンをクリック、もしくは 「CloudShell へのアクセスリンク」を開きます。

- CloudShell へのアクセスリンク: https://ap-northeast-1.console.aws.amazon.com/cloudshell/home?region=ap-northeast-1
CloudShell コンソールへ入れること、 aws --version や aws sts get-caller-identity などで
AWS CLIが実施できること確認できればOKです。

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)の作業のほうが良いのではないでしょうか。
以上、少しでも参考になれば幸いです。









