mazyu36の日記

某SIer所属のクラウドエンジニアのブログ

open-constructsでRedshift ServerlessのL2 Constructを作った

少し前にopen-constructsでRedshift ServerlessのL2 Constructを作成しました。その紹介記事です。

github.com

目次

open-constructsとは

以下のクラメソさん記事が参考になります。コミュニティ駆動のOSSとして今年(2024年)の初めに登場しました。

dev.classmethod.jp

以下は私の理解です。

現状本家CDKでL2 Constructを新規追加する場合(特にモジュールとして新規追加する場合)、RFCを起票して綿密にレビューなどを行った上で実装する必要があります。

これがプロセスとしてなかなか重厚なのと、本家メンテナーも十分にレビューに時間をかけられない現状があるため、新規のL2 Constructを追加するのはハードルが高いです。

github.com

そのような状況下で、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の実装方法も記事に書きたいと思います。

github.com