とあるAWSアカウントにあるEC2インスタンスを別アカウントに移行したいという思いがあり、移行を実践してみた。
業務ではまだ行ったことがないが、実際に別アカウントに同じEC2インスタンスを起動したいと思う人はいるのではと思うため、誰かの力になれば嬉しい。
対象インスタンスの概要
別記事で紹介しているが、自動車学校の予約の空き状況を自動通知するためのPythonプログラムをEC2インスタンス上で起動していた。そのEC2インスタンスはAWS 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つだけになった。