💻

AWS Backup でEC2の設定がどこまで戻るか試してみた

2023/08/01に公開

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。

先日 AWS パブリックIPアドレス 料金体系変更に対応する作業 EC2編 という記事を書きました。AWS がパブリック IP アドレスに課金を始めるということで対策を考えています。
EC2 インスタンスのパブリック IP アドレス自動付与設定はインスタンスの再作成になってしまいます。再作成方法は色々あるのですが、AWS Backup に可能性があるかどうかを調べてみました。

本記事ではバックアップ元 EC2 インスタンスを作成し、AWS Backup でバックアップを取得、それをリストアして設定値を比較しています。
EC2 インスタンス作成、AWS Backup 設定は公式ユーザーガイド等を参考にして完了している前提で書いています。ご了承ください。

EC2 デフォルト設定がリストアされることは容易に想像できたので少しだけ細かい EC2 設定を入れています。

  • パブリック IP アドレスを付与
  • 詳細モニタリングを有効
  • 停止保護を有効
  • 終了保護を風光
  • EBS ボリュームを1つ追加
  • インスタンスプロファイルを設定
  • タグを3つ追加
    • Name
    • OS
    • Env

さあ、これでどこまで戻るのか楽しみです。

マネジメントコンソールからリストア

マネジメントコンソールの AWS Backup 画面からインスタンスをリストアしました。
手順は Restoring an Amazon EC2 instance を参照ください。

途中 保護されたリソースから復元されたリソースにタグをコピー にチェックを入れます。

img

リストアされインスタンスが起動しました。
元インスタンスと設定値を比較したいので ec2 describe-instances を実行します。結果はファイルに出力です。

# 元インスタンス
$ aws ec2 describe-instances --instance-ids i-0b641f133448c5870 > i-0b641f133448c5870.out

# リストアインスタンス
$ aws ec2 describe-instances --instance-ids i-02804bd1cd5d72eb4 > i-02804bd1cd5d72eb4.out

元インスタンスとリストア後インスタンスの出力ファイルを sdiff とり差分をピックアップします。
ImageIdInstanceId、IP アドレス関連、DNS 名関連、〜〜Time は変更されるのが正解なので差分とし扱いません。

以下差分です。

  • PublicIpAddress
  • Monitoring
クリックして展開
$ sdiff i-0b641f133448c5870.out i-02804bd1cd5d72eb4.out 
{                                                               {
    "Reservations": [                                               "Reservations": [
        {                                                               {
            "Groups": [],                                                   "Groups": [],
            "Instances": [                                                  "Instances": [
                {                                                               {
                    "AmiLaunchIndex": 0,                                            "AmiLaunchIndex": 0,
                    "ImageId": "ami-00970f57473724c10",       |                     "ImageId": "ami-010f38efa8aa4a201",
                    "InstanceId": "i-0b641f133448c5870",      |                     "InstanceId": "i-02804bd1cd5d72eb4",
                    "InstanceType": "t2.micro",                                     "InstanceType": "t2.micro",
                    "KeyName": "RyoYoshii_backup_restore",                          "KeyName": "RyoYoshii_backup_restore",
                    "LaunchTime": "2023-08-01T00:54:41+00:00" |                     "LaunchTime": "2023-08-01T00:51:48+00:00"
                    "Monitoring": {                                                 "Monitoring": {
                        "State": "enabled"                    |                         "State": "disabled"
                    },                                                              },
                    "Placement": {                                                  "Placement": {
                        "AvailabilityZone": "us-west-2c",                               "AvailabilityZone": "us-west-2c",
                        "GroupName": "",                                                "GroupName": "",
                        "Tenancy": "default"                                            "Tenancy": "default"
                    },                                                              },
                    "PrivateDnsName": "ip-10-0-35-222.us-west |                     "PrivateDnsName": "ip-10-0-38-193.us-west
                    "PrivateIpAddress": "10.0.35.222",        |                     "PrivateIpAddress": "10.0.38.193",
                    "ProductCodes": [],                                             "ProductCodes": [],
                    "PublicDnsName": "ec2-34-211-141-138.us-w |                     "PublicDnsName": "",
                    "PublicIpAddress": "34.211.141.138",      <
                    "State": {                                                      "State": {
                        "Code": 16,                                                     "Code": 16,
                        "Name": "running"                                               "Name": "running"
                    },                                                              },
                    "StateTransitionReason": "",                                    "StateTransitionReason": "",
                    "SubnetId": "subnet-1a2b3c4d",                         "SubnetId": "subnet-1a2b3c4d",
                    "VpcId": "vpc-1a2b3c4d",                               "VpcId": "vpc-1a2b3c4d",
                    "Architecture": "x86_64",                                       "Architecture": "x86_64",
                    "BlockDeviceMappings": [                                        "BlockDeviceMappings": [
                        {                                                               {
                            "DeviceName": "/dev/xvda",                                      "DeviceName": "/dev/xvda",
                            "Ebs": {                                                        "Ebs": {
                                "AttachTime": "2023-08-01T00: |                                 "AttachTime": "2023-08-01T00:
                                "DeleteOnTermination": true,                                    "DeleteOnTermination": true,
                                "Status": "attached",                                           "Status": "attached",
                                "VolumeId": "vol-0a5618c8f0c0 |                                 "VolumeId": "vol-06ccee5434ad
                            }                                                               }
                        },                                                              },
                        {                                                               {
                            "DeviceName": "/dev/sdb",                                       "DeviceName": "/dev/sdb",
                            "Ebs": {                                                        "Ebs": {
                                "AttachTime": "2023-08-01T00: |                                 "AttachTime": "2023-08-01T00:
                                "DeleteOnTermination": true,                                    "DeleteOnTermination": true,
                                "Status": "attached",                                           "Status": "attached",
                                "VolumeId": "vol-09f8e094f4b8 |                                 "VolumeId": "vol-093495cd0635
                            }                                                               }
                        }                                                               }
                    ],                                                              ],
                    "ClientToken": "3951850d-8bf2-4b04-ac28-a |                     "ClientToken": "38B148DE-C2C7-D91F-65EE-2
                    "EbsOptimized": false,                                          "EbsOptimized": false,
                    "EnaSupport": true,                                             "EnaSupport": true,
                    "Hypervisor": "xen",                                            "Hypervisor": "xen",
                    "IamInstanceProfile": {                                         "IamInstanceProfile": {
                        "Arn": "arn:aws:iam::123456789012:ins                           "Arn": "arn:aws:iam::123456789012:ins
                        "Id": "AIPA22MFZZYYU5CZA7U5U"                                   "Id": "AIPA22MFZZYYU5CZA7U5U"
                    },                                                              },
                    "NetworkInterfaces": [                                          "NetworkInterfaces": [
                        {                                                               {
                            "Association": {                  <
                                "IpOwnerId": "amazon",        <
                                "PublicDnsName": "ec2-34-211- <
                                "PublicIp": "34.211.141.138"  <
                            },                                <
                            "Attachment": {                                                 "Attachment": {
                                "AttachTime": "2023-08-01T00: |                                 "AttachTime": "2023-08-01T00:
                                "AttachmentId": "eni-attach-0 |                                 "AttachmentId": "eni-attach-0
                                "DeleteOnTermination": true,                                    "DeleteOnTermination": true,
                                "DeviceIndex": 0,                                               "DeviceIndex": 0,
                                "Status": "attached",                                           "Status": "attached",
                                "NetworkCardIndex": 0                                           "NetworkCardIndex": 0
                            },                                                              },
                            "Description": "",                                              "Description": "",
                            "Groups": [                                                     "Groups": [
                                {                                                               {
                                    "GroupName": "RyoYoshii-t                                       "GroupName": "RyoYoshii-t
                                    "GroupId": "sg-0babcd1234567890f                                       "GroupId": "sg-0babcd1234567890f
                                }                                                               }
                            ],                                                              ],
                            "Ipv6Addresses": [],                                            "Ipv6Addresses": [],
                            "MacAddress": "0a:7f:cf:99:12:ff" |                             "MacAddress": "0a:71:09:4d:53:4d"
                            "NetworkInterfaceId": "eni-063b34 |                             "NetworkInterfaceId": "eni-006a7f
                            "OwnerId": "123456789012",                                      "OwnerId": "123456789012",
                            "PrivateDnsName": "ip-10-0-35-222 |                             "PrivateDnsName": "ip-10-0-38-193
                            "PrivateIpAddress": "10.0.35.222" |                             "PrivateIpAddress": "10.0.38.193"
                            "PrivateIpAddresses": [                                         "PrivateIpAddresses": [
                                {                                                               {
                                    "Association": {          <
                                        "IpOwnerId": "amazon" <
                                        "PublicDnsName": "ec2 <
                                        "PublicIp": "34.211.1 <
                                    },                        <
                                    "Primary": true,                                                "Primary": true,
                                    "PrivateDnsName": "ip-10- |                                     "PrivateDnsName": "ip-10-
                                    "PrivateIpAddress": "10.0 |                                     "PrivateIpAddress": "10.0
                                }                                                               }
                            ],                                                              ],
                            "SourceDestCheck": true,                                        "SourceDestCheck": true,
                            "Status": "in-use",                                             "Status": "in-use",
                            "SubnetId": "subnet-09ff3e0d0eba2                               "SubnetId": "subnet-09ff3e0d0eba2
                            "VpcId": "vpc-1a2b3c4d",                               "VpcId": "vpc-1a2b3c4d",
                            "InterfaceType": "interface"                                    "InterfaceType": "interface"
                        }                                                               }
                    ],                                                              ],
                    "RootDeviceName": "/dev/xvda",                                  "RootDeviceName": "/dev/xvda",
                    "RootDeviceType": "ebs",                                        "RootDeviceType": "ebs",
                    "SecurityGroups": [                                             "SecurityGroups": [
                        {                                                               {
                            "GroupName": "RyoYoshii-test-sg",                               "GroupName": "RyoYoshii-test-sg",
                            "GroupId": "sg-0babcd1234567890f216aaf0"                               "GroupId": "sg-0babcd1234567890f216aaf0"
                        }                                                               }
                    ],                                                              ],
                    "SourceDestCheck": true,                                        "SourceDestCheck": true,
                    "Tags": [                                                       "Tags": [
                        {                                                               {
                            "Key": "OS",                                                    "Key": "OS",
                            "Value": "Amazon Linux 2023"                                    "Value": "Amazon Linux 2023"
                        },                                                              },
                        {                                                               {
                            "Key": "Env",                     <
                            "Value": "stage"                  <
                        },                                    <
                        {                                     <
                            "Key": "Name",                                                  "Key": "Name",
                            "Value": "RyoYoshii_backup_restor                               "Value": "RyoYoshii_backup_restor
                                                              >                         },
                                                              >                         {
                                                              >                             "Key": "Env",
                                                              >                             "Value": "stage"
                        }                                                               }
                    ],                                                              ],
                    "VirtualizationType": "hvm",                                    "VirtualizationType": "hvm",
                    "CpuOptions": {                                                 "CpuOptions": {
                        "CoreCount": 1,                                                 "CoreCount": 1,
                        "ThreadsPerCore": 1                                             "ThreadsPerCore": 1
                    },                                                              },
                    "CapacityReservationSpecification": {                           "CapacityReservationSpecification": {
                        "CapacityReservationPreference": "ope                           "CapacityReservationPreference": "ope
                    },                                                              },
                    "HibernationOptions": {                                         "HibernationOptions": {
                        "Configured": false                                             "Configured": false
                    },                                                              },
                    "MetadataOptions": {                                            "MetadataOptions": {
                        "State": "applied",                                             "State": "applied",
                        "HttpTokens": "required",                                       "HttpTokens": "required",
                        "HttpPutResponseHopLimit": 2,                                   "HttpPutResponseHopLimit": 2,
                        "HttpEndpoint": "enabled",                                      "HttpEndpoint": "enabled",
                        "HttpProtocolIpv6": "disabled",                                 "HttpProtocolIpv6": "disabled",
                        "InstanceMetadataTags": "disabled"                              "InstanceMetadataTags": "disabled"
                    },                                                              },
                    "EnclaveOptions": {                                             "EnclaveOptions": {
                        "Enabled": false                                                "Enabled": false
                    },                                                              },
                    "BootMode": "uefi-preferred",                                   "BootMode": "uefi-preferred",
                    "PlatformDetails": "Linux/UNIX",                                "PlatformDetails": "Linux/UNIX",
                    "UsageOperation": "RunInstances",                               "UsageOperation": "RunInstances",
                    "UsageOperationUpdateTime": "2023-08-01T0 |                     "UsageOperationUpdateTime": "2023-08-01T0
                    "PrivateDnsNameOptions": {                                      "PrivateDnsNameOptions": {
                        "HostnameType": "ip-name",                                      "HostnameType": "ip-name",
                        "EnableResourceNameDnsARecord": false                           "EnableResourceNameDnsARecord": false
                        "EnableResourceNameDnsAAAARecord": fa                           "EnableResourceNameDnsAAAARecord": fa
                    },                                                              },
                    "MaintenanceOptions": {                                         "MaintenanceOptions": {
                        "AutoRecovery": "default"                                       "AutoRecovery": "default"
                    },                                                              },
                    "CurrentInstanceBootMode": "legacy-bios"                        "CurrentInstanceBootMode": "legacy-bios"
                }                                                               }
            ],                                                              ],
            "OwnerId": "123456789012",                                      "OwnerId": "123456789012",
            "ReservationId": "r-0cd1859aabb46a71d"            |             "RequesterId": "197132336604",
                                                              >             "ReservationId": "r-007e1d1660f4c1af2"
        }                                                               }
    ]                                                               ]
}                                                               }

続いて describe-instances では拾えないインスタンス属性も比較します。
インスタンス属性を取得するコマンドは ec2 describe-instance-attribute です。一気の全属性が取れそうにないので bash for で回します。

attr.sh
#!/bin/bash

InstanceId=$1

LIST="
instanceType
kernel
ramdisk
userData
disableApiTermination
instanceInitiatedShutdownBehavior
rootDeviceName
blockDeviceMapping
productCodes
sourceDestCheck
groupSet
ebsOptimized
sriovNetSupport
enclaveOptions
disableApiStop"

for l in $LIST
do
  aws ec2 describe-instance-attribute --instance-id ${InstanceId} --attribute $l | egrep -v InstanceId
done

exit 0

シェルスクリプトの引数にインスタンス ID を与えて実行します。例によって出力はファイルです。

$ bash attr.sh i-0b641f133448c5870 > attr-i-0b641f133448c5870.out

$ bash attr.sh i-02804bd1cd5d72eb4 > attr-i-02804bd1cd5d72eb4.out

sdiff とり差分を確認します。

  • UserData
  • DisableApiTermination
  • DisableApiStop
クリックして展開
$ sdiff attr-i-0b641f133448c5870.out attr-i-02804bd1cd5d72eb4.out 
{                                                               {
    "InstanceType": {                                               "InstanceType": {
        "Value": "t2.micro"                                             "Value": "t2.micro"
    }                                                               }
}                                                               }
{                                                               {
    "KernelId": {}                                                  "KernelId": {}
}                                                               }
{                                                               {
    "RamdiskId": {}                                                 "RamdiskId": {}
}                                                               }
{                                                               {
    "UserData": {                                             |     "UserData": {}
        "Value": "IyEvYmluL2Jhc2gKCnl1bSB1cGRhdGUgLXk="       <
    }                                                         <
}                                                               }
{                                                               {
    "DisableApiTermination": {                                      "DisableApiTermination": {
        "Value": true                                         |         "Value": false
    },                                                              },
}                                                               }
{                                                               {
    "InstanceInitiatedShutdownBehavior": {                          "InstanceInitiatedShutdownBehavior": {
        "Value": "stop"                                                 "Value": "stop"
    }                                                               }
}                                                               }
{                                                               {
    "RootDeviceName": {                                             "RootDeviceName": {
        "Value": "/dev/xvda"                                            "Value": "/dev/xvda"
    }                                                               }
}                                                               }
{                                                               {
    "BlockDeviceMappings": [                                        "BlockDeviceMappings": [
        {                                                               {
            "DeviceName": "/dev/xvda",                                      "DeviceName": "/dev/xvda",
            "Ebs": {                                                        "Ebs": {
                "AttachTime": "2023-08-01T00:18:03+00:00",    |                 "AttachTime": "2023-08-01T00:51:49+00:00",
                "DeleteOnTermination": true,                                    "DeleteOnTermination": true,
                "Status": "attached",                                           "Status": "attached",
                "VolumeId": "vol-0a5618c8f0c07ae33"           |                 "VolumeId": "vol-06ccee5434adac3cf"
            }                                                               }
        },                                                              },
        {                                                               {
            "DeviceName": "/dev/sdb",                                       "DeviceName": "/dev/sdb",
            "Ebs": {                                                        "Ebs": {
                "AttachTime": "2023-08-01T00:18:03+00:00",    |                 "AttachTime": "2023-08-01T00:51:49+00:00",
                "DeleteOnTermination": true,                                    "DeleteOnTermination": true,
                "Status": "attached",                                           "Status": "attached",
                "VolumeId": "vol-09f8e094f4b8fc82a"           |                 "VolumeId": "vol-093495cd06357e896"
            }                                                               }
        }                                                               }
    ],                                                              ],
}                                                               }
{                                                               {
    "ProductCodes": []                                              "ProductCodes": []
}                                                               }
{                                                               {
    "SourceDestCheck": {                                            "SourceDestCheck": {
        "Value": true                                                   "Value": true
    }                                                               }
}                                                               }
{                                                               {
    "Groups": [                                                     "Groups": [
        {                                                               {
            "GroupName": "RyoYoshii-test-sg",                               "GroupName": "RyoYoshii-test-sg",
            "GroupId": "sg-0babcd1234567890f216aaf0"                               "GroupId": "sg-0babcd1234567890f216aaf0"
        }                                                               }
    ],                                                              ],
}                                                               }
{                                                               {
    "EbsOptimized": {                                               "EbsOptimized": {
        "Value": false                                                  "Value": false
    },                                                              },
}                                                               }
{                                                               {
    "SriovNetSupport": {                                            "SriovNetSupport": {
        "Value": "simple"                                               "Value": "simple"
    }                                                               }
}                                                               }
{                                                               {
    "EnclaveOptions": {                                             "EnclaveOptions": {
        "Enabled": false                                                "Enabled": false
    },                                                              },
}                                                               }
{                                                               {
    "DisableApiStop": {                                             "DisableApiStop": {
        "Value": true                                         |         "Value": false
    }                                                               }
}                                                               }

なぜこうなったか

マネジメントコンソール での AWS Backup リストアは細かい値を設定できません。以下のスクショくらいかなと思います。
マネジメントコンソールからのリストアは難易度が低く便利ではあるのですが、EC2 を使い込んでいるようなケースでは活用は難しそうは印象です。

img

理想の手順

マネジメントコンソールからリストアはプラットフォームエンジニアとしては物足りないかもしれませんが、実は公式が便利な方法を教えてくれています。

AWS CLI を使用して AWS Backup のリカバリポイントから Amazon EC2 インスタンスを復元するにはどうすればよいですか?

詳しくは上のリンクを読んでほしいと思います。 backup get-recovery-point-restore-metadata コマンドで出力した結果を編集して適切なメタフィールドと値を記述したファイルに保存するところをもう少し説明します。
この自分で作るファイルに書くメタフィールドは API Reference RunInstances にリストされているものです。
API Reference をすみずみまで読み解きながらファイルを作っていきます。

例えば、backup get-recovery-point-restore-metadata の結果では SubnetId が出力されますが、SubnetIdNetworkInterfaces のサブネット指定と重複できないので SubnetId 行は削除します、などのちょっとした工夫が必要です。

基本的には AWS CLI を使用して AWS Backup のリカバリポイントから Amazon EC2 インスタンスを復元するにはどうすればよいですか? の例を真似して書けば失敗はないはずです。

{
"VpcId": "vpc-1a2b3c4d",
"Monitoring": "{\"State\":\"disabled\"}",
"CapacityReservationSpecification": "{\"CapacityReservationPreference\":\"open\"}",
"InstanceInitiatedShutdownBehavior": "stop",
"DisableApiTermination": "false",
"KeyName": "BackupTesting",
"CreditSpecification": "{\"CpuCredits\":\"standard\"}",
"HibernationOptions": "{\"Configured\":false}",
"EbsOptimized": "false",
"Placement": "{\"AvailabilityZone\":\"eu-west-1b\",\"GroupName\":\"\",\"Tenancy\":\"default\"}",
"aws:backup:request-id": "c1234567-ee7c-4896-beeb-ee123b456789",
"InstanceType": "t2.micro",
"NetworkInterfaces": "[{\"DeleteOnTermination\":true,\"Description\":\"Primary network interface\",\"DeviceIndex\":0,\"Groups\":[\"sg-0babcd1234567890f\"],\"Ipv6AddressCount\":0,\"Ipv6Addresses\":[],\"PrivateIpAddresses\":[{\"Primary\":true,\"PrivateIpAddress\":\"192.0.2.210\"}],\"SecondaryPrivateIpAddressCount\":1,\"SubnetId\":\"subnet-1a2b3c4d\",\"InterfaceType\":\"interface\"}]"
}

リストア

メタフィールドと値を記述したファイルを作成したところリストアします。
AWS CLI を使用して AWS Backup のリカバリポイントから Amazon EC2 インスタンスを復元するにはどうすればよいですか? の例に --copy-source-tags-to-restored-resource を追加して実行します。

$ aws backup start-restore-job --region eu-west-1 --recovery-point-arn "arn:aws:ec2:eu-west-1::image/ami-012ab3456789c0123" --iam-role-arn "arn:aws:iam::123456789012:role/service-role/AWSBackupDefaultServiceRole"  --metadata file://ec2-restore-metadata.json --copy-source-tags-to-restored-resource

無事にリストアされたことを確認した後、前と同じで ec2 describe-instancesec2 describe-instance-attribute の結果を sdiff とります。

ec2 describe-instances の差分は無視してよいもの以外は無くなりました。

クリックして展開
$ sdiff i-0b641f133448c5870.out i-0c6110ab03fb5f9a5.out 
{                                                               {
    "Reservations": [                                               "Reservations": [
        {                                                               {
            "Groups": [],                                                   "Groups": [],
            "Instances": [                                                  "Instances": [
                {                                                               {
                    "AmiLaunchIndex": 0,                                            "AmiLaunchIndex": 0,
                    "ImageId": "ami-00970f57473724c10",       |                     "ImageId": "ami-0aa2e136e2198c8d9",
                    "InstanceId": "i-0b641f133448c5870",      |                     "InstanceId": "i-0c6110ab03fb5f9a5",
                    "InstanceType": "t2.micro",                                     "InstanceType": "t2.micro",
                    "KeyName": "RyoYoshii_backup_restore",                          "KeyName": "RyoYoshii_backup_restore",
                    "LaunchTime": "2023-08-01T00:54:41+00:00" |                     "LaunchTime": "2023-08-01T04:44:01+00:00"
                    "Monitoring": {                                                 "Monitoring": {
                        "State": "enabled"                                              "State": "enabled"
                    },                                                              },
                    "Placement": {                                                  "Placement": {
                        "AvailabilityZone": "us-west-2c",                               "AvailabilityZone": "us-west-2c",
                        "GroupName": "",                                                "GroupName": "",
                        "Tenancy": "default"                                            "Tenancy": "default"
                    },                                                              },
                    "PrivateDnsName": "ip-10-0-35-222.us-west |                     "PrivateDnsName": "ip-10-0-35-12.us-west-
                    "PrivateIpAddress": "10.0.35.222",        |                     "PrivateIpAddress": "10.0.35.12",
                    "ProductCodes": [],                                             "ProductCodes": [],
                    "PublicDnsName": "ec2-34-211-141-138.us-w |                     "PublicDnsName": "ec2-18-236-220-191.us-w
                    "PublicIpAddress": "34.211.141.138",      |                     "PublicIpAddress": "18.236.220.191",
                    "State": {                                                      "State": {
                        "Code": 16,                                                     "Code": 16,
                        "Name": "running"                                               "Name": "running"
                    },                                                              },
                    "StateTransitionReason": "",                                    "StateTransitionReason": "",
                    "SubnetId": "subnet-1a2b3c4d",                         "SubnetId": "subnet-1a2b3c4d",
                    "VpcId": "vpc-1a2b3c4d",                               "VpcId": "vpc-1a2b3c4d",
                    "Architecture": "x86_64",                                       "Architecture": "x86_64",
                    "BlockDeviceMappings": [                                        "BlockDeviceMappings": [
                        {                                                               {
                            "DeviceName": "/dev/xvda",                                      "DeviceName": "/dev/xvda",
                            "Ebs": {                                                        "Ebs": {
                                "AttachTime": "2023-08-01T00: |                                 "AttachTime": "2023-08-01T04:
                                "DeleteOnTermination": true,                                    "DeleteOnTermination": true,
                                "Status": "attached",                                           "Status": "attached",
                                "VolumeId": "vol-0a5618c8f0c0 |                                 "VolumeId": "vol-0d8df54ae548
                            }                                                               }
                        },                                                              },
                        {                                                               {
                            "DeviceName": "/dev/sdb",                                       "DeviceName": "/dev/sdb",
                            "Ebs": {                                                        "Ebs": {
                                "AttachTime": "2023-08-01T00: |                                 "AttachTime": "2023-08-01T04:
                                "DeleteOnTermination": true,                                    "DeleteOnTermination": true,
                                "Status": "attached",                                           "Status": "attached",
                                "VolumeId": "vol-09f8e094f4b8 |                                 "VolumeId": "vol-0f6eba940f72
                            }                                                               }
                        }                                                               }
                    ],                                                              ],
                    "ClientToken": "3951850d-8bf2-4b04-ac28-a |                     "ClientToken": "37D92A52-FF73-62B2-3FEC-2
                    "EbsOptimized": false,                                          "EbsOptimized": false,
                    "EnaSupport": true,                                             "EnaSupport": true,
                    "Hypervisor": "xen",                                            "Hypervisor": "xen",
                    "IamInstanceProfile": {                                         "IamInstanceProfile": {
                        "Arn": "arn:aws:iam::123456789012:ins                           "Arn": "arn:aws:iam::123456789012:ins
                        "Id": "AIPA22MFZZYYU5CZA7U5U"                                   "Id": "AIPA22MFZZYYU5CZA7U5U"
                    },                                                              },
                    "NetworkInterfaces": [                                          "NetworkInterfaces": [
                        {                                                               {
                            "Association": {                                                "Association": {
                                "IpOwnerId": "amazon",                                          "IpOwnerId": "amazon",
                                "PublicDnsName": "ec2-34-211- |                                 "PublicDnsName": "ec2-18-236-
                                "PublicIp": "34.211.141.138"  |                                 "PublicIp": "18.236.220.191"
                            },                                                              },
                            "Attachment": {                                                 "Attachment": {
                                "AttachTime": "2023-08-01T00: |                                 "AttachTime": "2023-08-01T04:
                                "AttachmentId": "eni-attach-0 |                                 "AttachmentId": "eni-attach-0
                                "DeleteOnTermination": true,                                    "DeleteOnTermination": true,
                                "DeviceIndex": 0,                                               "DeviceIndex": 0,
                                "Status": "attached",                                           "Status": "attached",
                                "NetworkCardIndex": 0                                           "NetworkCardIndex": 0
                            },                                                              },
                            "Description": "",                                              "Description": "",
                            "Groups": [                                                     "Groups": [
                                {                                                               {
                                    "GroupName": "RyoYoshii-t                                       "GroupName": "RyoYoshii-t
                                    "GroupId": "sg-0babcd1234567890f                                       "GroupId": "sg-0babcd1234567890f
                                }                                                               }
                            ],                                                              ],
                            "Ipv6Addresses": [],                                            "Ipv6Addresses": [],
                            "MacAddress": "0a:7f:cf:99:12:ff" |                             "MacAddress": "0a:d2:98:d0:4d:d5"
                            "NetworkInterfaceId": "eni-063b34 |                             "NetworkInterfaceId": "eni-0e9748
                            "OwnerId": "123456789012",                                      "OwnerId": "123456789012",
                            "PrivateDnsName": "ip-10-0-35-222 |                             "PrivateDnsName": "ip-10-0-35-12.
                            "PrivateIpAddress": "10.0.35.222" |                             "PrivateIpAddress": "10.0.35.12",
                            "PrivateIpAddresses": [                                         "PrivateIpAddresses": [
                                {                                                               {
                                    "Association": {                                                "Association": {
                                        "IpOwnerId": "amazon"                                           "IpOwnerId": "amazon"
                                        "PublicDnsName": "ec2 |                                         "PublicDnsName": "ec2
                                        "PublicIp": "34.211.1 |                                         "PublicIp": "18.236.2
                                    },                                                              },
                                    "Primary": true,                                                "Primary": true,
                                    "PrivateDnsName": "ip-10- |                                     "PrivateDnsName": "ip-10-
                                    "PrivateIpAddress": "10.0 |                                     "PrivateIpAddress": "10.0
                                }                                                               }
                            ],                                                              ],
                            "SourceDestCheck": true,                                        "SourceDestCheck": true,
                            "Status": "in-use",                                             "Status": "in-use",
                            "SubnetId": "subnet-09ff3e0d0eba2                               "SubnetId": "subnet-09ff3e0d0eba2
                            "VpcId": "vpc-1a2b3c4d",                               "VpcId": "vpc-1a2b3c4d",
                            "InterfaceType": "interface"                                    "InterfaceType": "interface"
                        }                                                               }
                    ],                                                              ],
                    "RootDeviceName": "/dev/xvda",                                  "RootDeviceName": "/dev/xvda",
                    "RootDeviceType": "ebs",                                        "RootDeviceType": "ebs",
                    "SecurityGroups": [                                             "SecurityGroups": [
                        {                                                               {
                            "GroupName": "RyoYoshii-test-sg",                               "GroupName": "RyoYoshii-test-sg",
                            "GroupId": "sg-0babcd1234567890f216aaf0"                               "GroupId": "sg-0babcd1234567890f216aaf0"
                        }                                                               }
                    ],                                                              ],
                    "SourceDestCheck": true,                                        "SourceDestCheck": true,
                    "Tags": [                                                       "Tags": [
                        {                                                               {
                            "Key": "OS",                      |                             "Key": "Name",
                            "Value": "Amazon Linux 2023"      |                             "Value": "RyoYoshii_backup_restor
                        },                                                              },
                        {                                                               {
                            "Key": "Env",                                                   "Key": "Env",
                            "Value": "stage"                                                "Value": "stage"
                        },                                                              },
                        {                                                               {
                            "Key": "Name",                    |                             "Key": "OS",
                            "Value": "RyoYoshii_backup_restor |                             "Value": "Amazon Linux 2023"
                        }                                                               }
                    ],                                                              ],
                    "VirtualizationType": "hvm",                                    "VirtualizationType": "hvm",
                    "CpuOptions": {                                                 "CpuOptions": {
                        "CoreCount": 1,                                                 "CoreCount": 1,
                        "ThreadsPerCore": 1                                             "ThreadsPerCore": 1
                    },                                                              },
                    "CapacityReservationSpecification": {                           "CapacityReservationSpecification": {
                        "CapacityReservationPreference": "ope                           "CapacityReservationPreference": "ope
                    },                                                              },
                    "HibernationOptions": {                                         "HibernationOptions": {
                        "Configured": false                                             "Configured": false
                    },                                                              },
                    "MetadataOptions": {                                            "MetadataOptions": {
                        "State": "applied",                                             "State": "applied",
                        "HttpTokens": "required",                                       "HttpTokens": "required",
                        "HttpPutResponseHopLimit": 2,                                   "HttpPutResponseHopLimit": 2,
                        "HttpEndpoint": "enabled",                                      "HttpEndpoint": "enabled",
                        "HttpProtocolIpv6": "disabled",                                 "HttpProtocolIpv6": "disabled",
                        "InstanceMetadataTags": "disabled"                              "InstanceMetadataTags": "disabled"
                    },                                                              },
                    "EnclaveOptions": {                                             "EnclaveOptions": {
                        "Enabled": false                                                "Enabled": false
                    },                                                              },
                    "BootMode": "uefi-preferred",                                   "BootMode": "uefi-preferred",
                    "PlatformDetails": "Linux/UNIX",                                "PlatformDetails": "Linux/UNIX",
                    "UsageOperation": "RunInstances",                               "UsageOperation": "RunInstances",
                    "UsageOperationUpdateTime": "2023-08-01T0 |                     "UsageOperationUpdateTime": "2023-08-01T0
                    "PrivateDnsNameOptions": {                                      "PrivateDnsNameOptions": {
                        "HostnameType": "ip-name",                                      "HostnameType": "ip-name",
                        "EnableResourceNameDnsARecord": false                           "EnableResourceNameDnsARecord": false
                        "EnableResourceNameDnsAAAARecord": fa                           "EnableResourceNameDnsAAAARecord": fa
                    },                                                              },
                    "MaintenanceOptions": {                                         "MaintenanceOptions": {
                        "AutoRecovery": "default"                                       "AutoRecovery": "default"
                    },                                                              },
                    "CurrentInstanceBootMode": "legacy-bios"                        "CurrentInstanceBootMode": "legacy-bios"
                }                                                               }
            ],                                                              ],
            "OwnerId": "123456789012",                                      "OwnerId": "123456789012",
            "ReservationId": "r-0cd1859aabb46a71d"            |             "RequesterId": "197132336604",
                                                              >             "ReservationId": "r-02432f15cd0a45cfd"
        }                                                               }
    ]                                                               ]
}                                                               }

ec2 describe-instance-attribute の差分です。

  • UserData
  • DisableApiStop
クリックして展開
$ sdiff attr-i-0b641f133448c5870.out attr-i-0c6110ab03fb5f9a5.out 
{                                                               {
    "InstanceType": {                                               "InstanceType": {
        "Value": "t2.micro"                                             "Value": "t2.micro"
    }                                                               }
}                                                               }
{                                                               {
    "KernelId": {}                                                  "KernelId": {}
}                                                               }
{                                                               {
    "RamdiskId": {}                                                 "RamdiskId": {}
}                                                               }
{                                                               {
    "UserData": {                                             |     "UserData": {}
        "Value": "IyEvYmluL2Jhc2gKCnl1bSB1cGRhdGUgLXk="       <
    }                                                         <
}                                                               }
{                                                               {
    "DisableApiTermination": {                                      "DisableApiTermination": {
        "Value": true                                                   "Value": true
    },                                                              },
}                                                               }
{                                                               {
    "InstanceInitiatedShutdownBehavior": {                          "InstanceInitiatedShutdownBehavior": {
        "Value": "stop"                                                 "Value": "stop"
    }                                                               }
}                                                               }
{                                                               {
    "RootDeviceName": {                                             "RootDeviceName": {
        "Value": "/dev/xvda"                                            "Value": "/dev/xvda"
    }                                                               }
}                                                               }
{                                                               {
    "BlockDeviceMappings": [                                        "BlockDeviceMappings": [
        {                                                               {
            "DeviceName": "/dev/xvda",                                      "DeviceName": "/dev/xvda",
            "Ebs": {                                                        "Ebs": {
                "AttachTime": "2023-08-01T00:18:03+00:00",    |                 "AttachTime": "2023-08-01T04:44:02+00:00",
                "DeleteOnTermination": true,                                    "DeleteOnTermination": true,
                "Status": "attached",                                           "Status": "attached",
                "VolumeId": "vol-0a5618c8f0c07ae33"           |                 "VolumeId": "vol-0d8df54ae5488fe09"
            }                                                               }
        },                                                              },
        {                                                               {
            "DeviceName": "/dev/sdb",                                       "DeviceName": "/dev/sdb",
            "Ebs": {                                                        "Ebs": {
                "AttachTime": "2023-08-01T00:18:03+00:00",    |                 "AttachTime": "2023-08-01T04:44:02+00:00",
                "DeleteOnTermination": true,                                    "DeleteOnTermination": true,
                "Status": "attached",                                           "Status": "attached",
                "VolumeId": "vol-09f8e094f4b8fc82a"           |                 "VolumeId": "vol-0f6eba940f72b1625"
            }                                                               }
        }                                                               }
    ],                                                              ],
}                                                               }
{                                                               {
    "ProductCodes": []                                              "ProductCodes": []
}                                                               }
{                                                               {
    "SourceDestCheck": {                                            "SourceDestCheck": {
        "Value": true                                                   "Value": true
    }                                                               }
}                                                               }
{                                                               {
    "Groups": [                                                     "Groups": [
        {                                                               {
            "GroupName": "RyoYoshii-test-sg",                               "GroupName": "RyoYoshii-test-sg",
            "GroupId": "sg-0babcd1234567890f216aaf0"                               "GroupId": "sg-0babcd1234567890f216aaf0"
        }                                                               }
    ],                                                              ],
}                                                               }
{                                                               {
    "EbsOptimized": {                                               "EbsOptimized": {
        "Value": false                                                  "Value": false
    },                                                              },
}                                                               }
{                                                               {
    "SriovNetSupport": {                                            "SriovNetSupport": {
        "Value": "simple"                                               "Value": "simple"
    }                                                               }
}                                                               }
{                                                               {
    "EnclaveOptions": {                                             "EnclaveOptions": {
        "Enabled": false                                                "Enabled": false
    },                                                              },
}                                                               }
{                                                               {
    "DisableApiStop": {                                             "DisableApiStop": {
        "Value": true                                         |         "Value": false
    }                                                               }
}                         

検証

インスタンス属性に差分が出てしまいました。
backup get-recovery-point-restore-metadata の結果からメタフィールドを記述したファイルを生成し、それを基にリストアしました。が、情報が不足していたからだと考えます。
完全に同じインスタンスとしてリストアするには API Reference RunInstances にリストされているメタフィールドから不足分を自分で記述してあげないとならないようです。
正直それなら RunInstances を実行したほうが自動化しやすいと個人的に感じてしまいました。。。

まとめ

軽く EC2 を使っている程度なら AWS Backup からのリストアは便利だと思います。
ただ、ゴリゴリカスタマイズした環境で使っていると不足してくる箇所も出てきました。

Discussion