複数 ENI がアタッチされた EC2 インスタンスを AWS Backup からリストアする

## やりたいこと
* 複数 の ENI がアタッチされた EC2 インスタンスを AWS Backup でバックアップ
* 復旧ポイントからリストアした際にも、複数 ENI がアタッチされた状態でリストアしたい

## 実現方法
* AWS CLI または SDK などから、StartRestoreJob API を実行する必要がある
* コンソールから起動するリストアジョブでは、ネットワークインターフェースをカスタマイズできない

## 複数 ENI がアタッチされた EC2 のバックパップ
複数 ENI がアタッチされた EC2 も AWS Backup でバックアップすることができます。バックアップデータは AMI として保存されますが、AMI にはネットワークインターフェースの情報は含まれません。ただし取得された復旧ポイントのメタデータにはネットワークインターフェースの情報が含まれています。

復旧ポイントのメタデータは [GetRecoveryPointRestoreMetadata API](https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/API_GetRecoveryPointRestoreMetadata.html) で確認できます。以下は AWS CLI での実行例です。

```shell-session
$ aws backup get-recovery-point-restore-metadata --backup-vault-name Default --recovery-point-arn arn:aws:ec2:us-west-2::image/ami-xxxxxxxxxxxxxxxxx
{
    "BackupVaultArn": "arn:aws:backup:us-west-2:123456789012:backup-vault:Default",
    "RecoveryPointArn": "arn:aws:ec2:us-west-2::image/ami-xxxxxxxxxxxxxxxxx",
    "RestoreMetadata": {
        "CapacityReservationSpecification": "{\"CapacityReservationPreference\":\"open\"}",
        "CpuOptions": "{\"CoreCount\":2,\"ThreadsPerCore\":1}",
        "CreditSpecification": "{\"CpuCredits\":\"unlimited\"}",
        "DisableApiTermination": "false",
        "EbsOptimized": "true",
        "HibernationOptions": "{\"Configured\":false}",
        "InstanceInitiatedShutdownBehavior": "stop",
        "InstanceType": "t4g.micro",
        "Monitoring": "{\"State\":\"disabled\"}",
        "NetworkInterfaces": "[{\"AssociatePublicIpAddress\":true,\"DeleteOnTermination\":true,\"Description\":\"\",\"DeviceIndex\":0,\"Groups\":[\"sg-xxxxxxxxxxxxxxxxx\"],\"Ipv6AddressCount\":0,\"Ipv6Addresses\":[],\"NetworkInterfaceId\":\"eni-aaaaaaaaaaaaaaaaa\",\"PrivateIpAddress\":\"172.31.62.169\",\"PrivateIpAddresses\":[{\"Primary\":true,\"PrivateIpAddress\":\"172.31.62.169\"}],\"SecondaryPrivateIpAddressCount\":0,\"SubnetId\":\"subnet-xxxxxxxxxxxxxxxxx\",\"InterfaceType\":\"interface\",\"Ipv4Prefixes\":[],\"Ipv6Prefixes\":[]},{\"AssociatePublicIpAddress\":true,\"DeleteOnTermination\":false,\"Description\":\"\",\"DeviceIndex\":1,\"Groups\":[\"sg-xxxxxxxxxxxxxxxxx\"],\"Ipv6AddressCount\":0,\"Ipv6Addresses\":[],\"NetworkInterfaceId\":\"eni-bbbbbbbbbbbbbbbbb\",\"PrivateIpAddress\":\"172.31.54.130\",\"PrivateIpAddresses\":[{\"Primary\":true,\"PrivateIpAddress\":\"172.31.54.130\"}],\"SecondaryPrivateIpAddressCount\":0,\"SubnetId\":\"subnet-xxxxxxxxxxxxxxxxx\",\"InterfaceType\":\"interface\",\"Ipv4Prefixes\":[],\"Ipv6Prefixes\":[]}]",
        "Placement": "{\"AvailabilityZone\":\"us-west-2d\",\"GroupName\":\"\",\"Tenancy\":\"default\"}",
        "RequireIMDSv2": "false",
        "SecurityGroupIds": "[\"sg-xxxxxxxxxxxxxxxxx\"]",
        "SubnetId": "subnet-xxxxxxxxxxxxxxxxx",
        "VpcId": "vpc-xxxxxxxxxxxxxxxxx",
        "aws:backup:request-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
}
```

上記では、`eni-aaaaaaaaaaaaaaaaa` および `eni-bbbbbbbbbbbbbbbbb` の情報が含まれていることがわかります。

## 復旧ポイントからのリストア方法
AWS Backup コンソールでリストアジョブを起動する場合、複数の ENI をアタッチして EC2 インスタンスをリストアすることはできません。コンソールではカスタマイズ可能なパラメーターが以下に制限されているためです。

https://docs.aws.amazon.com/aws-backup/latest/devguide/restoring-ec2.html

> The AWS Backup console allows you to restore Amazon EC2 recovery points with the following parameters and settings you can customize:
> * Instance type
> * Amazon VPC
> * Subnet
> * Security groups
> * IAM role
> * Shutdown behavior
> * Stop–hibernate behavior
> * Termination protection
> * T2/T3 unlimited
> * Placement group name
> * EBS-optimized instance
> * Tenancy
> * RAM disk ID
> * Kernel ID
> * User data
> * Deletion on termination

ネットワークインターフェースを含む、その他のパラメーターをカスタマイズして EC2 インスタンスをリストアするには AWS CLI または SDK などから、`Metadata` を指定して [StartRestoreJob API](https://docs.aws.amazon.com/aws-backup/latest/devguide/API_StartRestoreJob.html) を実行する必要があります。
> **[Use the AWS Backup API, CLI, or SDK to restore Amazon EC2 recovery points](https://docs.aws.amazon.com/aws-backup/latest/devguide/restoring-ec2.html#restoring-ec2-cli)**
Use StartRestoreJob. This option allows you to restore all 38 parameters, including the 22 parameters that are not customizable on the console. 


以下は AWS CLI での実行例です。

```shell-session
$ aws backup start-restore-job \
  --recovery-point-arn "arn:aws:ec2:us-west-2::image/ami-xxxxxxxxxxxxxxxxx" \
  --iam-role-arn "arn:aws:iam::123456789012:role/service-role/AWSBackupDefaultServiceRole" \
  --metadata file://metadata.json  
{
    "RestoreJobId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
```

metadata.json で以下のようにパラメーターを指定することができます。

**プライベート IP アドレスを指定する例**
バックアップ元のインスタンスが存在する場合は、アドレスが重複しないようにプライベート IP アドレスを変更する必要がある点についてご注意ください。

```json:metadata.json (IP アドレス指定)
{
    "VpcId": "vpc-xxxxxxxxxxxxxxxxx",
    "Monitoring": "{\"State\":\"disabled\"}",
    "CapacityReservationSpecification": "{\"CapacityReservationPreference\":\"open\"}",
    "InstanceInitiatedShutdownBehavior": "stop",
    "DisableApiTermination": "false",
    "CreditSpecification": "{\"CpuCredits\":\"unlimited\"}",
    "HibernationOptions": "{\"Configured\":false}",
    "EbsOptimized": "true",
    "Placement": "{\"AvailabilityZone\":\"us-west-2d\",\"GroupName\":\"\",\"Tenancy\":\"default\"}",
    "aws:backup:request-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "InstanceType": "t4g.micro",
    "NetworkInterfaces": "[{\"DeleteOnTermination\":true,\"Description\":\"\",\"DeviceIndex\":0,\"Groups\":[\"sg-xxxxxxxxxxxxxxxxx\"],\"Ipv6AddressCount\":0,\"Ipv6Addresses\":[],\"PrivateIpAddresses\":[{\"Primary\":true,\"PrivateIpAddress\":\"172.31.62.169\"}],\"SubnetId\":\"subnet-xxxxxxxxxxxxxxxxx\",\"InterfaceType\":\"interface\"},{\"DeleteOnTermination\":false,\"Description\":\"\",\"DeviceIndex\":1,\"Groups\":[\"sg-xxxxxxxxxxxxxxxxx\"],\"Ipv6AddressCount\":0,\"Ipv6Addresses\":[],\"PrivateIpAddresses\":[{\"Primary\":true,\"PrivateIpAddress\":\"172.31.54.130\"}],\"SubnetId\":\"subnet-xxxxxxxxxxxxxxxxx\",\"InterfaceType\":\"interface\"}]"
}
```

**ENI-ID を指定する例**
バックアップ元の ENI を使用する場合は、ENI がインスタンスからデタッチされ、Available ステータスである必要がありますのでご注意ください。

```json:metadata.json (eni-bbbbbbbbbbbbbbbbb を指定)
{
    "VpcId": "vpc-xxxxxxxxxxxxxxxxx",
    "Monitoring": "{\"State\":\"disabled\"}",
    "CapacityReservationSpecification": "{\"CapacityReservationPreference\":\"open\"}",
    "InstanceInitiatedShutdownBehavior": "stop",
    "DisableApiTermination": "false",
    "CreditSpecification": "{\"CpuCredits\":\"unlimited\"}",
    "HibernationOptions": "{\"Configured\":false}",
    "EbsOptimized": "true",
    "Placement": "{\"AvailabilityZone\":\"us-west-2d\",\"GroupName\":\"\",\"Tenancy\":\"default\"}",
    "aws:backup:request-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "InstanceType": "t4g.micro",
    "NetworkInterfaces": "[{\"DeleteOnTermination\":true,\"Description\":\"\",\"DeviceIndex\":0,\"Groups\":[\"sg-xxxxxxxxxxxxxxxxx\"],\"Ipv6AddressCount\":0,\"Ipv6Addresses\":[],\"PrivateIpAddresses\":[{\"Primary\":true,\"PrivateIpAddress\":\"172.31.62.169\"}],\"SubnetId\":\"subnet-xxxxxxxxxxxxxxxxx\",\"InterfaceType\":\"interface\"},{\"DeleteOnTermination\":false,\"Description\":\"\",\"DeviceIndex\":1,\"Ipv6AddressCount\":0,\"Ipv6Addresses\":[],\"NetworkInterfaceId\":\"eni-bbbbbbbbbbbbbbbbb\"}]"
}
```

## 参考
https://aws.amazon.com/jp/premiumsupport/knowledge-center/aws-backup-ec2-restore-cli/

https://repost.aws/questions/QUPxzxKJmcS9qfFDPn3xmHNw/does-aws-backup-support-multiple-ni-cs

(こちらの質問に回答しようと思っていたところ、先を越されてしまったので Qiita で供養しました)

以上です。
参考になれば幸いです。