AWS CDKでAmazon RDSリソースを構築する際、「なぜParameterGroupでは名前を直接設定できるのに、OptionGroupではできないのか?」という疑問を持ったことはありませんか?
実際にコードを書いてみると、ParameterGroupではnameプロパティが使えるものの、OptionGroupでは同じようにはいきません。
統一された命名規則を適用したいプロジェクトでは、この違いが思わぬ障害となることがあります。
この記事では、AWS CDKの公式ドキュメントを参照しながら、OptionGroupで物理名を設定する方法について詳しく解説します。
問題:OptionGroupに名前設定プロパティが存在しない
AWS CDK公式ドキュメントのOptionGroupプロパティを確認すると、以下のプロパティのみが提供されています。
configurations?
– オプションの設定description?
– オプショングループの説明engine
– データベースエンジン
注目すべき点は、ParameterGroupには存在するname
プロパティが、OptionGroupには存在しないということです。
OptionGroup(名前設定不可)
// ❌ OptionGroupには物理名を設定するプロパティが存在しない const optionGroup = new rds.OptionGroup(this, 'RDS-OptionGroup', { engine: rds.DatabaseInstanceEngine.mariaDb({ version: rds.MariaDbEngineVersion.VER_11_4_5 }), configurations: [], // optionGroupName: "..." // このプロパティは存在しない // name: "..." // このプロパティも存在しない });
この制限により、統一された命名規則を適用したい場合や、既存リソースとの互換性を保つ必要がある場合に問題となります。
CDK APIドキュメントとの対比
同じRDSリソースでも、ParameterGroupとOptionGroupで提供されているプロパティが異なります。
ParameterGroup(名前設定可能)
// ✅ ParameterGroupには name プロパティが存在 const parameterGroup = new rds.ParameterGroup(this, 'RDS-ParameterGroup', { engine: rds.DatabaseInstanceEngine.mariaDb({ version: rds.MariaDbEngineVersion.VER_11_4_5 }), parameters: { character_set_server: 'utf8mb4', character_set_client: 'utf8mb4', collation_server: 'utf8mb4_unicode_ci', }, name: 'ParameterGroup' // 直接指定可能 });
解決策:エスケープハッチを使用した物理名設定
この問題を解決するには、CDKのエスケープハッチ機能を使用してCloudFormationのAWS::RDS::OptionGroup
リソースのOptionGroupName
プロパティを直接操作する必要があります。
/** * オプショングループの作成 */ const optionGroup = new rds.OptionGroup(this, 'RDS-OptionGroup', { engine: rds.DatabaseInstanceEngine.mariaDb({ version: rds.MariaDbEngineVersion.VER_11_4_5 }), configurations: [] // MariaDBでは通常空で問題なし }); Tags.of(optionGroup).add('App', 'Cpe'); // エスケープハッチでオプショングループの物理名を設定 const cfnOptionGroup = optionGroup.node.defaultChild as rds.CfnOptionGroup; cfnOptionGroup.addPropertyOverride('OptionGroupName', `OptionGroup`);
エスケープハッチの動作原理
- L2コンストラクトの作成: CDKの高レベルAPI(L2)でOptionGroupを作成
- L1コンストラクトへのアクセス:
node.defaultChild
でCloudFormationリソース(L1)にアクセス - 型キャスト:
rds.CfnOptionGroup
型にキャストして適切な型情報を取得 - プロパティオーバーライド:
addPropertyOverride()
でCloudFormationプロパティを直接操作
なぜエスケープハッチが必要なのか
CDKの設計思想では、リソースの物理名は自動生成されることが推奨されています。しかし、実際のプロジェクトでは以下のような理由で明示的な命名が必要になることがあります。
- 統一された命名規則の適用
- 既存リソースとの互換性保持
- 環境間でのリソース名の一貫性
- 運用チームでのリソース識別の簡素化
ParameterGroupではname
プロパティが提供されているにも関わらず、OptionGroupでは提供されていないのは、CDKの実装が完全に統一されていないことを示しています。
まとめ
AWS CDKの公式ドキュメントで確認できる通り、RDSのOptionGroupには物理名を設定するプロパティが提供されていません。この制限を回避するには、エスケープハッチを使用してCloudFormationレベルでのプロパティ操作が必要です。
一見すると複雑に見えるかもしれませんが、一度パターンを理解すれば、他の似たような制約がある場合にも応用できる汎用的な解決策となります。実際のプロジェクトでは、本記事で紹介した方法を活用して、統一された命名規則を実現することができます。