share facebook facebook2 twitter menu hatena pocket slack

2015.07.07 TUE

CloudFormationでRDS(MySQL)を作成する(0からの作成とスナップショットからの作成)

鈴木 宏康

WRITTEN BY鈴木 宏康

最初は0からRDS(MySQL)を作成して、ユーザーやデータベースを作り、
初期データをインポートしてからスナップショットを取り、その後は、
スナップショットからRDSを作成するって場合があると思います。

特にCloudFormationで環境を作成したり削除したりする場合は、
最初に上記の手順を実施するとが多いと思います。

0からRDS(MySQL)を作るCloudFormationを作るテンプレートは、こんな感じです。

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "ProjectName": {
            "Type": "String",
            "Default": "suzlab"
        },
        "DbSubnetGroupName": {
            "Type": "String",
            "Default": "xxxxxxxx"
        },
        "VpcSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup::Id",
            "Default": "sg-yyyyyyyy"
        }
    },
    "Resources": {
        "DbInstance": {
            "Type": "AWS::RDS::DBInstance",
            "Properties": {
                "Engine": "MySQL",
                "AllocatedStorage": "5",
        "MasterUsername": "root",
                "DBInstanceClass": "db.t2.micro",
                "DBSubnetGroupName": { "Ref": "DbSubnetGroupName" },
                "DBInstanceIdentifier": { "Ref": "ProjectName" },
                "VPCSecurityGroups": [ { "Ref": "VpcSecurityGroup"} ],
                "MasterUserPassword":  { "Fn::Join" : [ "", [
                    { "Ref": "ProjectName" },
                    "!Z3"
                ] ] }
            },
        "DeletionPolicy": "Snapshot"
        }
    }
}

ポイントは

"DeletionPolicy": "Snapshot"

を付けることで、スタックを削除したときにRDSのスナップショットが自動的に
作成されるようにしています。

作成したRDS(MySQL)に対して、下記のようにユーザーとデータベースを作成します。

CREATE DATABASE xxxxxxxx DEFAULT CHARACTER SET utf8;
CREATE USER xxxxxxxx_user IDENTIFIED BY 'xxxxxxxx_pass';
GRANT ALL ON xxxxxxxx.* TO xxxxxxxx_user;

初期データのインポートは、こんな感じです。

mysql -u xxxxxxxx_user -p -h xxx.xxx.xxx.xxx xxxxxxxx < dump.sql
view rawダンプをMySQLにインポートするコマンド.sh

この状態でスタックを削除すると、上述の通りスナップショットが作成されます。

このスナップショットを利用してRDSを作成するテンプレートです。

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "ProjectName": {
            "Type": "String",
            "Default": "suzlab"
        },
        "DbSubnetGroupName": {
            "Type": "String",
            "Default": "xxxxxxxx"
        },
        "VpcSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup::Id",
            "Default": "sg-yyyyyyyy"
        }
    },
    "Resources": {
        "DbInstance": {
            "Type": "AWS::RDS::DBInstance",
            "Properties": {
                "AllocatedStorage": "5",
                "DBInstanceClass": "db.t2.micro",
                "DBSnapshotIdentifier": "xxxxxxxx-snapshot-dbinstance",
                "DBSubnetGroupName": { "Ref": "DbSubnetGroupName" },
                "DBInstanceIdentifier": { "Ref": "ProjectName" },
                "VPCSecurityGroups": [ { "Ref": "VpcSecurityGroup"} ],
                "MasterUserPassword":  { "Fn::Join" : [ "", [
                    { "Ref": "ProjectName" },
                    "!Z3"
                ] ] }
            },
            "DeletionPolicy": "Snapshot"
        }
    }
}

0からRDS(MySQL)を作成する場合は、テンプレートに

"Engine": "MySQL",
"MasterUsername": "root",

を指定していましたが、スナップショットから作成する場合は、
これらのパラメータのかわりにスナップショットの指定をしています。

"DBSnapshotIdentifier": "xxxxxxxx-snapshot-dbinstance",

元記事はこちら

CloudFormationでRDS(MySQL)を作成する(0からの作成とスナップショットからの作成)

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。