レンタルサーバーの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ファイルをインストール

https://docs.aws.amazon.com/solutions/latest/instance-scheduler/scheduler-cli.html
「Download」をクリック

自分のPCにダウンロードしたら展開しておく(使いやすいようにユーザーディレクトリへ移動)

自分のPCからEC2インスタンスにSSH接続(ECインスタンスで以前作成した鍵を使う)

ssh -i"C:\Users\ユーザー名\key-name.pem" ec2-user@**.**.***.***(Elastic IPアドレス)

EC2内に空のscheduler-cliディレクトリと、その中にscheduler_cliディレクトリを事前に作成

自分のPCに戻りファイルをEC2インスタンスへ転送

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

EC2インスタンスにSSH接続

ssh -i"C:\Users\ユーザー名\key-name.pem" ec2-user@**.**.***.***

仮想環境の有効化

source myenv/bin/activate

scheduler-cliへ移動

cd scheduler-cli

pythonコマンドでインストール

python setup.py install

Instance Scheduler のスタックを新規作成

検索窓から「CloudFormation」と検索してもスタック作成ページに遷移しますが、テンプレートが必要なので下記ページにまずはアクセスして、「Launch Solution」ボタンをクリック。

https://docs.aws.amazon.com/solutions/latest/instance-scheduler/deployment.html#step1

ログイン認証を求められたら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 --nam
e jp-office-hours --region ap-northeast-1 --periods office-hours --timezone Asia/Tokyo

スケジュールのタグ付け

https://qiita.com/yuskubo/items/acc8f8872f138bb4d914
タグ付けできたら、AWSコンソールからは添付画像のようになる

GoogleデータポータルでRDSにアクセスしDB情報を取得する

レポートを新規作成し、MySQLデータベースに接続

MySQLを選択

添付画像が出てきたら、

  • ホスト名またはIP・・・該当のRDS DBのエンドポイントを入力
  • ポート(任意指定)・・・空欄のままでOK
  • データベース・・・該当DB名を入力
  • ユーザー名・・・DB作る時に設定した「admin」と入力
  • パスワード・・・DB作る時に設定したパスワードを入力

チェックボックスの「SSLを有効にする」は未チェックのままで、「認証」ボタンをクリック

テーブルの「表」に該当テーブル一覧が表示されれば成功。
選択して「追加」ボタンからレポートに追加できるようになる。