こんにちは。CX事業本部Delivery部のakkyです。
CDKでAurora(DBCluster)を作成すると、SSL接続で使用されるデフォルトの認証局はrds-ca-2019となります。 ただし、マネジメントコンソールやCLIからは、もっと期限の長い認証局に設定できます。
期限の長い認証局については、以下の記事をご覧ください。
これを設定したい場合は、CloudFormationの場合はAWS::RDS::DBInstance
のCACertificateIdentifier
プロパティで変更すればよいことがわかりました。
しかし、CDKから直接プロパティが変更できるようにはなっておらず、また、DBInstanceのインスタンスを簡単に取得する手段は見当たりません。 今回はCDKから認証局を変更する方法を調査しました。
追記:
この記事では、DatabaseClusterでinstancePropsを利用してインスタンスの設定をしていますが、この方法は古い記法です。
現行のwriterとreaderプロパティで指定する方法での書き方は、以下の記事をご覧ください。
完成したCDKコード
以下のようになりました。前半では実験用に新規にVPCを作り、removalPolicyもDESTROYです。
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as rds from 'aws-cdk-lib/aws-rds';
import { Construct } from 'constructs';
export class AuroraCdkStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const vpc = new ec2.Vpc(this, "vpc", {
subnetConfiguration: [
{
name: 'Public',
subnetType: ec2.SubnetType.PUBLIC,
cidrMask: 24,
},
{
name: 'Protected',
subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
cidrMask: 24,
},
],
});
const aurora = new rds.DatabaseCluster(this, "aurora", {
engine: rds.DatabaseClusterEngine.auroraMysql({
version: rds.AuroraMysqlEngineVersion.VER_3_03_0
}),
instanceProps: {
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T4G, ec2.InstanceSize.MEDIUM),
vpc,
vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED },
},
removalPolicy: cdk.RemovalPolicy.DESTROY, // for experimental
});
for (let i = 1; i <= aurora.instanceIdentifiers.length; i++) {
const instance = aurora.node.findChild(`Instance${i}`) as rds.CfnDBInstance;
instance.addPropertyOverride("CACertificateIdentifier", "rds-ca-rsa2048-g1");
}
}
}
CDKでは、エスケープハッチとしてL2コンストラクトからL1(Cfn)を取り出す手段がありますが、よくやる(デフォルトを取り出す)書き方aurora.node.defaultChild
では、取り出せるのはCfnDBClusterです。
今回はCfnDBInstanceが欲しいので、findChild()
を使いました。ここで指定する名前は、リソースを作成している部分のソースコードを見るとわかります。
aws-cdk/packages/aws-cdk-lib/aws-rds/lib/cluster.ts 1286行目
リソースの名前はInstance${instanceIndex}
であることがわかります。instanceIndex
は1始まりになっているので、最初のインスタンスはInstance1になります。
インスタンスの一覧はinstanceIdentifiers
に入ってくることがわかるので、このリストから数だけもらってaddPropertyOverride()
で値を上書きすればOKです。
おわりに
CDKではL2コンストラクトを使うと手軽にリソースを作成できますが、中身のコンストラクトをいじろうとすると、CDK自体のソースコードを調査する必要がありました。
ローカルで開発していると、jsにコンパイルされたコードとd.tsしか振ってこないので、Githubで見るしかないのですね。