レンタルサーバーのDB/定期実行PythonファイルをAWSに移行する②
前回
前回: レンタルサーバーのDB/定期実行PythonファイルをAWSに移行する①からの続き。
前回行ったことは、
- Amazon EC2 インスタンスを踏み台ホストとして使用して、ローカルマシンからプライベート Amazon RDS DB インスタンスに接続する
今回
- 固定IPアドレスを設定する
- EC2インスタンスでPythonファイルを実行する
- Pythonの定期実行
- コスト削減のため必要時のみインスタンスを起動する
- GoogleデータポータルでRDSにアクセスしDB情報を取得する
固定IPアドレスを設定する
Elastic IP アドレス
EC2インスタンスは停止して開始し直す度にIPv4 DNS が変更してしまうので、固定IPアドレスであるElastic IPアドレスを作って割り当てる(1つまで無料)。
インスタンスに割り当てる他にネットワークワークインターフェイスというものに接続も可能。今回はインスタンスに紐付ける。下記を参考に設定。
Elastic IP アドレスをインスタンスまたはネットワークインターフェイスに関連付ける
EC2インスタンスでPythonファイルを実行
EC2 インスタンス内に環境をつくる
EC2インスタンスにSSH接続をしてから実行
git を入れて 該当リポジトリを clone する
yumを最新の状態にする
sudo yum update
git をインストール
sudo yum install git
git のバージョンを確認
git version
確認が取れたら、通常のcloneの要領で、該当リポジトリをcloneする。
pipで仮想環境を用意し必要モジュールをインストールする(該当Pythonファイルで必要なもの)
sudo yum install python3 -y
python3 -m venv myenv
source myenv/bin/activate
pip install mysql-connector-python
pip install requests
pip install bs4
pip install python-dotenv
pip install lxml
Pythonファイルを実行してみる
Python *****(ファイル名).py
RDS DB を確認
EC2インスタンスでMySQLにアクセスするには、管理者を「admin」で、該当のRDS DBのエンドポイントをコマンド入力
mysql -u admin -p -h *******.*******.ap-northeast-1.rds.amazonaws.com(RDS DBのエンドポイント)
パスワードは設定したものを入力する。
EC2 に置いている Python ファイルの定期実行
下記を見ながら設定する
AWS EC2 と RDS で 定期実行(CRON)
必要時のみインスタンスを起動する
AWSの参考記事: サーバーを指定した期間で停止する「AWS Instance Scheduler」を試してみる
Qiita参考記事: 開発用AWS RDSインスタンスを Instance Schedulerを使って自動起動・停止してコスト削減する
AWSのインスタンススケジューラーを使う場合はAWS CLIの認証情報が必要なのでそちらの設定を先に行う。
AWS CLIバージョン2をインストール
EC2 インスタンス内で
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
AWS CLI の設定 / aws configure
事前に作成済のアクセスキーのIDとシークレットアクセスキーの確認をしておく。
EC2 インスタンス内で登録する。
参考記事: AWS CLIのインストールから初期設定メモ
aws configure
AWS Access Key ID [None]: ********************
AWS Secret Access Key [None]: ****************************************
Default region name [None]: ap-northeast-1
Default output format [None]: json
Instance Scheduler CLIのインストール
zipファイルをインストール
自分のPCにダウンロードしたら展開しておく(使いやすいようにユーザーディレクトリへ移動)
EC2内に空のscheduler-cliディレクトリと、その中にscheduler_cliディレクトリを事前に作成
自分のPCに戻りファイルをEC2インスタンスへ転送
ec2-user@...(Elastic IPアドレス)・・・ec2-user@の後に作成したElastic IPアドレスを入力するので要注意。
scp -i "C:\Users\ユーザー名\key-name.pem" "C:\Users\ユーザー名\scheduler-cli\instance-scheduler-cli-runner.py" ec2-user@**.**.***.***:/home/ec2-user/scheduler-cli
scp -i "C:\Users\ユーザー名\key-name.pem" "C:\Users\ユーザー名\scheduler-cli\setup.py" ec2-user@**.**.***.***:/home/ec2-user/scheduler-cli
scp -i "C:\Users\ユーザー名\key-name.pem" "C:\Users\ユーザー名\scheduler-cli\scheduler_cli\__init__.py" ec2-user@**.**.***.***:/home/ec2-user/scheduler-cli/scheduler_cli
scp -i "C:\Users\ユーザー名\key-name.pem" "C:\Users\ユーザー名\scheduler-cli\scheduler_cli\__main__.py" ec2-user@**.**.***.***:/home/ec2-user/scheduler-cli/scheduler_cli
scp -i "C:\Users\ユーザー名\key-name.pem" "C:\Users\ユーザー名\scheduler-cli\scheduler_cli\scheduler_cli.py" ec2-user@**.**.***.***:/home/ec2-user/scheduler-cli/scheduler_cli
自分のPCからEC2インスタンスにSSH接続(ECインスタンスで以前作成した鍵を使う)
ssh -i "C:\Users\ユーザー名\key-name.pem" ec2-user@**.**.***.***(Elastic IPアドレス)
仮想環境の有効化
source myenv/bin/activate
scheduler-cliへ移動
cd scheduler-cli
pythonコマンドでインストール
python setup.py install
Instance Scheduler のスタックを新規作成
検索窓から「CloudFormation」と検索してもスタック作成ページに遷移しますが、テンプレートが必要なので下記ページにまずはアクセスして、「Launch Solution」ボタンをクリック。
ログイン認証を求められたらIAMロールでログインすると、
テンプレートが入った状態でのスタック作成ページに遷移する。
スタックの詳細を設定
デフォルト値から変更したものは下記
- スタックの名前:EC2-RDS-InstancesScheduler(わかりやすい名前を付ける)
- Service(s) to schedule:Both (EC2, RDS, Both と、設定したいものが選べる)
- Create RDS instance snapshot:No (バックアップ用にスナップショットを取るかどうか)
- Region:ap-northeast-1 (東京なので)
- Default time zone:Asia/Tokyo
- Enable CloudWatch Logs:Yes (監視用のログ設定)
- Log retention days:7 (ログの保存期間)
- Started tags:state=started
- Stopped tags:state=stopped
scheduler CLI で起動時間の設定
- オペレーションの時間(営業時間)の開始を6:30、終了を8:30に設定
- リージョンは東京の「ap-northeast-1」
- タイムゾーンは「Asia/Tokyo」
scheduler-cli update-period --stack EC2-RDS-InstancesScheduler --region ap-northeast-1 --name office-hours --begintime 06:30 --endtime 08:30 --weekdays mon-fri
scheduler-cli create-schedule --stack EC2-RDS-InstancesScheduler --name jp-office-hours --region ap-northeast-1 --periods office-hours --timezone Asia/Tokyo
スケジュールのタグ付け
GoogleデータポータルでRDSにアクセスしDB情報を取得する
レポートを新規作成し、MySQLデータベースに接続
MySQLを選択
添付画像が出てきたら、
- ホスト名またはIP・・・該当のRDS DBのエンドポイントを入力
- ポート(任意指定)・・・空欄のままでOK
- データベース・・・該当DB名を入力
- ユーザー名・・・DB作る時に設定した「admin」と入力
- パスワード・・・DB作る時に設定したパスワードを入力
チェックボックスの「SSLを有効にする」は未チェックのままで、「認証」ボタンをクリック
テーブルの「表」に該当テーブル一覧が表示されれば成功。
選択して「追加」ボタンからレポートに追加できるようになる。
Discussion