generative-ai-use-cases icon indicating copy to clipboard operation
generative-ai-use-cases copied to clipboard

【要望】1つのAWSアカウントに複数個の機能をデプロイしたい

Open tomoki10 opened this issue 1 year ago • 5 comments

現状の課題

packages/cdk 以下の実装でcdk.jsonやbin/lib配下の実装が、1つのAWSアカウントに対して複数個の機能をデプロイできるような設計になっていないので、1つ機能の提供先が増えるたびにアカウントが新しく必要になります。

bin/lib配下のリソースやcdk.jsonの実装方法を修正して、複数個デプロイできるような構成にしたいです。

提案する解決策

  • cdk.jsonの環境ごとの値がcontext配下に直接書かれているので、環境ごとに階層化する or parameter.tsなどで型情報を付与して切り出す
  • bin配下でcdk.jsonを直接呼び出している部分を、指定した個別環境から取り出す or 型付けしたファイルから取り出すよう修正する
  • lib配下で重複する可能性のあるリソース名があれば、ConstructのIDを修正する

備考

  • 互換性を保つために変更が難しければクローズいただいて問題ないです。
  • 同意いただければ機能実装を試してみます。

tomoki10 avatar Sep 02 '24 09:09 tomoki10

極力既存ユーザの移行負担を減らす案を書いてみます。

  • 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`, {

tomoki10 avatar Sep 02 '24 12:09 tomoki10

ありがとうございます!複数個の機能というのは具体的にはどういうことでしょうか?別の Stack という理解で正しいでしょうか?

tbrand avatar Sep 04 '24 05:09 tbrand

@tbrand ご確認ありがとうございます! 1つのAWSアカウントに対して複数のCDKアプリを作成できることを想定しています。以下の画像のApp部分を1つのアカウントに対して複数作るような想定です。 今はbin/lib配下のソースがApp1つ前提で構築されているので、上記のような構成は難しいと考えています。 参考:Boost your infrastructure with the AWS CDK image

tomoki10 avatar Sep 04 '24 11:09 tomoki10

CDK の App を分けたとして、Stack 名 (Stack の id) の変更は必要という理解で正しいでしょうか?それに加え、Stack の id を変更した場合、Construct の id は変更ない (被っていても問題ない) という理解はあっていますでしょうか?現状、問題になるのは L1 リソースの name 等をハードコーディングしているところかなと思っています。

認識にずれがある場合教えてください!

tbrand avatar Sep 05 '24 02:09 tbrand

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

tomoki10 avatar Sep 05 '24 22:09 tomoki10