コミュニティ駆動のCDK Construct!open-constructsを使ってみた

コミュニティ駆動でしっかりとレビューされたCDKのL2/L3 Construct群であるopen-constructsを紹介します。
2024.05.04

はじめに

今回はコミュニティ駆動で実装やレビューが行われているCDK Constructであるopen-constructsを使ってみます。

open-constructsは、CDKのCore ContributorやTop Contributorが進めているConstructを作成しているプロジェクトです。詳細は以下のページをご参照ください。

見ていただけるとわかりますが、The CDK Bookの著者や元Core Contributorが参加しています。また日本からはAWS HEROにもなったk.gotoさんなどもレビュアーとして参加しています。

open-constructsはなぜ生まれたのか

ここからは自分がいろんな方から聞いた話をベースに記載します。間違っている場合があるので、参考程度にご参照ください。 使い方の部分には関係ないので使い方が気になる場合は、本章を読み飛ばしてください。

現在のCDKのリポジトリは、AWS サービス自体が全部で約270個、α版のL2 Constructも約30個と合わせて300近くのConstructがあります。これをCDKのコアメンバーのみでレビューするのは不可能なので、CDKによくコミットされている方をTrusted CDK Reviewersに抜擢して事前レビューを依頼することが可能な体制を作っています。Trusted CDK Reviewersは以下のCDK GitHubのWikiで確認できます。日本からも5名選出されています。

しかしながら、現状あまりにも数が多いのでCDK本体では積極的に新規のL2 Constructを作るのが難しくなっていてレビューされにくい状態になっているようです(感想レベルの話です)。その代わり、CDKのL2 Constructは個人で作って公開して有用性を示せればCDK本体に組み込まれる可能性が示唆されています。これは以下の記述から確認できます。

Publishing Your Own Package

This is by far the strongest signal you can give to the CDK team that a feature should be included within the core aws-cdk packages.

ただ難しいのは、個人が作ったパッケージを重要なインフラ構成に使用するかという点です。積極的にメンテナンスされるか不安な状態の機能は使われにくいためユーザ数が伸びず、ユーザ数が増えないため有用と判断されないという負のスパイラルに進む可能性があります。

そこでCDKにゆかりのある方々が、Open Constructs Foundationを立ち上げました。この団体はコミュニティ主導でありながら、しっかりとレビューされた最新のL2/L3 Constructを提供することを目的にしています。CONTRIBUTING.mdを見ると、現状はL2 Constructの受け入れをメインに進めるようです。

これにより自分たちCDKユーザーが今はCDKにL2 Constructがないサービスや最新のAWSサービスのL2 Constructが使いたい時に、安心して早く手元で使えるような世界が実現されることが期待できます。

使ってみた

ここからは実際に使ってみる方法を解説します。まずは以下のリポジトリをcloneしてきます。

% git clone https://github.com/open-constructs/aws-cdk-library.git

cloneしたリポジトリで以下を実行します。これにより必要なライブラリなど事前準備が整います。

% cd aws-cdk-library
% npm i
% npx projen

次に、パッケージを使うためにディレクトリを作成します。本来はnpmでパッケージ追加して使いたかったのですが、まだパッケージが公開されていないようなので、本リポジトリ内部で実行用環境を作ります。workspaceディレクトリが作業場所になります。

% mkdir src/workspace
% cd src/workspace
% npm init --language typescript

上記を終えるとworkspaceにCDK実行用の環境が整うので、bin配下のファイルとlib配下のファイルを以下のように変更して実行準備を整えます。今のところConstructはCUR(Cost Usage Report)のものしかないのでこちらを使用します。

src/workspace/bin/workspace.ts

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { WorkspaceStack } from '../lib/workspace-stack';

const app = new cdk.App();
new WorkspaceStack(app, 'WorkspaceStack', {
  env: { region: 'us-east-1' },
});

src/workspace/lib/workspace-stack.ts

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

import { CostReport, ReportGranularity, CurFormat } from '../../aws-cur/cost-report';

export class WorkspaceStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    new CostReport(this, 'MyCostReport', {
      costReportName: 'monthly-business-report',
      reportGranularity: ReportGranularity.MONTHLY,
      format: CurFormat.PARQUET,
    });
  }
}

上記を変更後にAWSのクレデンシャルを設定後、デプロイします。

# 念の為、テンプレート生成できるか事前確認
% npx cdk synth
# デプロイ
% npx cdk deploy

デプロイすると以下のように、CURとCURが生成するレポート保存用のバケットが生成されていることがわかります。

実行後は忘れずに削除するため、以下のコマンドと上記で作成されたS3を手動で削除しましょう。

% npx cdk destroy

所感

新しいサービスのL2 Constructがなかなか増えなかったり、L1 Constructしかなくてここが困っているんだよなあという人にはかなり朗報だと思います!実際にコントリビュートしてみましたが、レビュアーの方々も積極的に内容をチェックしてくれています。皆さんもこのサービスのL2欲しいけど、CDKに無いんだよなということがある場合は積極的に機能追加してみてください!

製造ビジネステクノロジー部の佐藤智樹でした。