AWS CDK의 여러 스택에서 리소스를 공유하는 방법

7227 단어 cdktypescriptcloudaws

AWS CDK의 여러 스택에서 리소스 공유



CDK 앱을 구축할 때 프로젝트를 구조화하고 인프라를 생성할 때 여러 스택을 설정하려는 좋은 기회가 있습니다. 따라서 AWS CDK의 스택 전체에서 리소스를 참조하는 방법을 아는 것이 좋습니다.

이 블로그 게시물의 예에서는 두 개의 스택을 생성합니다.
  • SharedInfraStack , VPC 리소스
  • 를 포함합니다.
  • RdsStackSharedInfraStack에서 VPC를 가져옵니다.

  • 참고: 아직 AWS CDK 초보자인 경우. 그런 다음 먼저 How to setup AWS CDK - 전체 가이드에 대한 내 기사를 읽어 보시기 바랍니다.

    https://towardsthecloud.com/how-to-set-up-aws-cdk

    AWS CDK의 스택 간에 리소스를 공유하려면 다음이 필요합니다.
  • Create SharedInfraStack which provisions the VPC
  • Pass the props of the VPC to the RdsStack we instantiate
  • Create the RdsStack and import the VPC as prop
  • TL;DR give me the code!

  • VPC를 프로비저닝하는 SharedInfraStack 생성



    아래 예에서는 서브넷 및 라우팅을 포함하여 VPC 리소스를 프로비저닝하는 공유 인프라 스택을 공유합니다.

    // file: lib/shared-infra-stack.ts
    import * as cdk from "@aws-cdk/core";
    import * as ec2 from "@aws-cdk/aws-ec2";
    
    export class SharedInfraStack extends cdk.Stack {
      public readonly vpc: ec2.Vpc;
      constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
    
        // assign a VPC to the class property SharedInfraStack
        this.vpc = new ec2.Vpc(this, "TheVPC", {
          cidr: "10.0.0.0/16",
          natGateways: 1,
          maxAzs: 3,
          subnetConfiguration: [
            {
              cidrMask: 20,
              name: "public",
              subnetType: ec2.SubnetType.PUBLIC,
            },
            {
              cidrMask: 20,
              name: "application",
              subnetType: ec2.SubnetType.PRIVATE,
            },
            {
              cidrMask: 20,
              name: "data",
              subnetType: ec2.SubnetType.ISOLATED,
            },
          ],
        });
      }
    }
    
    

    cdk synth를 실행하여 CloudFormation 템플릿을 생성하면 다음 VPC 리소스를 내보내는 것을 볼 수 있습니다.

    # Generated CloudFormation template of the SharedInfraStack
    Outputs:
      ExportsOutputRefTheVPCdataSubnet1Subnet62F6C85A8DFF3A46:
        Value:
          Ref: TheVPCdataSubnet1Subnet62F6C85A
        Export:
          Name: SharedInfraStack:ExportsOutputRefTheVPCdataSubnet1Subnet62F6C85A8DFF3A46
      ExportsOutputRefTheVPCdataSubnet2SubnetAE4EF5CAD340846A:
        Value:
          Ref: TheVPCdataSubnet2SubnetAE4EF5CA
        Export:
          Name: SharedInfraStack:ExportsOutputRefTheVPCdataSubnet2SubnetAE4EF5CAD340846A
      ExportsOutputRefTheVPC92636AB00B2A4A70:
        Value:
          Ref: TheVPC92636AB0
        Export:
          Name: SharedInfraStack:ExportsOutputRefTheVPC92636AB00B2A4A70
    
    


    인스턴스화하는 RdsStack에 VPC의 소품을 전달합니다.



    CDK 앱을 인스턴스화하는 bin 폴더에서 CDK 스택도 선언합니다. 여기에서 VPC 스택에서 방금 생성한 props를 전달하고 생성할 새 항목RdsStack에 전달합니다.

    // file: bin/index.ts
    import * as cdk from "@aws-cdk/core";
    import { SharedInfraStack } from "../lib/shared-infra-stack";
    import { RdsStack } from "../lib/rds-stack";
    
    const app = new cdk.App();
    
    // created the SharedInfraStack with the VPC resource that we're going to share by making a variable
    const infra = new SharedInfraStack(app, "SharedInfraStack");
    
    // pass the vpc resource from the SharedInfraStack to the RdsStack
    new RdsStack(app, "RdsStack", {
      vpc: infra.vpc,
    });
    
    


    RdsStack을 생성하고 VPC를 소품으로 가져오기



    이제 이전 두 단계에서 스택 간에 공유한 VPC 리소스로 RDS를 프로비저닝하는 RdsStack를 생성합니다.

    // file: lib/rds-stack.ts
    import * as cdk from "@aws-cdk/core";
    import * as ec2 from "@aws-cdk/aws-ec2";
    import * as rds from "@aws-cdk/aws-rds";
    
    // extend the props of the stack by adding the vpc type from the SharedInfraStack
    export interface RDSStackProps extends cdk.StackProps {
      vpc: ec2.Vpc;
    }
    
    export class RdsStack extends cdk.Stack {
      readonly postgreSQLinstance: rds.DatabaseInstance;
      private vpc: ec2.Vpc;
    
      constructor(scope: cdk.Construct, id: string, props: RDSStackProps) {
        super(scope, id, props);
        // make the vpc variable accessible
        const vpc = props.vpc;
    
        const cluster = new rds.DatabaseCluster(this, "Database", {
          engine: rds.DatabaseClusterEngine.auroraMysql({
            version: rds.AuroraMysqlEngineVersion.VER_2_08_1,
          }),
          credentials: rds.Credentials.fromGeneratedSecret("clusteradmin"), // Optional - will default to 'admin' username and generated password
          instanceProps: {
            // optional , defaults to t3.medium
            instanceType: ec2.InstanceType.of(
              ec2.InstanceClass.BURSTABLE2,
              ec2.InstanceSize.SMALL
            ),
            vpcSubnets: {
              subnetType: ec2.SubnetType.ISOLATED,
            },
            // select the vpc we imported to define the subnets for the RDS
            vpc,
          },
        });
      }
    }
    
    


    다음은 cdk synth 명령을 사용하여 CloudFormation 템플릿을 생성할 때의 최종 결과입니다.

      DatabaseSubnets56F17B9A:
        Type: AWS::RDS::DBSubnetGroup
        Properties:
          DBSubnetGroupDescription: Subnets for Database database
          SubnetIds:
            - Fn::ImportValue: SharedInfraStack:ExportsOutputRefTheVPCdataSubnet1Subnet62F6C85A8DFF3A46
            - Fn::ImportValue: SharedInfraStack:ExportsOutputRefTheVPCdataSubnet2SubnetAE4EF5CAD340846A
        Metadata:
          aws:cdk:path: RdsStack/Database/Subnets/Default
    
      DatabaseB269D8BB:
        Type: AWS::RDS::DBCluster
        Properties:
          Engine: aurora-mysql
          DBClusterParameterGroupName: default.aurora-mysql5.7
          DBSubnetGroupName:
            Ref: DatabaseSubnets56F17B9A
          EngineVersion: 5.7.mysql_aurora.2.08.1
          MasterUsername: clusteradmin
          MasterUserPassword:
            Fn::Join:
              - ""
              - - "{{resolve:secretsmanager:"
                - Ref: RdsStackDatabaseSecretECD539873fdaad7efa858a3daf9490cf0a702aeb
                - :SecretString:password::}}
          VpcSecurityGroupIds:
            - Fn::GetAtt:
                - DatabaseSecurityGroup5C91FDCB
                - GroupId
        UpdateReplacePolicy: Snapshot
        DeletionPolicy: Snapshot
        Metadata:
          aws:cdk:path: RdsStack/Database/Resource
    
    


    CloudFormation 템플릿에서 볼 수 있듯이 RdsStack 템플릿에서 내보낸 SharedInfraStack의 VPC 값을 가져옵니다.

    TL;DR 나에게 코드를 줘!



    이 문서의 코드는 GitHub에서 사용할 수 있습니다.


    👋 이 기사가 마음에 드셨나요? 아래 의견에 연락하거나 의견을 보내주세요.

    좋은 웹페이지 즐겨찾기