단일 CDK 프로젝트에서 스택 간 참조를 위한 구성 객체를 전달하려면 어떻게 해야 합니까?

6분 분량
0

단일 AWS Cloud Development Kit(AWS CDK) 프로젝트에서 스택 간 참조를 위해 구성 객체를 전달하려고 합니다.

간략한 설명

스택 간 참조를 수행하려면 다음 방법 중 하나를 사용하십시오.

  • (AWS CloudFormation 네이티브 메서드) 스택 생성 및 스택 간 참조
  • (파라미터 저장소 메서드) AWS CloudFormation 오류를 방지하기 위한 스택 생성 및 스택 간 참조

해결 방법

(AWS CloudFormation 네이티브 메서드) 스택 생성 및 스택 간 참조

참고: 다음 단계에서는 VpcStack 및 SecurityGroupStack이라는 두 개의 예제 스택을 생성합니다. VpcStack은 생산자 스택이고 SecurityGroupStack은 소비자 스택입니다. SecurityGroupStack에서 VpcStack의 Amazon VPC ID를 참조하는 보안 그룹이 생성됩니다. 스택을 생성할 때 이름을 사용자 지정할 수 있습니다.

1.    프로젝트를 생성하고 빈 디렉터리에서 cdk init를 호출합니다.

mkdir my-project
cd my-project
cdk init --language typescript

2.    lib/my-project-stack.ts 파일에서 AWS CDK 모듈을 가져옵니다.

import as 'aws-cdk-lib/aws-ec2';
import * as cdk from 'aws-cdk-lib';

3.    스택을 정의하고 Amazon VPC의 속성을 설정합니다(이 예에서는 VPCStack).

export class VpcStack extends cdk.Stack {
  public readonly vpc: ec2.IVpc;

  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    this.vpc = new ec2.Vpc(this, 'Cross-Ref-Vpc', {
      maxAzs: 2,
      natGateways: 1,
    });
  }
}

4.    대상 스택에서 수신하려는 props를 지정하는 인터페이스를 정의합니다.

interface VpcStackProps extends cdk.StackProps {
  vpc: ec2.IVpc;
}

5.    VpcStack에서 ExportValue를 사용하는 또 다른 스택을 생성합니다.

  • SecurityGroupStackpropsVpcStackProps를 사용합니다.
  • 보안 그룹 속성에서 상호 참조할 vpc: props.vpc를 추가합니다.
export class SecurityGroupStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props: VpcStackProps) {
    super(scope, id, props);
    const securityGroupName = "BastionHostSg";
    const SecurityGroup = new ec2.SecurityGroup(this, 'securityGroupName', {
      vpc: props.vpc,
      allowAllOutbound: true,
      securityGroupName: securityGroupName,
    });
  }
}

6.    bin/my-project/ts 파일에 다음을 추가합니다.

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import {VpcStack, SecurityGroupStack} from '../lib/my-project-stack';
const app = new cdk.App();
const vpc_stack = new VpcStack(app, 'vpc-stack', {});
const sg_stack = new SecurityGroupStack(app, 'sg-stack', {
    vpc: vpc_stack.vpc,
});

7.    다음 명령을 실행하여 AWS CDK 애플리케이션을 배포합니다.

npm update
``````plaintext
cdk deploy --all

참고: AWS CDK 애플리케이션이 배포되면 vpc-stackExportValuesg-stack에서 가져옵니다.

(파라미터 저장소 메서드) CloudFormation 오류를 방지하기 위한 스택 생성 및 스택 간 참조

AWS Certificate Manager(ACM) 스택 및 Application Load Balancer(ALB) 스택 생성

AWS CloudFormation 오류 STACK_NAME에서 사용 중이므로 Export EXPORT_NAME을 업데이트할 수 없음가 발생하면 다음 단계를 완료하십시오.

1.    프로젝트를 생성하고 빈 디렉터리에서 cdk init를 호출합니다.

mkdir my-project
cd my-project
cdk init --language typescript

2.    lib/my-project-stack.ts의 이름을 lib/acm-stack.ts로 변경합니다. 그런 후 다음 AWS CDK 모듈을 가져옵니다.

import \* as cdk from 'aws-cdk-lib';
import \* as acm from "aws-cdk-lib/aws-certificatemanager";
import \* as ssm from "aws-cdk-lib/aws-ssm";
import {Construct} from 'constructs';

3.    lib/acm-stack.ts에서 인터페이스 acmProps를 정의하고 내보냅니다.

export interface acmProps extends cdk.StackProps {
 readonly acmName: string;
 readonly acmArnExportPath: string;
}

4.    acm-stack.ts파일에 다음을 추가합니다.

  • 이름이 acmStack인 스택을 정의합니다.
  • 지정된 domainName 및 지정된 validation 세트로 ACM 인증서를 생성합니다.
  • SSM 파라미터 저장소를 생성하여 인증서 ARN을 값으로 추가합니다.    

중요: 모든 AWS Command Line Interface(AWS CLI) 명령을 확인하고 example 문자열의 모든 인스턴스를 사용자 값으로 바꾸세요. 예를 들어 example_domainName을 지정된 도메인 이름으로 바꿉니다.

export class acmStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props: acmProps) {
    super(scope, id, props);
    const cert = new acm.Certificate(this, 'Certificate', {
        domainName: 'example_domainName.com',
        validation: acm.CertificateValidation.fromDns(),
    });
    const parameter = new ssm.StringParameter(this, 'acmArnParameter', {
        parameterName: props.acmArnExportPath,
        stringValue: cert.certificateArn,
    });
    }
}

참고: validation: 특성의 경우 특정 요구 사항에 맞게 유효성 검사 방법을 수정할 수 있습니다. 자세한 내용은유효성 검사 메서드를 참조하십시오.

5.    /lib 디렉터리에 이름이 albStack인 파일을 생성합니다. 그런 후 다음 AWS CDK 모듈을 가져옵니다.

import * as cdk from 'aws-cdk-lib';
import * as ec2 from "aws-cdk-lib/aws-ec2";
import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';
import * as ssm from "aws-cdk-lib/aws-ssm";
import * as acm from "aws-cdk-lib/aws-certificatemanager";
import {Construct} from 'constructs';

6.    인터페이스를 정의합니다.

export interface albProps extends cdk.StackProps {
    readonly acmArnExportPath: string;
}

7.    AWS CDK 애플리케이션의 lib/alb-stack.ts 파일에 다음 코드를 추가하여 다음을 수행하십시오.

  • 하나의 natGateway로 Amazon VPC를 생성하여 비용을 줄입니다.
  • acmArn을 정의하여 SSM 파라미터 저장소에서 값을 검색합니다.
  • acmArn(형식: String)을 형식: IListenerCertificate로 변환하는 인증서를 정의합니다.
  • ALB를 생성합니다.
  • 인증서(형식: IListenerCertificate)의 값을 참조하는 sslCertificateArn및 리스너를 추가합니다.
export class albStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props: albProps) {
    super(scope, id, props);
    const vpc = new ec2.Vpc(this, "VPC", { natGateways:1 });
    const acmArn = ssm.StringParameter.valueForStringParameter(this, props.acmArnExportPath);
    const certificate = acm.Certificate.fromCertificateArn(this, 'acm', acmArn);
    const alb = new elbv2.ApplicationLoadBalancer(this, 'ALB', {
        vpc,
        internetFacing: true,
        });
        alb.addRedirect();
    const listener = alb.addListener ('Listener',{
        port: 443,
        certificates: [certificate],
        });
        listener.addTargets('Instance', {port: 80});
    }
}

8.    bin/my-project.ts 파일에 다음 코드를 추가하여 다음을 수행하십시오.

  • env 변수를 정의합니다.
  • certificateArnSsmPath를 정의합니다.
  • AWS CDK 애플리케이션을 정의합니다.
  • AWS CDK 스택 이름cdk-ssm-acm-stack을 사용하여 ACM 스택을 정의합니다.
  • AWS CDK 스택 이름cdk-ssm-alb-stack을 사용하여 ALB 스택을 정의합니다.
  • ACM 및 ALB 스택에 대한 종속성을 추가하여 ACM 스택이 ALB 스택보다 먼저 생성되도록 합니다.
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import {acmStack, acmProps} from '../lib/acm-stack';
import {albStack, albProps} from '../lib/alb-stack';
import {addDependency} from 'aws-cdk-lib/core/lib/deps';

const env = {account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION}
const certificateArnSsmPath = "/cdk/acm/cross-stacks-reference/certArn";
const app = new cdk.App();
const acm_stack = new acmStack(app, "cdk-ssm-acm-stack", {
    env: env,
    acmName: "ssm-acm",
    acmArnExportPath: certificateArnSsmPath,
});
const alb_stack = new albStack(app, "cdk-ssm-alb-stack", {
    env: env,
    acmArnExportPath: certificateArnSsmPath,
});
alb_stack.addDependency(acm_stack)

9.    다음 명령을 사용하여 AWS CDK 애플리케이션을 배포합니다.

npm update
``````plaintext
cdk deploy --all

ACM 인증서 갱신

만료되기 전에 ACM 인증서를 갱신하고 CloudFormation이 UPDATE_COMPLETE_CLEANUP_IN_PROGRESS 상태에서 중단되지 않도록 하려면 다음 단계를 완료하십시오.

1.    lib/acm-stack.ts 파일에 새 인증서를 추가하고 이름을 renew로 지정합니다. 그런 다음, 파라미터stringValue 특성을 renew.certificateArn으로 변경합니다.

export class acmStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props: acmProps) {
    super(scope, id, props);
    const cert = new acm.Certificate(this, 'Certificate', {
        domainName: 'example_domainName.com',
        validation: acm.CertificateValidation.fromDns(),
    });
    const renew = new acm.Certificate(this, 'renewCertificate', {
       domainName: 'example_domainName.com',
       validation: acm.CertificateValidation.fromDns(),
    });
    const parameter = new ssm.StringParameter(this, 'acmArnParameter', {
        parameterName: props.acmArnExportPath,
        stringValue: renew.certificateArn,
    });
    }
}

2.    AWS CDK 애플리케이션을 업데이트합니다.

cdk deploy --all

3.    스택이 업데이트되면 다음을 수행하여 이전 인증서를 정리하십시오.

  • 인증서 구성을 제거하거나 인증서 구문 앞에 **//**를 추가하여 주석으로 처리합니다.
  • example_domainName을 지정된 도메인 이름으로 바꿉니다.
export class acmStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props: acmProps) {
    super(scope, id, props);
    // const cert = new acm.Certificate(this, 'Certificate', {
    //     domainName: 'example_domainName.com',
    //     validation: acm.CertificateValidation.fromDns(),
    // });
    const renew = new acm.Certificate(this, 'renewCertificate', {
       domainName: 'example_domainName.com',
       validation: acm.CertificateValidation.fromDns(),
    });
    const parameter = new ssm.StringParameter(this, 'acmArnParameter', {
        parameterName: props.acmArnExportPath,
        stringValue: renew.certificateArn,
    });
    }
}

4.    AWS CDK 애플리케이션을 업데이트하여 이전 인증서를 정리하십시오.

AWS 공식
AWS 공식업데이트됨 일 년 전