AWS CLI(Command Line Interface)を使うと、コマンドラインから AWS の複数のサービスを制御する事ができ、スクリプトで自動化することができます。
EC2 上の CentOS7 で yum にてインストールした AWS CLI を使って、MySQL のダンプデータを S3 にバックアップしていましたが、最近(2022年4月以降)エラーで動かなくなってしまいました。
1 2 3 4 5 6 7 8 9 | # aws Traceback (most recent call last): File "/bin/aws", line 19, in <module> import awscli.clidriver File "/usr/lib64/python2.7/site-packages/awscli/clidriver.py", line 37, in <module> from awscli.help import ProviderHelpCommand File "/usr/lib64/python2.7/site-packages/awscli/help.py", line 24, in <module> from botocore.docs.bcdoc import docevents ImportError: cannot import name docevents |
バックアップの根幹部分に関わるので、AWS の公式で配布しているインストーラーで入れなおして対応しましたので、記録しておきます。
環境
- AWS EC2 アジアパシフィック (東京) リージョン
- CentOS Linux release 7.9.2009 (Core)
- AWSCLI 1.14.28-5.el7_5.1(CentOS7 の Base リポジトリから yum でインストール)
再設定の手順
AWS CLI のアンインストール
まずは yum でインストールした AWS CLI を削除します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | # yum remove awscli Loaded plugins: fastestmirror Resolving Dependencies --> Running transaction check ---> Package awscli.noarch 0:1.14.28-5.el7_5.1 will be erased --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================================= Package Arch Version Repository Size ============================================================================================================================================================= Removing: awscli noarch 1.14.28-5.el7_5.1 @base 3.7 M Transaction Summary ============================================================================================================================================================= Remove 1 Package Installed size: 3.7 M Is this ok [y/N]: y Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction Erasing : awscli-1.14.28-5.el7_5.1.noarch 1/1 Verifying : awscli-1.14.28-5.el7_5.1.noarch 1/1 Removed: awscli.noarch 0:1.14.28-5.el7_5.1 Complete! |
AWS CLI バージョン 2 のインストール
公式サイトから awscliv2.zip をダウンロードして、手順通りにインストール。
1 2 3 4 5 6 | # curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" # unzip awscliv2.zip # ./aws/install You can now run: /usr/local/bin/aws --version # /usr/local/bin/aws --version aws-cli/2.6.3 Python/3.9.11 Linux/3.10.0-1160.42.2.el7.x86_64 exe/x86_64.centos.7 prompt/off |
aws コマンドのパスが通っていなかったので、シンボリックリンクを作成しました。
1 2 3 | # aws -bash: /bin/aws: No such file or directory # ln -s /usr/local/bin/aws /usr/bin/aws |
権限の設定
AWS CLI から AWS のリソースにアクセスするために、IAM で権限を付ける必要があります。
私は設定済みでしたが、新規の場合は公式サイトの手順通りに済ませてください。
IAM のアクセスキーを AWS CLI に登録します。
1 2 3 4 5 | # aws configure AWS Access Key ID [****************MPLE]: AKIAIOSFODNN7EXAMPLE AWS Secret Access Key [****************EKEY]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY Default region name [ap-northeast-1]: ap-northeast-1 Default output format [text]: text |
※以前の設定が /root/.aws/config と /root/.aws/credentials に残っていたので、私の状況のように一度設定が終わっていて、切り替えの場合はこの手順は不要かもしれません。
後片付け
1 2 | # rm awscliv2.zip -f # rm aws -fr |
まとめ
最初の導入時に苦労した印象がありましたが、入れ替えは yum でアンインストールして、ダウンロードしたファイルをインストールし直すだけの簡単な作業でした。
実際のコード
MySQL のバックアップを書き出して、直後に S3 にもコピーを取るには次の様にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #!/bin/bash PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin # バックアップ先ディレクトリ BACKDIR=/backup/mysql # MySQLrootパスワード ROOTPASS=xxxxxxxx # バックアップ先ディレクトリ再作成 rm -rf $BACKDIR mkdir -p $BACKDIR # データベース名取得 DBLIST=`ls -p /var/lib/mysql | grep / | tr -d /` # データベースごとにバックアップ for dbname in $DBLIST do [ $dbname = "performance_schema" ] && continue table_count=`mysql -u root -p$ROOTPASS -B -e "show tables" $dbname|wc -l` [ $table_count -ne 0 ] && mysqldump --events -u root -p$ROOTPASS $dbname > $BACKDIR/$dbname.sql | logger -t mysqldump done # S3 Sync aws s3 sync $BACKDIR s3://example-bucket/mysql/ --exact-timestamps --delete |
MySQL の自動バックアップは下記のサイトのものを使わせて頂いております。パスの追加と最後に S3 に同期する行を追加しています。あとは Cron で定期実行すれば完成です。
コメント