AWSCLIを利用してMySQLをS3へ定期バックアップする

1. AWSCLIのセットアップ

[bash gutter=”false”]
$ wget https://s3.amazonaws.com/aws-cli/awscli-bundle.zip
$ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
[/bash]

公式サイトの説明はこちら Getting Set Up with the AWS Command Line Interface – AWS Command Line Interface

インストールの確認

[bash gutter=”false”]
$ /usr/local/bin/aws –version
aws-cli/1.3.12 Python/2.6.6 Linux/2.6.32-279.5.1.el6.x86_64
[/bash]

AWSのアクセス情報などを設定

[bash gutter=”false”]
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: ap-northeast-1
Default output format [None]: json
[/bash]

デフォルトのリージョンは東京を指定しています。

コマンドを実行して設定を確認

[bash gutter=”false”]
# aws s3 ls
2014-04-04 13:13:07 mysql-app-backup
2014-05-21 13:13:07 wp-backup
[/bash]

上記は、s3のバケット一覧を取得するコマンドです。

バックアップスクリプトを作成

以下は、cronに登録するシェルスクリプト。
mysqldumpで対象データベースのバックアップを作成し、S3バケットにsyncします。

[bash title=”backup.sh”]
#!/bin/sh

THEDB="DATABASE-NAME"
THEDBUSER="DATABASE-USER"
THEDBPW="DATABASE-USER-PASSWORD"
THEDATE=`date +%d%m%y%H%M`

mysqldump -u $THEDBUSER -p${THEDBPW} $THEDB | gzip > /var/www/_backups/dbbackup_${THEDB}_${THEDATE}.bak.gz

find /var/www/_backups/db* -mtime +5 -exec rm {} \;

/usr/local/bin/aws s3 sync /var/www/_backups s3://BUCKET-NAME –delete
[/bash]

Cronにシェルスクリプトを登録

[bash gutter=”false”]
$ crontab -e
[/bash]

[text gutter=”false”]
0 3 * * * /path/to/backup.sh > /dev/null 2>&1
[/text]

以上で完了です。

参考: Automating Backups to Amazon S3 | trepmal*

S3+CloudFrontでWebサイトを公開するには

S3に置いたファイルをCloudFrontでWebサイトとして公開する手順を調べたメモです。

調べた背景は、S3だけでスタティックなWebサイトを公開を試した場合に、S3だけだとバケット名とドメイン名が同じである必要がある。
しかし、S3のバケット名はAWS全ユーザでユニークである必要があるので、ドメイン名がすでに使われていたりする可能性もある。
その場合は、CloudFrontを利用するとバケット名に依存せずドメインを当てることができるということで、その手順を確認しました。

1. Static Website Hosting >> Enable website hosting を有効にする

Webサイト用のファイルを含むS3バケットのプロパティを開いて Static Website Hosting の Enable website hosting を選択して Index Document を指定し保存します。
s3-bucket-properties

2. CloudFront Distributionを作成

CloudFrontを開いて、[Create Distribution]ボタンから作成します。

Web を選択
cloudfront-create-distribution-1

Origin Settings >> Origin Domain Name でバゲットを選択すると Origin ID もセットされます。
cloudfront-create-distribution-2

Default Cache Behavior Settings はひとまず今回はデフォルト設定で次に進みます。

Distribution Settings の項目は、Alternate Domain Names (CNAMEs) にDNSに設定するCNAMEレコード名を、Default Root Object にindex.htmlを指定します。
cloudfront-create-distribution-3
保存して作成完了。

3. DNSレコードを追加

cloudfront-distoribution
Alternate Domain Names (CNAMEs) の値 “cf.co-meeting.com” をレコード名に、Domain Name をCNAMEの値として設定します。以下の設定画面は Dozens の例です。
dozens

CloudFrontのデプロイにはしばらく時間がかかります。しばらく待って設定した cf.co-meeting.com にアクセスすると、S3に保存されている index.html が表示されることを確認できます。

参考:
Using Alternate Domain Names (CNAMEs) – Amazon CloudFront

AWS CLIをmacOS Sierra 10.12.6にインストール

AWS CLIを macOS Sierra 10.12.6 にpipでインストールする手順のメモです。

この記事は、Yosemite用に書いてあったものを再確認して更新しました(2017.9.30)。

公式ドキュメント: AWS Command Line Interface のインストール – AWS Command Line Interface

Pythonのバージョンを確認

$ python --version
Python 2.7.13

Pythonのバージョンは「Python 2 version 2.6.5+ or Python 3 version 3.3+」ですので問題ありません。

pipはeasy_installでインストールできます。

$ sudo easy_install pip

pipでawscliをインストールします。

$ sudo pip install awscli

インストール完了、aws打つとヘルプが表示されます。

$ aws
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
aws: error: too few arguments

アクセスキー・シークレットの設定は、aws configureコマンドで設定できます。

$ aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: YYYYYYYYYYYYYYYYYYYYYYYYY
Default region name [None]: us-east-1
Default output format [None]: 

また、以下のようにaws.cfgファイルを作成し、それをコマンド実行時の環境変数で指定することもできます。

[default]
aws_access_key_id=XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYY
region=us-east-1

例えば、S3のバケットの一覧をしてみる場合は以下のように指定できます。

$ export AWS_CONFIG_FILE=./aws.cf
$ aws s3 ls
2011-04-06 01:15:49 redmine_backup
2014-01-05 23:14:22 wp-backup-hrendoh

AWS CLIの各種コマンドのリファレンスは、AWS CLIを参照できます。