web-dev-qa-db-ja.com

スタック間で共有できるVPCを作成するにはどうすればよいですか?

AWS CDKを使用して複数のスタックで使用できる再利用可能なVPCを作成する方法に頭を悩ませています。プロジェクトごとに異なるスタックを作成し、異なるスタックに割り当てるVPCをインポートできるようにしたい。また、さまざまなスタックをさまざまなタイミングで展開できる適切な構造を使用してこれを作成したいと考えています(つまり、すべてのスタックを一度に展開したくない)。

私は次のアプローチを試しましたが、これは達成したくないスタックごとに新しいVPCを作成します。代わりに、VPCを一度作成し、すでに存在する場合は、以前に作成したものを再利用します。

app.ts

import cdk = require('@aws-cdk/core');
import { Stack1 } from '../lib/stack1';
import { Stack2 } from '../lib/stack2';

const app = new cdk.App();

new Stack1(app, "Stack1");
new Stack2(app, "Stack2");

stack1.ts

import cdk = require('@aws-cdk/core');

import { Configurator } from './configurators/configurator'

export class Stack1 extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const configurator = new Configurator(scope, "Stack1");

    // later reuse vpc from configurator using configurator.vpc
  }
}

stack2.ts

import cdk = require('@aws-cdk/core');

import { Configurator } from './configurators/configurator'

export class Stack2 extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const configurator = new Configurator(scope, "Stack2");

    // later reuse vpc from configurator using configurator.vpc
  }
}

configurator.ts

import cdk = require('@aws-cdk/core');
import ec2 = require("@aws-cdk/aws-ec2");

export class Configurator {

  vpc: ec2.Vpc;

  constructor(scope: cdk.Construct, name: string) {
    this.vpc = new ec2.Vpc(scope, "MyVPC", {
      maxAzs: 3
    });
  }
}

した後

cdk synth
cdk deploy Stack1
cdk deploy Stack2

これにより2つのVPCが作成され、1つのVPCを希望どおりに再利用することはありません。スタックを同じアカウントとリージョンにデプロイします。

私が探している出力を達成するために、私のアプローチをどのように変更できますか?スタックを互いに独立してデプロイできるようにしたい。

6
alkesos

私は0x32e0edfbの答えを試しましたが、いくつか問題がありました。このように修正します。

VPCスタック

class VpcStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        self.eks_vpc = ec2.Vpc(self, 'eks-vpc',
            cidr='10.1.0.0/16',
            max_azs=2
        )

vPCを他のスタックと共有する

class EksClusterStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, props: ec2.Vpc, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        cluster = eks.Cluster(self, 'eks-control-plane',
            vpc=props,
            default_capacity=0
        )

次にapp.pyファイル

app = core.App()

vpc_stack = VpcStack(app, 'vpc-stack')
eks_cluster_stack = EksClusterStack(app, 'eks-cluster', vpc_stack.eks_vpc)

eks_cluster_stack.add_dependency(vpc_stack)

app.synth()

from_lookupは、既存のVPCでよりよく使用されます。

したがって、VPC情報を共有するために share-vpcs を使用することを選択します。

from_lookupはAPI呼び出しを1回だけ実行します。その後、データはcdk.context.jsonファイルにキャッシュされます。これはソース管理にコミットする必要があります

その問題は、同じVPCを再作成するときに発生しました。

cdk.context.jsonは継続バージョンに更新されませんでした。したがって、from_lookupを使用すると、常に古いvpc-idが取得されます。

cdk context --clearコマンドを使用してから、再度デプロイする必要があります。 cdk.context.jsonは、持続バージョンvpc-idを取得します。

最後に、それはfrom_lookupメソッドで適切に動作します。

参照: https://github.com/aws/aws-cdk/blob/master/packages/%40aws-cdk/aws-eks/test/integ.eks-kubectl.lit.ts

https://docs.aws.Amazon.com/cdk/latest/guide/context.html

1
RicoChen