AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
단일 CDK 프로젝트에서 스택 간 참조를 위한 구성 객체를 전달하려면 어떻게 해야 합니까?
단일 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를 사용하는 또 다른 스택을 생성합니다.
- SecurityGroupStack은 props의 VpcStackProps를 사용합니다.
- 보안 그룹 속성에서 상호 참조할 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-stack의 ExportValue를 sg-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 애플리케이션을 업데이트하여 이전 인증서를 정리하십시오.
- 언어
- 한국어
