CDKでRDS Auroraインスタンスに使う認証局を設定してみた

2023.06.05

こんにちは。CX事業本部Delivery部のakkyです。

CDKでAurora(DBCluster)を作成すると、SSL接続で使用されるデフォルトの認証局はrds-ca-2019となります。 ただし、マネジメントコンソールやCLIからは、もっと期限の長い認証局に設定できます。

期限の長い認証局については、以下の記事をご覧ください。

Amazon RDS で100年有効な新しいCAが利用可能になりました

これを設定したい場合は、CloudFormationの場合はAWS::RDS::DBInstanceCACertificateIdentifierプロパティで変更すればよいことがわかりました。

しかし、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で見るしかないのですね。