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