amazon-ec2-icon

AWS

EC2(Amazon Linux 2023)を別のAWSアカウントに移行する方法

とあるAWSアカウントにあるEC2インスタンスを別アカウントに移行したいという思いがあり、移行を実践してみた。

業務ではまだ行ったことがないが、実際に別アカウントに同じEC2インスタンスを起動したいと思う人はいるのではと思うため、誰かの力になれば嬉しい。

「サボチン」です。AWSパートナー企業でエンジニアとして働いています。
お問い合わせ自己紹介

対象インスタンスの概要

別記事で紹介しているが、自動車学校の予約の空き状況を自動通知するためのPythonプログラムをEC2インスタンス上で起動していた。そのEC2インスタンスはAWS Organizationの組織内にのアカウントに作成されたインスタンスで、そのアカウントは無料枠が切れていた。

自動車学校の予約の空き状況を自動通知するためのPythonプログラム解説
Organizationで無料枠が使えなかったお話

将来的にOrganizationは削除し、そのアカウントも閉鎖する予定だったためこれを機に別アカウントに移行したいと考え今回の以降作業を実施することになった。

次から実際にどのように移行したのかを紹介していく。

移行手順

ゴールは、移行元アカウントに存在するEC2インスタンスを移行先インスタンスに移行すること。

以下手順で移行を実施する。基本的な手順で済むため特に難しい知識・技術が必要になることはないと思う。

手順

  • [ 手順1 ] 移行元アカウントのEC2インスタンスのAMIを取得
  • [ 手順2 ] 移行元アカウントで取得したAMIを移行先アカウントに共有する
  • [ 手順3 ] 移行先アカウントで共有されたAMIからEC2インスタンスを起動する
  • [ 手順4 ] 移行先アカウントで動作確認をする

[ 手順1 ] 移行元アカウントのEC2インスタンスのAMIを取得

早速、移行元アカウントのEC2インスタンスのAMIを取得していく。AMIを取得するために、現在起動しているEC2インスタンスを停止する。

起動中のEC2インスタンスからAMIを取得することも可能だが、[再起動しない] オプションを選択した場合、作成されたイメージのファイルシステムの整合性は保証されないこととなっている。

移行元アカウントでの作業

EC2インスタンスの停止

対象のEC2インスタンスにチェックを入れ、インスタンスの停止をクリック

AMIを作成

[停止済み] となっていることを確認し、[イメージとテンプレート > イメージの作成] をクリック

[イメージ名]と[イメージの説明]を入力しの上、[イメージを作成]をクリック

[ 手順2 ] 移行元アカウントで取得したAMIを移行先アカウントに共有する

移行元アカウントでの作業

取得したAMIを移行先にアカウントへ共有する作業を行う。

まずは作成したAMIにチェックを入れ、[AMI許可を編集] をクリックする。

[AMI の可用性]は「プライベート」を選択し、[アカウント ID の追加] から移行先アカウントIDを入力する。以下のような設定になっていれば問題ないため[変更を保存]をクリック。

移行先アカウントで確認

まずはAMIの一覧画面に遷移する。下画像では「プライベートイメージ」となっている箇所が恐らく「自己所有」になっているため「プライベートイメージ」に変更する。変更すると移行元アカウントから共有されたAMIが表示される。

[ソース] や [所有者] には移行元アカウントIDが表示されている。

[ 手順3 ] 移行先アカウントで共有されたAMIからEC2インスタンスを起動する

移行先アカウントでの作業

AMIからEC2インスタンスを起動

先ほど確認した共有されたAMIを選択し、右上の[AMIからインスタンスを起動」] をクリック。

お馴染みのEC2インスタンスを起動する画面が表示されるため以下設定値を参考に入力しEC2インスタンスを起動する。表にも記載があるが、Amazon マシンイメージ(AMI)は共有されたAMIが選択されているため特に変更するなどの設定は不要。

項目設定値
名前任意の名前
Amazon マシンイメージ (AMI)「カタログからのAMI」に共有されたAMIがあるため操作不要
インスタンスタイプt2.micro
キーペア任意のキーペア
VPC任意のVPC
サブネットパブリックサブネット
パブリックIPの自動割り当て有効化
セキュリティグループタイプ:SSH、ソースタイプ:自分のIP
今回は80,443も許可
ストレージgp3、8GiB
※移行元のストレージと同様

[ 手順4 ] 移行先アカウントで動作確認をする

正常にEC2インスタンスが起動できたためSSH 接続して移行元アカウントのEC2インスタンスにあったファイルの確認、プログラム実行のための必要設定を行う。

移行先アカウントでの作業

SSH接続してファイルを確認

元からあったEC2インスタンス内にあったファイルが確認できた。

$ ll
合計 84
drwxr-xr-x. 2 ec2-user ec2-user    24  4月 13 15:16 image
-rwxr-xr-x. 1 ec2-user ec2-user  3895  4月 15 20:21 main.py
-rw-r--r--. 1 ec2-user ec2-user 79522  4月 13 22:29 page.html

プログラム実行に必要なAWS リソース作成

Pythonコードでパスワードなどの情報をのSystemsManager パラメーターストアから取得していたため、移行先アカウントのEC2インスタンスでは正常にコードは実施できない状態となっていた。

$ python3 main.py
An error occurred: Unable to locate credentials

各種権限を調整することで移行先アカウントのEC2インスタンスから移行元アカウントのSystemsManager パラメーターストアからパスワードなどを取得できるとは思うが、移行元アカウントは今後閉鎖する予定のため移行先アカウントで各種設定をする。今回は以下設定を行うことで正常にPythonのプログラムを実行できた。

  • SystemsManager パラメーターストアにパスワードなどの情報を設定
  • IAMロールを作成しEC2インスタンスにアタッチ(SystemsManager パラメーターストアを取得するための権限を付与)
$ python3 main.py
予約サイトへアクセス
入力
ログインボタンをクリック
処理終了

cronの設定確認

移行元アカウントのEC2インスタンスでcron設定をして1分毎に予約サイトをチェックし、LINEに通知するようにしていたため、念のためcronの稼働状況確認

$ sudo systemctl status crond
● crond.service - Command Scheduler
     Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; preset: enabled)
     Active: active (running) since Sat 2024-06-01 13:22:29 JST; 45min ago
   Main PID: 2154 (crond)
      Tasks: 1 (limit: 1114)
     Memory: 1.4M
        CPU: 1.763s
     CGroup: /system.slice/crond.service
             └─2154 /usr/sbin/crond -n

LINE通知を確認

下画像は移行元・移行先アカウントの両方でEC2インスタンスを起動している状況。同じ時間に通知が2つあるため、移行先アカウントのEC2インスタンスからも通知が届いていることが確認できた。

なお、移行元アカウントのEC2インスタンスを停止すると通知が1つだけになった。

-AWS
-