AWS CLI(Command Line Interface)を使うと、コマンドラインから AWS の複数のサービスを制御する事ができ、スクリプトで自動化することができます。
EC2 上の CentOS7 で yum にてインストールした AWS CLI を使って、MySQL のダンプデータを S3 にバックアップしていましたが、最近(2022年4月以降)エラーで動かなくなってしまいました。
aws
(out) Traceback (most recent call last):
(out) File "/bin/aws", line 19, in <module>
(out) import awscli.clidriver
(out) File "/usr/lib64/python2.7/site-packages/awscli/clidriver.py", line 37, in <module>
(out) from awscli.help import ProviderHelpCommand
(out) File "/usr/lib64/python2.7/site-packages/awscli/help.py", line 24, in <module>
(out) from botocore.docs.bcdoc import docevents
(out) 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 を削除します。
yum remove awscli
(out) Loaded plugins: fastestmirror
(out) Resolving Dependencies
(out) --> Running transaction check
(out) ---> Package awscli.noarch 0:1.14.28-5.el7_5.1 will be erased
(out) --> Finished Dependency Resolution
(out)
(out) Dependencies Resolved
(out)
(out) =============================================================================================================================================================
(out) Package Arch Version Repository Size
(out) =============================================================================================================================================================
(out) Removing:
(out) awscli noarch 1.14.28-5.el7_5.1 @base 3.7 M
(out)
(out) Transaction Summary
(out) =============================================================================================================================================================
(out) Remove 1 Package
(out)
(out) Installed size: 3.7 M
(out) Is this ok [y/N]: y
(out) Downloading packages:
(out) Running transaction check
(out) Running transaction test
(out) Transaction test succeeded
(out) Running transaction
(out) Erasing : awscli-1.14.28-5.el7_5.1.noarch 1/1
(out) Verifying : awscli-1.14.28-5.el7_5.1.noarch 1/1
(out)
(out) Removed:
(out) awscli.noarch 0:1.14.28-5.el7_5.1
(out)
(out) Complete!AWS CLI バージョン 2 のインストール
公式サイトから awscliv2.zip をダウンロードして、手順通りにインストール。
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install
(out) You can now run: /usr/local/bin/aws --version
/usr/local/bin/aws --version
(out) 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/offaws コマンドのパスが通っていなかったので、シンボリックリンクを作成しました。
aws
(out) -bash: /bin/aws: No such file or directory
ln -s /usr/local/bin/aws /usr/bin/aws権限の設定
AWS CLI から AWS のリソースにアクセスするために、IAM で権限を付ける必要があります。
私は設定済みでしたが、新規の場合は公式サイトの手順通りに済ませてください。

IAM のアクセスキーを AWS CLI に登録します。
aws configure
(out) AWS Access Key ID [****************MPLE]: AKIAIOSFODNN7EXAMPLE
(out) AWS Secret Access Key [****************EKEY]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
(out) Default region name [ap-northeast-1]: ap-northeast-1
(out) Default output format [text]: text※以前の設定が /root/.aws/config と /root/.aws/credentials に残っていたので、私の状況のように一度設定が終わっていて、切り替えの場合はこの手順は不要かもしれません。
後片付け
rm awscliv2.zip -f
rm aws -frまとめ
最初の導入時に苦労した印象がありましたが、入れ替えは yum でアンインストールして、ダウンロードしたファイルをインストールし直すだけの簡単な作業でした。
実際のコード
MySQL のバックアップを書き出して、直後に S3 にもコピーを取るには次の様にします。
#!/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 --deleteMySQL の自動バックアップは下記のサイトのものを使わせて頂いております。パスの追加と最後に S3 に同期する行を追加しています。あとは Cron で定期実行すれば完成です。


コメント