CloudFormationでAurora Serverless v1作成
Aurora ServerlessはAWSが提供するマネージデータベースサービスです。
Amazon Aurora Serverless は、Amazon Aurora のオンデマンドの Auto Scaling 設定です。アプリケーションニーズに応じて、自動的に起動、シャットダウン、および容量をスケールアップまたはスケールダウンします。 データベース容量を管理することなく、AWS でデータベースを実行できます。
Amazon Aurora Serverless
今回はCloudFormationでAurora Serverless v1を構築し、EC2インスタンスからアクセスすることを目標とします。
なおAurora Serverlessには2つのバージョンがありますが、今回はv1を対象とします。
Aurora Serverless v2に関しては、以下のページをご確認ください。
構築する環境
VPC内に3つのサブネットを作成します。
いずれもインターネットにアクセス不可なプライベートサブネットとします。
Aurora Serverlessを作成し、AZが異なる2つのサブネットと関連付けます。
MySQLタイプの最新のバージョンを指定します。
EC2インスタンスを作成します。
Aurora Serverlessに接続するクライアントとして使用します。
OSは最新版のAmazon Linux 2とします。
SSMエンドポイントを作成します。
SSM Session Managerを使用して、EC2インスタンスにリモートアクセスするためです。
S3エンドポイントも作成します。
S3バケット上に構築されるyumリポジトリにアクセスするために使用します。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。
https://github.com/awstut-an-r/awstut-fa/tree/main/058
テンプレートファイルのポイント解説
セキュリティグループ
EC2インスタンスとAurora Serverless用のセキュリティグループを確認します。
Resources:
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: !Sub "${Prefix}-InstanceSecurityGroup"
GroupDescription: Deny All.
VpcId: !Ref VPC
DBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: !Sub "${Prefix}-DBSecurityGroup"
GroupDescription: DBSecurityGroup.
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: !Ref MySQLPort
ToPort: !Ref MySQLPort
SourceSecurityGroupId: !Ref InstanceSecurityGroup
Code language: YAML (yaml)
前者がインスタンス用です。
許可するインバウンド通信を指定しません。
今回の構成では、インスタンスに対してはインバウンド通信が発生しないためです。
後者がAurora Serverless用です。
今回はMySQLタイプのAurora Serverlessを作成するため、MySQL通信用のポート(tcp/3306)を許可する内容です。
また送信元については、先述のインスタンス用セキュリティグループを設定します。
Aurora Serverless
Resources:
DBSubnetGroup:
Type: AWS::RDS::DBSubnetGroup
Properties:
DBSubnetGroupName: dbsubnetgroup
DBSubnetGroupDescription: test subnet group
SubnetIds:
- !Ref PrivateSubnet2
- !Ref PrivateSubnet3
DBCluster:
Type: AWS::RDS::DBCluster
Properties:
DatabaseName: !Ref DBName
DBClusterIdentifier: !Ref DBClusterIdentifier
DBSubnetGroupName: !Ref DBSubnetGroup
Engine: !Ref DBEngine
EngineMode: serverless
EngineVersion: !Ref DBEngineVersion
MasterUsername: !Ref DBMasterUsername
MasterUserPassword: !Ref DBMasterUserPassword
StorageEncrypted: true
VpcSecurityGroupIds:
- !Ref DBSecurityGroup
#DBInstance:
# Type: AWS::RDS::DBInstance
# Properties:
# ...
Code language: YAML (yaml)
Aurora Serverlessを作成するためには、少なくとも2つのリソースを定義する必要があります。
1つ目はDBサブネットグループです。
RDSに関連付けるサブネットには条件があります。
Aurora Serverless v1 DB クラスターで使用する DB サブネットグループでは、異なるアベイラビリティーゾーンごとにサブネットを作成します。
Aurora Serverless v1 での設定の要件
上記の条件を満たすように、2つのAZにそれぞれ作成したサブネットを指定します。
2つ目はDBクラスターです。
ポイントはEngineModeプロパティです。
のAurora Serverlessを作成するためには、「serverless」を指定します。
EngineプロパティおよびEngineVersionプロパティで作成するDBのエンジンおよびバージョンを指定します。
今回は2022年7月現在で最も新しいMySQLバージョンを指定しますので、前者に「aurora-mysql」を、後者に「5.7.mysql_aurora.2.07.1」を指定します。
なお5.6系のMySQLを選択する場合は、Engineプロパティに「aurora」を指定する必要がありますので、ご注意ください。
Aurora Serverless v1でサポートしているエンジンバージョンについては、以下のページをご確認ください。
Aurora Serverlessを作成する場合、DBクラスターを定義するだけで十分です。
Aurora Serverlessはマネージドサービスですから、内部に生成されるDBインスタンスは定義する必要はありません。
DB接続用インスタンス
Resources:
Instance:
Type: AWS::EC2::Instance
Properties:
IamInstanceProfile: !Ref InstanceProfile
ImageId: !Ref ImageId
InstanceType: !Ref InstanceType
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref PrivateSubnet
GroupSet:
- !Ref InstanceSecurityGroup
UserData: !Base64 |
#!/bin/bash -xe
yum update -y
yum install -y mariadb
Code language: YAML (yaml)
2インスタンスはAurora Serverlessへの接続を確認するために使用します。
ですからUserDataプロパティにおいて、インスタンスの初期化処理の一環として、yumによるパッケージインストールを指定します。
今回はMySQLタイプのAurora Serverlessを作成するため、mariadbパッケージをインストールすることで、MySQL用クライアント(mysql)をインストールします。
初期化処理に関する詳細は、以下のページをご確認ください。
Amazon Linux 2からRDSに接続する方法については、以下のページをご確認ください。
プライベートサブネット内でyumを実行する方法については、以下のページをご確認ください。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- EC2インスタンス:i-096b962150f8473aa
- Aurora ServerlessのDBクラスター:fa-058-dbcluster
- Aurora Serverlessのエンドポイント:fa-058-dbcluster.cluster-cl50iikpthxs.ap-northeast-1.rds.amazonaws.com
- Aurora Serverlessのマスターユーザーの名前:testuser
- Aurora Serverlessのマスターユーザーのパスワード:Passw0rd
- Aurora Serverlessに作成するデータベース名:testdb
AWS Management ConsoleからもAurora Serverlessの作成状況を確認します。
確かにDBクラスターがAurora Serverlessモードであり、エンジンタイプがMySQLタイプであることがわかります。
また先述のエンドポイントが作成され、通信用ポートが3306番であることもわかります。
動作確認
準備が整いましたので、EC2インスタンスにアクセスします。
インスタンスへのアクセスはSSM Session Managerを使用します。
% aws ssm start-session --target i-096b962150f8473aa
Starting session with SessionId: root-08ee1c5f1155eb7dd
sh-4.2$
Code language: Bash (bash)
SSM Session Managerの詳細につきましては、以下のページをご確認ください。
mariadbのインストール状況を確認します。
sh-4.2$ yum list installed | grep mariadb
mariadb.x86_64 1:5.5.68-1.amzn2 @amzn2-core
mariadb-libs.x86_64 1:5.5.68-1.amzn2 installed
Code language: Bash (bash)
正常にインストールされています。
次にmysqlクライアントを確認します。
sh-4.2$ mysql -V
mysql Ver 15.1 Distrib 5.5.68-MariaDB, for Linux (x86_64) using readline 5.1
Code language: Bash (bash)
正常に動作します。
クライアントのインストールが確認できましたので、Aurora Serverlessに接続します。
Aurora Serverlessエンドポイントを指定した上で、ポート番号、ユーザー名、パスワードを引数として渡します。
$ mysql -h fa-058-dbcluster.cluster-cl50iikpthxs.ap-northeast-1.rds.amazonaws.com -P 3306 -u testuser -p testdb
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.12 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [testdb]>
Code language: Bash (bash)
正常に接続することができました。
Aurora Serverlessが正常に作成されていることがわかりました。
まとめ
CloudFormationでAurora Serverlessを作成する方法を確認しました。