【要望】1つのAWSアカウントに複数個の機能をデプロイしたい
現状の課題
packages/cdk 以下の実装でcdk.jsonやbin/lib配下の実装が、1つのAWSアカウントに対して複数個の機能をデプロイできるような設計になっていないので、1つ機能の提供先が増えるたびにアカウントが新しく必要になります。
bin/lib配下のリソースやcdk.jsonの実装方法を修正して、複数個デプロイできるような構成にしたいです。
提案する解決策
- cdk.jsonの環境ごとの値がcontext配下に直接書かれているので、環境ごとに階層化する or parameter.tsなどで型情報を付与して切り出す
- 参考:AWS CDKのあるあるお悩みに答えたい
- 上記の1 or 3の方法
- bin配下でcdk.jsonを直接呼び出している部分を、指定した個別環境から取り出す or 型付けしたファイルから取り出すよう修正する
- lib配下で重複する可能性のあるリソース名があれば、ConstructのIDを修正する
備考
- 互換性を保つために変更が難しければクローズいただいて問題ないです。
- 同意いただければ機能実装を試してみます。
極力既存ユーザの移行負担を減らす案を書いてみます。
- cdk deploy時のパラメータ指定について
env=devなどでパラメータ指定する方式にするenvの指定がなければcdk.jsonの既存パラメータを使う(これで既存のユーザはリソースの再作成不要)
- ConstructのIDについて
- ConstructIDも指定があればenvの値をつける
- 指定がなければそのままのConstructIDを使う
以下は例としてDDBのテーブルについて記載します。env指定がなければ空文字でTableのまま、env=devなどであればdevTableをIDとして使う。同一アカウント内ではenvの部分を人やシステムごとに分けて使う。
https://github.com/aws-samples/generative-ai-use-cases-jp/blob/6b6efec7a3e081b3e818ac948a5420bf229a0bfd/packages/cdk/lib/construct/database.ts#L12
const table = new ddb.Table(this, `{env}Table`, {
ありがとうございます!複数個の機能というのは具体的にはどういうことでしょうか?別の Stack という理解で正しいでしょうか?
@tbrand
ご確認ありがとうございます!
1つのAWSアカウントに対して複数のCDKアプリを作成できることを想定しています。以下の画像のApp部分を1つのアカウントに対して複数作るような想定です。
今はbin/lib配下のソースがApp1つ前提で構築されているので、上記のような構成は難しいと考えています。
参考:Boost your infrastructure with the AWS CDK
CDK の App を分けたとして、Stack 名 (Stack の id) の変更は必要という理解で正しいでしょうか?それに加え、Stack の id を変更した場合、Construct の id は変更ない (被っていても問題ない) という理解はあっていますでしょうか?現状、問題になるのは L1 リソースの name 等をハードコーディングしているところかなと思っています。
認識にずれがある場合教えてください!
CDK の App を分けたとして、Stack 名 (Stack の id) の変更は必要という理解で正しいでしょうか?
はい、StackにわたすIDに引数から値を渡すなどの変更が必要になります。以下が例です。
const generativeAiUseCasesStack = new GenerativeAiUseCasesStack(
app,
`GenerativeAiUseCasesStack${env}`,
それに加え、Stack の id を変更した場合、Construct の id は変更ない (被っていても問題ない) という理解はあっていますでしょうか?
はい、同じように名前をハードコードしている部分やL1 Constructが主に問題になる認識です!以下の部分などです。 https://github.com/aws-samples/generative-ai-use-cases-jp/blob/ba02a6280b9578399ac9815c93ad7db6818aff85/packages/cdk/lib/construct/agent.ts#L86
以下は単に共有です。
少し確認してたのですが、L1 Constructでも名前重複しないように実装されているので思ったよりは修正範囲広くなさそうです。
https://github.com/aws-samples/generative-ai-use-cases-jp/blob/ba02a6280b9578399ac9815c93ad7db6818aff85/packages/cdk/lib/construct/guardrail.ts#L9-L14
CfnWebACLを実装している箇所は、WebAcl${id}のように定義しているのでそのままでも大丈夫そうに見えます。
https://github.com/aws-samples/generative-ai-use-cases-jp/blob/ba02a6280b9578399ac9815c93ad7db6818aff85/packages/cdk/lib/construct/common-web-acl.ts#L75