少し前にopen-constructsでRedshift ServerlessのL2 Constructを作成しました。その紹介記事です。
目次
open-constructsとは
以下のクラメソさん記事が参考になります。コミュニティ駆動のOSSとして今年(2024年)の初めに登場しました。
以下は私の理解です。
現状本家CDKでL2 Constructを新規追加する場合(特にモジュールとして新規追加する場合)、RFCを起票して綿密にレビューなどを行った上で実装する必要があります。
これがプロセスとしてなかなか重厚なのと、本家メンテナーも十分にレビューに時間をかけられない現状があるため、新規のL2 Constructを追加するのはハードルが高いです。
そのような状況下で、open-constructsでは新規L2 Construct実装のハードルは下げつつも、CDKの有識者がレビューすることで品質の高いConstructを提供しています。
使い方
open-constructsを追加
プロジェクト作成後にnpm install
するだけです。
$ npx cdk init --language=typescript $ npm install @open-constructs/aws-cdk
namespaceを作成
まずはnamespaceを作成します。IAMロールは任意です。
// デフォルトロールを作成 const defaultRole = new Role(this, 'DefaultRole', { assumedBy: new ServicePrincipal('redshift.amazonaws.com'), }); // 追加のIAMロールを作成 const anotherRole = new Role(this, 'AnotherRole', { assumedBy: new ServicePrincipal('redshift.amazonaws.com'), }); // namespaceを作成 const namespace = new ocf.aws_redshiftserverless.Namespace(this, 'Namespace', { adminUsername: 'adminuser', adminUserPassword: cdk.SecretValue.unsafePlainText('adminUserPassword123'), defaultIamRole: defaultRole, iamRoles: [defaultRole, anotherRole], // デフォルトロールを含める必要があるので注意 dbName: 'mydatabase', logExports: [ ocf.aws_redshiftserverless.LogExport.USER_LOG, ocf.aws_redshiftserverless.LogExport.CONNECTION_LOG, ocf.aws_redshiftserverless.LogExport.USER_ACTIVITY_LOG, ], }); // ロールは後から追加可能 const addRole = new Role(this, 'AddRole', { assumedBy: new ServicePrincipal('redshift.amazonaws.com'), }); namespace.addIamRole(addRole);
workgroupを作成
VPCを作成後、workgroupを作成します。VPCは必須です。
Subnetは指定もできますが、省略した場合はPrivate Subnet (SubnetType.PRIVATE_WITH_EGRESS
) が選択されるように実装しています。この辺りは本家のDB系のリソースのお作法に沿っています。
また先ほど作成したnamespaceも使用します。
// VPCを作成 const vpc = new cdk.aws_ec2.Vpc(this, 'VPC', {}); // workgroupを作成 const workgroup = new ocf.aws_redshiftserverless.Workgroup(this, 'WorkGroup', { baseCapacity: 8, configParameters: { datestyle: 'ISO, MDY', enable_user_activity_logging: 'true', query_group: 'default', require_ssl: 'true', search_path: '$user, public', max_query_execution_time: '14440', }, enhancedVpcRouting: true, namespace, // 先ほど作成したnamespaceを設定 publiclyAccessible: true, vpc, // vpcを設定 vpcSubnets: { subnetType: cdk.aws_ec2.SubnetType.PUBLIC, // Subnetタイプを指定する場合は設定 }, port: 5432, }); // connectionsでアクセス許可(SG設定)も可能 workgroup.connections.allowDefaultPortFrom(resource);
これだけで使えるようになります。簡単ですね。
おわりに
徐々にopen-constructsのL2も増え始めていますが、コントリビュートの余地は無限にあります。L2作成にチャレンジしてみたい方はぜひPRを送ってみてください。
時間が取れたら新規L2の実装方法も記事に書きたいと思います。