CDKでRDS Auroraインスタンスに使う認証局を設定してみた
こんにちは。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で見るしかないのですね。