AWS BackupからEC2インスタンスをリストアする際にIPアドレスを保持する方法

AWS Backup

AWS BackupからEC2インスタンスをリストア

前提としてAWS Backupについての詳細は本記事では書きません。

AWS BackupからGUI上で復元する場合に、以下のようにネットワーク設定で指定することはできるが、IPアドレスを保持させるような設定はどこにもない。

この状態で復元を実行すると、IPアドレスはサブネットのCIDR範囲でランダムに付与されたEC2インスタンスが復元されることになる。

AWS Backupのリカバリポイントからメタデータの取得

GUI上からIPアドレスを指定して復元することができないので、どうすれば良いか?といったところですが、AWS Backupのリカバリポイントからバックアップに関するメタデータを取得し、そのメタデータの中でIPアドレスを指定してリストアコマンドを実行することで指定のIPアドレスを保持した状態で復元することが可能です。

メタデータの取得方法

メタデータ取得コマンドは以下の通りです。

aws backup get-recovery-point-restore-metadata --backup-vault-name <バックアップボールト名> --recovery-point-arn <復旧ポイントARN>

--recovery-point-arn <復旧ポイントARN>はバックアップボールトの復旧ポイントIDをクリックすると以下のように詳細内容が確認できるため、この中のARNをコピーして指定をします。

コマンドを実行すると以下のようなJSONが出力されます。

{
   "BackupVaultArn": "arn:aws:backup:ap-northeast-1:${AccountId}:backup-vault:test-ec2-bolt",
   "RecoveryPointArn": "arn:aws:ec2:ap-northeast-1::image/ami-xxxxxxxxxxxxxx",
   "RestoreMetadata": {
       "Architecture": "x86_64",
       "BlockDeviceMappings": "[{\"DeviceName\":\"/dev/xvda\",\"Ebs\":{\"DeleteOnTermination\":false,\"Iops\":3000,\"VolumeSize\":8,\"VolumeType\":\"gp3\",\"Throughput\":125,\"Encrypted\":false}},{\"DeviceName\":\"/dev/sdb\",\"Ebs\":{\"DeleteOnTermination\":false,\"Iops\":3000,\"VolumeSize\":5,\"VolumeType\":\"gp3\",\"Throughput\":125,\"Encrypted\":false}}]",
      "CapacityReservationSpecification": "{\"CapacityReservationPreference\":\"open\"}",
       "CpuOptions": "{\"CoreCount\":1,\"ThreadsPerCore\":1}",
       "CreditSpecification": "{\"CpuCredits\":\"standard\"}",
       "DisableApiTermination": "false",
       "EbsOptimized": "false",
       "EnaSupport": "true",
       "HibernationOptions": "{\"Configured\":false}",
       "IamInstanceProfileName": "role-ec2",
      "InstanceInitiatedShutdownBehavior": "stop",
       "InstanceType": "t2.micro",
       "Monitoring": "{\"State\":\"disabled\"}",
       "NetworkInterfaces": "[{\"AssociatePublicIpAddress\":true,\"DeleteOnTermination\":true,\"Description\":\"\",\"DeviceIndex\":0,\"Groups\":[\"sg-xxxxxxxxxxxxxx\"],\"Ipv6AddressCount\":0,\"Ipv6Addresses\":[],\"NetworkInterfaceId\":\"eni-xxxxxxxxxxxxx\",\"PrivateIpAddress\":\"10.100.0.91\",\"PrivateIpAddresses\":[{\"Primary\":true,\"PrivateIpAddress\":\"10.100.0.91\"}],\"SecondaryPrivateIpAddressCount\":0,\"SubnetId\":\"subnet-xxxxxxxxxxxxx\",\"InterfaceType\":\"interface\",\"Ipv4Prefixes\":[],\"Ipv6Prefixes\":[]}]",
       "Placement": "{\"AvailabilityZone\":\"ap-northeast-1a\",\"GroupName\":\"\",\"Tenancy\":\"default\"}",
       "RequireIMDSv2": "true",
       "RootDeviceType": "ebs",
       "SecurityGroupIds": "[\"sg-xxxxxxxxxxxxxxxxx\"]",
       "SubnetId": "subnet-xxxxxxxxxxxxx", 
       "VirtualizationType": "hvm",
       "VpcId": "vpc-xxxxxxxxxxx",
       "aws:backup:request-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
   },
   "ResourceType": "EC2"
}

このJSONデータを編集して、JSONを指定できる形に編集します。

メタデータの編集

出力した内容のうち以下の内容については削除および修正します。

  • "Encrypted"
  • "CpuOptions"
  • "NetworkInterfaces"
  • "AssociatePublicIpAddress
  • "SecurityGroupIds"
  • "SubnetId"
  • "VpcId"
  • "Placement"

Encrypted

"Encrypted\":false

この項目についてはデフォルトでは以下のようにfalseになっていますが、trueに修正します。

AWS Backupでバックアップを取っているものは暗号化されています。

暗号化されたバックアップを暗号化なしで復元することはできないため、暗号化した状態で復元するようにtrueを指定します。

CpuOptions

こちらについては項目ごと削除して問題ありません。

NetworkInterfaces

NetworkInterfacesの一文を再掲します。

"NetworkInterfaces": "[{\"AssociatePublicIpAddress\":false,\"DeleteOnTermination\":true,\"Description\":\"\",\"DeviceIndex\":0,\"Groups\":[\"sg-xxxxxxxxxxxxxx\"],\"Ipv6AddressCount\":0,\"Ipv6Addresses\":[],\"NetworkInterfaceId\":\"eni-xxxxxxxxxxxxx\",\"PrivateIpAddress\":\"10.100.0.91\",\"PrivateIpAddresses\":[{\"Primary\":true,\"PrivateIpAddress\":\"10.100.0.91\"}],\"SecondaryPrivateIpAddressCount\":0,\"SubnetId\":\"subnet-xxxxxxxxxxxxx\",\"InterfaceType\":\"interface\",\"Ipv4Prefixes\":[],\"Ipv6Prefixes\":[]}]",

この項目内の以下内容を削除します。

"NetworkInterfaceId\":\"eni-xxxxxxxxxxxxx\" -> 復元時、新しくENIが作成されるため不要

"PrivateIpAddress\":\"10.100.0.91\" -> "PrivateIpAddresses\"内でIPアドレスを指定するため (文字列が似ているため注意です)

AssociatePublicIpAddress

こちらの項目は "true" となっている場合は "false"に修正します。

パブリックIPアドレスが割り振られないようにするためです。

SecurityGroupIds

NetworkInterfaces内で指定するため項目ごと削除。

"Groups\":[\"sg-xxxxxxxxxxxxxx\"]の箇所で関連付けしたいセキュリティグループIDを指定する。

SubnetId

NetworkInterfaces内で指定するため項目ごと削除。

"SubnetId\":\"subnet-xxxxxxxxxxxxx\"の箇所でサブネットグループIDを指定する。

VpcId

所属させるVPCのIDを指定します。

“VpcId”: “vpc-xxxxxxxxxx”

Placement

"ap-northeast-1a\"

リージョンの記載があるため、復元したい対象リージョンを指定する。

IPアドレスの設定

ここまでで一部削除および修正項目について解説してきましたが、肝心のIPアドレスをどうするか?について解説していきます。

IPアドレス項目については"PrivateIpAddresses\":[{\"Primary\":true,\"PrivateIpAddress\":\"10.100.0.91\"}]の部分が対象となります。

ここでIPアドレスを指定しておくことで、指定したIPアドレスで復元することができます。

また、セカンダリIPアドレスを指定しているインスタンスの場合、

"PrivateIpAddresses\":[{\"Primary\":true,\"PrivateIpAddress\":\"10.100.0.xx\"}]の部分は複数存在しているため、そちらも編集します。

IPアドレスを固定で指定したい場合には\"Primary\":true、動的で良い場合には\"Primary\":falseにする必要があります。

メタデータ最終系

単純なEBSボリューム一つ、IPアドレス一つの場合は以下のようなメタデータが最終系になります。

追加ボリュームが付いている場合は"BlockDeviceMappings"DeviceNameが2つあり、

セカンダリIPアドレスがある場合には"PrivateIpAddress\"が2つありますので若干記載メタデータのボリュームが増えますが単純に1つの場合は以下のような形になります。

{
"Architecture": "x86_64",
"BlockDeviceMappings": "[{\"DeviceName\":\"/dev/xvda\",\"Ebs\":{\"DeleteOnTermination\":false,\"Iops\":3000,\"VolumeSize\":8,\"VolumeType\":\"gp3\",\"Throughput\":125,\"Encrypted\":false}},{\"DeviceName\":\"/dev/sdb\",\"Ebs\":{\"DeleteOnTermination\":false,\"Iops\":3000,\"VolumeSize\":5,\"VolumeType\":\"gp3\",\"Throughput\":125,\"Encrypted\":false}}]",
"CapacityReservationSpecification": "{\"CapacityReservationPreference\":\"open\"}",
"CreditSpecification": "{\"CpuCredits\":\"standard\"}",
"DisableApiTermination": "false",
"EbsOptimized": "false",
"EnaSupport": "true",
"HibernationOptions": "{\"Configured\":false}",
"IamInstanceProfileName": "role-ec2",
"InstanceInitiatedShutdownBehavior": "stop",
"InstanceType": "t2.micro",
"Monitoring": "{\"State\":\"disabled\"}",
"NetworkInterfaces": "[{\"AssociatePublicIpAddress\":false,\"DeleteOnTermination\":true,\"Description\":\"\",\"DeviceIndex\":0,\"Groups\":[\"sg-0daeef56ae1ded14b\"],\"Ipv6AddressCount\":0,\"Ipv6Addresses\":[],\"PrivateIpAddresses\":[{\"Primary\":true,\"PrivateIpAddress\":\"10.100.0.94\"}],\"SecondaryPrivateIpAddressCount\":1,\"SubnetId\":\"subnet-00fb8fdd0a78862cf\",\"InterfaceType\":\"interface\",\"Ipv4Prefixes\":[],\"Ipv6Prefixes\":[]}]",
"Placement": "{\"AvailabilityZone\":\"ap-northeast-1a\",\"GroupName\":\"\",\"Tenancy\":\"default\"}",
"RequireIMDSv2": "true",
"RootDeviceType": "ebs",
"VirtualizationType": "hvm",
"VpcId": "vpc-xxxxxxx",
"aws:backup:request-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

上記メタデータをrestore.jsonとして保存します。

実際に上記メタデータを使用してリストアするCLIは以下となります。

aws backup start-restore-job --region <指定のリージョンコード> --recovery-point-arn "<復旧ポイントARN>" --iam-role-arn "<ロールARN>" --metadata file://restore.json

以下のようなレスポンスが返ってくれば、リストアの実行自体は成功しています。

{
    "RestoreJobId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

AWS BackupでEC2インスタンスリストア時の補足

AWS BakcupでEC2インスタンスをリストアする際に、EC2インスタンスにアタッチされているIAMロールを付与する権限が必要になります。

AWS Backupがリストアを実行するIAMロールが、EC2インスタンスのインスタンスプロファイルでIAMロールをアタッチする際にAWS Backupが勝手にEC2インスタンスにロールをアタッチすることはできない。

そのため、AWS Backupのロールに以下のポリシーをアタッチすることで、AWS BackupのロールをEC2インスタンスへパスすることで、EC2インスタンスはロールをアタッチして起動をすることができる。

{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Action": "iam:PassRole",
           "Resource": [
               "arn:aws:iam::{AccountId}:role/{ロール名}"
           ]
       }
   ]
}

図解すると以下

といった具合に、AWS BackupがEC2インスタンスをリストアする際には色々と制約があるため、それら全てを解決しておく必要があります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です