0
1

AWS Backupからの復元時にEC2に任意のプライベートIPアドレスを割り当てる方法

Posted at

はじめに

前回の記事で、AMIからの復元時に任意のプライベートIPアドレスを指定する方法を紹介しましたが、今回はAWS Backupで取得しているバックアップから復元する際に任意のプライベートIPアドレスを割り当てる方法も紹介したいと思います。

なお、今回は趣旨が異なるため、AWS Backup自体の説明や設定方法は解説せず、AWS Backupの運用が既に行われている前提で進めます。

AWS Backupからの復元について

AWS Backupは設定することでEC2やEFS、RDS等のバックアップを定期的に行ってくれるサービスとなりますが、AWS Backupで取得したEC2のバックアップから復元する場合、AMIから再作成する場合と異なり、以下のように簡易的なネットワーク設定しかできないようになっております。

Monosnap_20240818_142930.png

AWSマネジメントコンソール上からは簡易的な設定しかできませんが、AWS CLIを使ってAWS Backupを操作することで任意のプライベートIPアドレスを割り当てたEC2インスタンスを復元することができるため、以下より紹介していきます。

基本的には以下公式の手順に沿って進めていきますので、手順のみ確認したい方は公式手順を参照してください。

手順の流れ

AWS Backupからの復元時にEC2に任意のプライベートIPアドレスを割り当てるには、復元する内容が記載されたメタデータを用意して、AWS Backupの復元コマンド実行時に用意したメタデータを読み込ませれば設定できます。

メタデータの作成には少し工夫が必要なので、以下より進めていきます。

AWS Backupで作成したバックアップイメージのメタデータ取得

AWS Backupからの復元コマンドに読み込ませるメタデータの雛形を作成するため、AWS Backupでバックアップ済みのイメージからメタデータを取得します。

コマンドで取得する際に必要となる「バックアップボールト名」はAWS Backupダッシュボードの「ボールト」から作成済みのボールト名を確認してください。

同じく必要となる「復元ポイントARN」はAWS Backupダッシュボードの「ジョブ」→「バックアップジョブ」タブからメタデータを取得したいEC2の「バックアップジョブID」を選択。

Monosnap_20240818_152207.png

選択すると、以下のように「復元ポイントARN」を確認することができるため、ARNを控えます。

Monosnap_20240818_152921.png

バックアップボールト名」、「復元ポイントARN」確認後、以下コマンドを実行してください。

バックアップ済みイメージのメタデータ取得
aws backup get-recovery-point-restore-metadata --backup-vault-name [バックアップボールト名] --recovery-point-arn [復元ポイントARN] > metadata_template.json

途中で内容が切れてしまう可能性があるため、コマンド結果をファイルに出力するようにしてください。

先程のメタデータ取得コマンドを実行すると以下のような結果がmetadata_template.jsonに出力されるため、以下を雛形にして次項より復元時に使用するメタデータファイルを作成していきます。

コマンド出力したmetadata_template.jsonの表示例
{
    "BackupVaultArn": "arn:aws:backup:ap-northeast-1:123456789012:backup-vault:aws-backup-vault",
    "RecoveryPointArn": "arn:aws:ec2:ap-northeast-1::image/ami-084ddc30cf536ac1e",
    "RestoreMetadata": {
        "Architecture": "x86_64",
        "CapacityReservationSpecification": "{\"CapacityReservationPreference\":\"open\"}",
        "CpuOptions": "{\"CoreCount\":1,\"ThreadsPerCore\":1}",
        "CreditSpecification": "{\"CpuCredits\":\"standard\"}",
        "DisableApiTermination": "false",
        "EbsOptimized": "false",
        "EnaSupport": "true",
        "HibernationOptions": "{\"Configured\":false}",
        "IamInstanceProfileName": "ec2_role",
        "InstanceInitiatedShutdownBehavior": "stop",
        "InstanceType": "t2.micro",
        "KeyName": "ec2-keypair",
        "Monitoring": "{\"State\":\"disabled\"}",
        "NetworkInterfaces": "[{\"AssociatePublicIpAddress\":true,\"DeleteOnTermination\":true,\"Description\":\"\",\"DeviceIndex\":0,\"Groups\":[\"sg-06d3f4fca2b07b915\"],\"Ipv6AddressCount\":0,\"Ipv6Addresses\":[],\"NetworkInterfaceId\":\"eni-0196b22fc136f1f81\",\"PrivateIpAddress\":\"10.1.10.115\",\"PrivateIpAddresses\":[{\"Primary\":true,\"PrivateIpAddress\":\"10.1.10.115\"},{\"Primary\":false,\"PrivateIpAddress\":\"10.1.10.100\"}],\"SecondaryPrivateIpAddressCount\":1,\"SubnetId\":\"subnet-0bdb9444b6747e0d6\",\"InterfaceType\":\"interface\",\"Ipv4Prefixes\":[],\"Ipv6Prefixes\":[]}]",
        "Placement": "{\"AvailabilityZone\":\"ap-northeast-1a\",\"GroupName\":\"\",\"Tenancy\":\"default\"}",
        "RequireIMDSv2": "true",
        "RootDeviceType": "ebs",
        "SecurityGroupIds": "[\"sg-06d3f4fca2b07b915\"]",
        "SubnetId": "subnet-0bdb9444b6747e0d6",
        "VirtualizationType": "hvm",
        "VpcId": "vpc-0038965ef3ab23888",
        "aws:backup:request-id": "19f9ec92-f9a8-4a5f-9deb-8d790eb346b7"
    }
}

復元時に指定するメタデータの作成

復元時に必要となるメタデータはRestoreMetadata部分となるため、RestoreMetadata部分を雛形として抜き出し、AWS Backupからの復元時に読み込ませるメタデータを作成します。

以下RestoreMetadataのみ抜き出した雛形。

RestoreMetadata部分のみ抜粋した雛形
{
  "Architecture": "x86_64",
  "CapacityReservationSpecification": "{\"CapacityReservationPreference\":\"open\"}",
  "CpuOptions": "{\"CoreCount\":1,\"ThreadsPerCore\":1}",
  "CreditSpecification": "{\"CpuCredits\":\"standard\"}",
  "DisableApiTermination": "false",
  "EbsOptimized": "false",
  "EnaSupport": "true",
  "HibernationOptions": "{\"Configured\":false}",
  "IamInstanceProfileName": "ec2_role",
  "InstanceInitiatedShutdownBehavior": "stop",
  "InstanceType": "t2.micro",
  "KeyName": "ec2-keypair",
  "Monitoring": "{\"State\":\"disabled\"}",
  "NetworkInterfaces": "[{\"AssociatePublicIpAddress\":true,\"DeleteOnTermination\":true,\"Description\":\"\",\"DeviceIndex\":0,\"Groups\":[\"sg-06d3f4fca2b07b915\"],\"Ipv6AddressCount\":0,\"Ipv6Addresses\":[],\"NetworkInterfaceId\":\"eni-0196b22fc136f1f81\",\"PrivateIpAddress\":\"10.1.10.115\",\"PrivateIpAddresses\":[{\"Primary\":true,\"PrivateIpAddress\":\"10.1.10.115\"},{\"Primary\":false,\"PrivateIpAddress\":\"10.1.10.100\"}],\"SecondaryPrivateIpAddressCount\":1,\"SubnetId\":\"subnet-0bdb9444b6747e0d6\",\"InterfaceType\":\"interface\",\"Ipv4Prefixes\":[],\"Ipv6Prefixes\":[]}]",
  "Placement": "{\"AvailabilityZone\":\"ap-northeast-1a\",\"GroupName\":\"\",\"Tenancy\":\"default\"}",
  "RequireIMDSv2": "true",
  "RootDeviceType": "ebs",
  "SecurityGroupIds": "[\"sg-06d3f4fca2b07b915\"]",
  "SubnetId": "subnet-0bdb9444b6747e0d6",
  "VirtualizationType": "hvm",
  "VpcId": "vpc-0038965ef3ab23888",
  "aws:backup:request-id": "19f9ec92-f9a8-4a5f-9deb-8d790eb346b7"
}

上記のうち、以下の項目とNetworkInterfaces項目の一部の設定は削る必要があるため、雛形から削ります。

削る項目 備考
CpuOptions 復元時に使用するメタデータには指定できないため削除が必要
NetworkInterfacesの一部項目 後述
SecurityGroupIds NetworkInterfaces内の設定と被るため削除・修正が必要
SubnetId NetworkInterfaces内の設定と被るため削除が必要

NetworkInterfacesの項目の修正

NetworkInterfacesの項目は横に長く見づらいため、抜粋して少し見やすく修正したものを以下に示します。

NetworkInterfaces項目抜粋&整形
"NetworkInterfaces": "[{
  \"AssociatePublicIpAddress\":true,
  \"DeleteOnTermination\":true,
  \"Description\":\"\",
  \"DeviceIndex\":0,
  \"Groups\":[\"sg-06d3f4fca2b07b915\"],
  \"Ipv6AddressCount\":0,
  \"Ipv6Addresses\":[],
  \"NetworkInterfaceId\":\"eni-0196b22fc136f1f81\",
  \"PrivateIpAddress\":\"10.1.10.115\",
  \"PrivateIpAddresses\":[
    {
      \"Primary\":true,
      \"PrivateIpAddress\":\"10.1.10.115\"
    },
    {
      \"Primary\":false,
      \"PrivateIpAddress\":\"10.1.10.100\"
    }
  ],
  \"SecondaryPrivateIpAddressCount\":1,
  \"SubnetId\":\"subnet-0bdb9444b6747e0d6\",
  \"InterfaceType\":\"interface\",
  \"Ipv4Prefixes\":[],
  \"Ipv6Prefixes\":[]
}]",

抜粋したNetworkInterfacesの項目のうち、以下は削る必要があるため削除します。

ややこしいですが、NetworkInterfacesの項目にはPrivateIpAddressPrivateIpAddressesの項目があり、PrivateIpAddressのみ削除します。

削る項目 備考
NetworkInterfaceId 復元時に新規に作成されるため削除
PrivateIpAddress PrivateIpAddressesの項目内で指定するため削除

また、私の環境では、バックアップ元の設定はパブリックIPを割り当てるようにはしていなかった(はず)ですが、パブリックIPアドレスを割り当てるAssociatePublicIpAddressがtrueになっていたため、falseに修正しておきます。

修正する項目 備考
AssociatePublicIpAddress パブリックIPアドレスが割り振られないようにfalseに修正

PrivateIpAddressesの部分に関しては今回のメインの設定部分となるため、次項目で説明します。

PrivateIpAddressesの項目の設定

以下、先ほどNetworkInterfaces部分のみ抜粋した項目のうち、復元時に設定するIPアドレス設定部分のみ更に抜粋したものですが、復元時に設定したいIPアドレス構成によって内容を修正します。

IPアドレス設定部分の抜粋
  \"PrivateIpAddresses\":[
    {
      \"Primary\":true,
      \"PrivateIpAddress\":\"10.1.10.115\"
    },
    {
      \"Primary\":false,
      \"PrivateIpAddress\":\"10.1.10.100\"
    }
  ],
  \"SecondaryPrivateIpAddressCount\":1,

ややこしいので設定したい内容ごとにまとめます。

プライマリIP動的、セカンダリIP無しで設定する場合

特に任意のプライベートIPを割り当てることはせず、プライマリIPのみで作成する場合、先ほど抜粋したIPアドレス設定部分は全て削除でOKです。

EC2復元時、何も指定していなくても必ず1つのネットワークは作成されることから、通常通りAWS側から動的に1つのIPアドレスが割り当たります。

プライマリIP固定、セカンダリIP無しで設定する場合

プライマリIPを10.1.10.100で設定し、セカンダリIPは無しで設定する場合、PrivateIpAddressesPrimaryをtrue、PrivateIpAddress10.1.10.100と指定します。

セカンダリIPの設定は行っていないため、任意に指定したプライマリIPアドレスが割り当てられたEC2が復元されます。

プライマリIP固定、セカンダリIP無しで設定する場合の例
  \"PrivateIpAddresses\":[
    {
      \"Primary\":true,
      \"PrivateIpAddress\":\"10.1.10.100\"
    }
  ],

プライマリIP固定、セカンダリIP動的で設定する場合

プライマリIPを10.1.10.100、セカンダリIPは作成するがAWSから動的に割り当てたい場合、先程の例にSecondaryPrivateIpAddressCountの設定を加えます。

SecondaryPrivateIpAddressCountはいくつのセカンダリIPを作成するかの指定となり、「1」とすれば、プライマリIPとは別に1つのセカンダリIPが作成されます。

プライマリIP固定、セカンダリIP動的で設定する場合の例
  \"PrivateIpAddresses\":[
    {
      \"Primary\":true,
      \"PrivateIpAddress\":\"10.1.10.110\"
    },
  ],
  \"SecondaryPrivateIpAddressCount\":1,

プライマリIP固定、セカンダリIP固定で設定する場合

プライマリIPを10.1.10.100、セカンダリIPを10.1.10.101でどちらも固定で割り当てたい場合、プライマリIPの固定方法と同じような設定を加えます。

但し、Primaryはfalseにする必要があるので注意してください。

また、今回の場合、セカンダリIPアドレスは固定で指定することから、SecondaryPrivateIpAddressCountの設定は冗長となるため不要となります。

プライマリIP固定、セカンダリIP固定で設定する場合の例
  \"PrivateIpAddresses\":[
    {
      \"Primary\":true,
      \"PrivateIpAddress\":\"10.1.10.100\"
    },
    {
      \"Primary\":false,
      \"PrivateIpAddress\":\"10.1.10.101\"
    }
  ],

プライマリIP動的、セカンダリIP固定で設定する場合

ここまでくれば設定がなんとなく予想できるかと思いますが、プライマリIPをAWS側から動的に割り当てて、セカンダリIPを10.1.10.100で指定するには先程の設定からプライマリIPの設定部分を削除した設定を行います。

プライマリIP固定、セカンダリIP固定で設定する場合の例
  \"PrivateIpAddresses\":[
    {
      \"Primary\":false,
      \"PrivateIpAddress\":\"10.1.10.100\"
    }
  ],

最終的なメタデータ

プライマリIP動的、セカンダリIP固定で設定する場合」で設定した、復元実行用の最終的なメタデータファイル例(metadata.json)を以下に示します。

説明用に見やすくしたNetworkInterfacesの項目は元の1行の記載に戻してください。

metadata.json
{
  "Architecture": "x86_64",
  "CapacityReservationSpecification": "{\"CapacityReservationPreference\":\"open\"}",
  "CreditSpecification": "{\"CpuCredits\":\"standard\"}",
  "DisableApiTermination": "false",
  "EbsOptimized": "false",
  "EnaSupport": "true",
  "HibernationOptions": "{\"Configured\":false}",
  "IamInstanceProfileName": "ec2_role",
  "InstanceInitiatedShutdownBehavior": "stop",
  "InstanceType": "t2.micro",
  "KeyName": "ec2-keypair",
  "Monitoring": "{\"State\":\"disabled\"}",
  "NetworkInterfaces": "[{\"AssociatePublicIpAddress\":false,\"DeleteOnTermination\":true,\"Description\":\"\",\"DeviceIndex\":0,\"Groups\":[\"sg-06d3f4fca2b07b915\"],\"Ipv6AddressCount\":0,\"Ipv6Addresses\":[],\"PrivateIpAddresses\":[{\"Primary\":false,\"PrivateIpAddress\":\"10.1.10.100\"}],\"SubnetId\":\"subnet-0bdb9444b6747e0d6\",\"InterfaceType\":\"interface\",\"Ipv4Prefixes\":[],\"Ipv6Prefixes\":[]}]",
  "Placement": "{\"AvailabilityZone\":\"ap-northeast-1a\",\"GroupName\":\"\",\"Tenancy\":\"default\"}",
  "RequireIMDSv2": "true",
  "RootDeviceType": "ebs",
  "VirtualizationType": "hvm",
  "VpcId": "vpc-0038965ef3ab23888",
  "aws:backup:request-id": "19f9ec92-f9a8-4a5f-9deb-8d790eb346b7"
}

AWS Backup使用ロールへのPassRoleポリシー付与

AWS Backupによる復元実行時、AWS Backupに付与されているIAMロールの権限で復元を行いますが、マネジメントコンソール上から復元するのではなく、今回のようにメタデータファイルを用意してコマンドから復元し、EC2にインスタンスプロファイルでIAMロールも付与する場合、AWS Backupがデフォルトで使用するIAMロールではPassRole権限が無いためEC2へのIAMロール付与に失敗してしまいます。

調査しきれていませんが、マネジメントコンソール上から復元する場合はバックアップイメージのメタデータに付与されているIAMロールがそのまま復元されて使用することからマネジメントコンソール上から復元する場合はPassRole権限が不要なようです。

おそらくメタデータファイルを使用することで、バックアップイメージに付与されているEC2のIAMロールがリセットされ、AWS Backupから再度IAMロールをアタッチする必要があるのではないかと思われるため、コマンドで行う場合はPassRole権限の付与が必要なのだと思います。

AWS Backupが使用しているIAMロールを確認するには、AWS Backupダッシュボードの「バックアッププラン」から「バックアッププラン名」を選択し、「リソースの割り当て」の「IAMロールARN」から確認できます。

AWS Backupデフォルトのロールを使用している場合、ARNはarn:aws:iam::123456789012:role/service-role/AWSBackupDefaultServiceRole123456789012は自分のアカウントID)となるため、今回はデフォルトのロールにインラインポリシーで付与する場合を想定して手順を記載します。(もちろん新たにポリシーを作成して付与してもOK)

AWSBackupDefaultServiceRoleのロールから「許可を追加」→「インラインポリシーを作成」で以下のポリシーを付与してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EC2PassRole",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": ["*"]
        }
    ]
}

説明簡略化のため、リソース指定は「*」としましたが、制限する場合は、EC2に割り当てるIAMロールのARNを指定してください。

AWS Backupによる復元の実行

作成したメタデータファイルを使用し、以下コマンドでAWS Backupから復元します。

AWS Backupのデフォルトロールを使用する方法で以下記載していますが、自分の環境に合わせてロールARNを指定してください。

metadata.jsonファイルを使った復元の実行
aws backup start-restore-job --region [リージョン名] --recovery-point-arn "[復元ポイントARN]" --iam-role-arn "arn:aws:iam::123456789012:role/service-role/AWSBackupDefaultServiceRole" --metadata file://metadata.json

復元が成功すれば、AWS Backupダッシュボードの「ジョブ」→「復元ジョブ」タブのステータスが「完了」となっているはずです。

Monosnap_20240818_201551.png

失敗している場合はメタデータの設定が失敗していたり、IPアドレスが重複していたりするかと思いますので、復元ジョブの結果を確認してください。

おわりに

前回からの続きで、AWS Backupでの復元時にプライベートIPアドレスを割り当てる方法を紹介しました。

今までAWS BackupはAWSマネジメントコンソール上からの復元しか行ったことがありませんでしたが、コマンドから行うと任意のIPアドレスの割り当てなど色々と設定ができる反面、ハマりポイントが多く、しっかり検証しないと使いこなすのは難しいと感じました。

IPアドレス設定以外にもAWS Backupでの復元時に詳細な設定を行いたい場合はEC2のRunInstancesのAPIリファレンス等を参考にメタデータファイルを作成するとできるかもしれませんので、どうしても凝った設定を行いたい方はやってみてください。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1