はじめに
[前回の記事]
前回の記事でEC2, ALBの作成までやったので、この記事では環境にRDSを追加していきます。
前記事にも載せましたが、↓みたいな構成を考えてます。
やったこと
RDS用サブネットを作成
とりあえず、RDS用のサブネットグループを作成します。
(RDSには通常のサブネットグループは割り当てられないことを知らず、かなり時間を無駄にしました...)
import { aws_ec2 as ec2, aws_rds as rds } from 'aws-cdk-lib'; /** * RDS用サブネットグループ作成 */ const subnetGroup = new rds.SubnetGroup(this, 'rdsSubnet', { description: 'rdsPrivateSubnet', vpc: vpc, vpcSubnets: { availabilityZones: ['us-east-1a', 'us-east-1b'], subnetType: ec2.SubnetType.PRIVATE_ISOLATED, // プライベートサブネットで作成 }, });
参考:class SubnetGroup (construct) · AWS CDK
DB関連情報をSecretsManagerに登録
DBのユーザー名やパスワードなどの機密情報はまとめてSecretsManagerで管理します。
登録した情報は、 AWS Secrets Manager
から確認できます。
import { aws_ec2 as ec2, aws_rds as rds } from 'aws-cdk-lib'; /** * Secrets Manager に DB 接続情報を作成 */ const dbUser: string = 'cdk_test_user'; const dbName: string = 'cdk_test_db'; const rdsCredentials = rds.Credentials.fromGeneratedSecret(dbUser, { secretName: '/cdk-test/rds/' });
RDS用セキュリティグループを作成
やってることはEC2, ALBの時と変わりません。
EC2からの3306ポートの通信のみを許可するよう設定します。
import { aws_ec2 as ec2, aws_rds as rds } from 'aws-cdk-lib'; const rdsSecurityGroup = new ec2.SecurityGroup(this, 'rds-security-group', { allowAllOutbound: true, description: "Allow 3306 in", vpc, }); // 3306 接続許可 rdsSecurityGroup.addIngressRule( ec2SecurityGroup, ec2.Port.tcp(3306), 'Allow 3306 access', );
RDS インスタンスを作成
↑で作ったリソースを使いつつ、RDSインスタンスの設定を書いていきます。
/** * RDS インスタンス作成 */ const rdsInstance = new rds.DatabaseInstance(this, "rds-instance", { engine: DatabaseInstanceEngine.MYSQL, credentials: rdsCredentials, databaseName: dbName, subnetGroup: subnetGroup, instanceType: ec2.InstanceType.of( ec2.InstanceClass.T2, ec2.InstanceSize.MICRO, ), vpc: vpc, publiclyAccessible: false, securityGroups: [rdsSecurityGroup], });
各プロパティの詳細については下記を参照。
参考:class DatabaseInstance (construct) · AWS CDK
これでRDSに必要な設定は完了しました。
接続確認
本当にEC2からRDSに接続できるのか確認します。
※1 今回の構成だと、EC2はプライベートサブネットにあるのでそのままでは接続できません。(いくつか追加でやることがあるのですがそれについては別記事でまとめます)
下記の手順で、RDSにmysqlにEC2からログインできるか確かめます。
- mysqlコマンドをインストールします。
$ sudo yum install mysql
※2 今回の構成だと、yumコマンドに失敗します。これも解決方法があるのですが別記事で...
- mysqlにログインします。
$ mysql -u [CDKで指定したユーザ名] -p -h [DBのエンドポイント]
DBのエンドポイントは[RDS] > [データベース]
から確認できます。
上記コマンドで、mysqlに無事ログインできれば接続確認はOK。
参考:【初心者向け】EC2からRDSへ接続してみた - サーバーワークスエンジニアブログ
長い道のりだった...