AWS CloudFormation で RDS (SQLServer) インスタンスを作成してみる

# ０．はじめに

ずっと AWS CloudFormation 使いたいなと思っていたので、
使ってみました。

# １．事前準備

1. RDS のサブネットグループを作成しておく。
<br><br>
1. セキュリティグループを作成しておく。
<br><br>

# ２．AWS CloudFormation で RDS(MSSQL) を作成

1. AWS CloudFormation のマネジメントコンソールを開く。
   * [CloudFormation マネジメントコンソール](https://ap-northeast-1.console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks?filter=active)
<br><br>
1. 「スタックの作成」ボタンを押下する。
    * ![0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/c11a0a96-379b-87ad-42f0-c8f8aaebca62.jpeg)
<br><br>
1. 「スタックの作成 - テンプレートの選択」画面が表示されるので、「テンプレートの選択」→「テンプレートを Amazon S3 にアップロードする」をチェック、以下の json ファイルをアップロードし、「次へ」ボタンを押下する。
    * ![0002.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/9df62509-8d9b-3437-3f28-726837e1042f.jpeg)

    ```json:GS-RDS-MSSQL-from-bak.template
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "ProjectName": {
            "Type": "String",
            "Default": "[プロジェクト名]"
        },
        "DbSubnetGroupName": {
            "Type": "String",
            "Default": "[作成しておいたサブネットグループ名]"
        },
        "VpcSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup::Id",
            "Default": "[作成しておいたセキュリティグループのID]"
        }
    },
    "Resources": {
        "DbInstance": {
            "Type": "AWS::RDS::DBInstance",
            "Properties": {
                "Engine": "sqlserver-ex",
                "DBInstanceClass": "db.t2.micro",
                "AllocatedStorage": "20",
                "StorageType": "gp2",
                "DBInstanceIdentifier": "[DBインスタンス名]",
                "MasterUsername": "[ユーザーID]",
                "MasterUserPassword": "[パスワード]",
                "DBSubnetGroupName": {
                    "Ref": "DbSubnetGroupName"
                },
                "PubliclyAccessible": true,
                "AvailabilityZone": "ap-northeast-1a",
                "VPCSecurityGroups": [
                    {
                        "Ref": "VpcSecurityGroup"
                    }
                ],
                "CopyTagsToSnapshot": true,
                "BackupRetentionPeriod": 7,
                "Tags": [
                    {
                        "Key": "[タグの名前]",
                        "Value": "[タグの値]"
                    }
                ]
            },
            "DeletionPolicy": "Snapshot"
        }
    }
}
    ```

1. 「スタックの作成 - 詳細の指定」画面が表示されるので、以下の項目を入力し、「次へ」ボタンを押下する。
    * スタック名称 : ※任意
<br><br>
    * ![0003.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/9779bda6-e84a-dda0-8fda-1b3e811a1104.jpeg)
<br><br>
1. 「スタックの作成 - オプション」画面が表示されるので、「次へ」ボタンを押下する。
    * ![0004.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/ad71ac69-3ce9-d0e2-d7f2-cf6a437adb6b.jpeg)
<br><br>
1. 「スタックの作成 - 確認」画面が表示されるので、「作成」ボタンを押下する。
    * ![0005.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/b6f7aca6-a6d8-0d10-dff1-494933929af3.jpeg)
<br><br>
1. スタックの一覧が表示されるので、作成したスタックの状況を確認します。また RDS のマネジメントコンソールも開き、作成する RDS インスタンスの状況を確認します。
    * ![0006-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/a6c0d2a4-ab12-c514-0652-200890cae02f.jpeg)
<br><br>
    * ![0006-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/11cd7968-2e29-cd45-197f-ae687c2bd68a.jpeg)
<br><br>
1. しばらくすると、作成が完了します。
    * ![0007-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/7d7e8e8f-52b6-6029-f540-add007c495d4.jpeg)
<br><br>
    * ![0007-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/bbdc61d5-7344-ed52-9a48-cd0679983181.jpeg)

# ９９．ハマりポイント

* 結構、SQLServer の情報が少なかったので、ちょっと調べたりしました。
<br><br>
* 以下のサイトのサンプルを参考にさせて頂きました。
    * [CloudFormationでRDS\(MySQL\)を作成する\(0からの作成とスナップショットからの作成\) \| cloudpack\.media](https://cloudpack.media/12633)
    * [CloudFormationをいじる RDS編 \- おぼえがきつめあわせ](http://no1497.hatenadiary.jp/entry/2017/04/09/220128)
    * [AWS\(Amazon Web Services\) \- cloudformationにてELBを作成するもロードバランシングしたいEC2インスタンスと異なるVPCに作成されてしまう\(73477\)｜teratail](https://teratail.com/questions/73477)
    * [amazon web services \- AWS RDS Cloud formation template for SQL Server \- Stack Overflow](https://stackoverflow.com/questions/38358522/aws-rds-cloud-formation-template-for-sql-server)
    * [amazon web services \- Creating SQL RDS instance in CloudFormation \- Stack Overflow](https://stackoverflow.com/questions/18435803/creating-sql-rds-instance-in-cloudformation)
    * [SQL Server Native Backup and Restore in Amazon RDS](https://www.mssqltips.com/sqlservertip/5041/sql-server-native-backup-and-restore-in-amazon-rds/)
<br><br>
* サンプルで一通り確認した後は、以下のサイトからパラメータの微調整をしたりしました。
    * [AWS::RDS::DBInstance \- AWS CloudFormation](http://docs.amazonaws.cn/en_us/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html)

# ＸＸ．まとめ

とりあえず使ってみたかったので、
ちゃんと作成されてよかったです。

AWS のリソースのみだけではなく、
それ以外のリソースや OS 内部の設定など、
そういった設定も必要な場合での CloudFormation の使い方ってどうなるんでしょうかね？

その辺も今後試せればと思います。