

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# TypeScript와 함께 AWS CDK를 사용하여 다중 스택 애플리케이션 배포하기
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript"></a>

*Rahul Sharad Gaikwad 박사, Amazon Web Services*

## 요약
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-summary"></a>

이 패턴은 TypeScript와 함께 AWS Cloud Development Kit(AWS CDK)를 사용하여 Amazon Web Services(AWS) 에 애플리케이션을 배포하기 위한 단계별 접근 방식을 제공합니다. 예를 들어, 이 패턴은 서버리스 실시간 분석 애플리케이션을 배포합니다.

이 패턴은 중첩된 스택 애플리케이션을 빌드하고 배포합니다. 상위 AWS CloudFormation 스택은 하위 또는 중첩된 스택을 호출합니다.  각 하위 스택은 CloudFormation 스택에 정의된 AWS 리소스를 구축하고 배포합니다. AWS CDK Toolkit인 명령줄 인터페이스(CLI) 명령 `cdk`는 CloudFormation 스택의 기본 인터페이스입니다.

## 사전 조건 및 제한 사항
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ 기존 Virtual Private Cloud(VPC) 및 서브넷
+ AWS CDK Toolkit이 설치 및 구성됨
+ 관리자 권한이 있는 사용자 및 액세스 키 세트.
+ Node.js
+ AWS Command Line Interface(AWS CLI)

**제한 사항 **
+ AWS CDK는 AWS CloudFormation을 사용하므로 AWS CDK 애플리케이션에는 CloudFormation Service Quotas가 적용됩니다. 자세한 정보는 [AWS CloudFormation 할당량](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html)을 참조하세요.

**제품 버전**

이 패턴은 다음 도구 및 버전을 사용하여 구축 및 테스트되었습니다.
+ AWS CDK Toolkit 1.83.0
+ Node.js 14.13.0
+ npm 7.0.14

이 패턴은 모든 버전의 AWS CDK 또는 npm에서 작동해야 합니다. 참고로 Node.js 버전 13.0.0부터 13.6.0까지는 AWS CDK와 호환되지 않습니다.

## 아키텍처
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-architecture"></a>

**대상 기술 스택  **
+ AWS Amplify Console
+ Amazon API Gateway
+ AWS CDK
+ Amazon CloudFront
+ Amazon Cognito
+ Amazon DynamoDB
+ Amazon Data Firehose
+ Amazon Kinesis Data Streams
+ AWS Lambda
+ Amazon Simple Storage Service (S3)

**대상 아키텍처**

다음 다이어그램은 TypeScript와 함께 AWS CDK를 사용한 다중 스택 애플리케이션 배포를 보여줍니다.

![\[VPC의 스택 아키텍처, 상위 스택 1개 및 리소스가 포함된 하위 스택 2개.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/0ac29a11-1362-4084-92ed-6b85205763ca/images/8f92e86a-aa3d-4f8a-9b11-b92c52a7226c.png)


 

다음 다이어그램은 예제 서버리스 실시간 애플리케이션의 아키텍처를 나타냅니다.

![\[리전의 애플리케이션 아키텍처\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/0ac29a11-1362-4084-92ed-6b85205763ca/images/2df00faf-f871-4aec-9655-19ba2eb14cf8.png)


 

## 도구
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-tools"></a>

**도구**
+ [AWS Amplify 콘솔](https://docs.aws.amazon.com/amplify/latest/userguide/welcome.html)은 AWS에서의 풀스택 웹 및 모바일 애플리케이션 배포를 위한 제어 센터입니다. Amplify Console 호스팅은 지속적인 배포로 풀스택 서버리스 웹 앱을 호스팅하기 위한 Git 기반 워크플로를 제공합니다. 관리 UI는 프런트엔드 웹 및 모바일 개발자가 AWS Console 외부에서 앱 백엔드를 만들고 관리할 수 있는 시각적 인터페이스입니다.
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)는 규모와 관계 없이 REST 및 WebSocket API를 생성, 게시, 유지, 모니터링 및 보호하기 위한 AWS 서비스입니다.
+ [AWS Cloud Development Kit(AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html)는 AWS 클라우드 인프라를 코드로 정의하고 프로비저닝하는 데 도움이 되는 소프트웨어 개발 프레임워크입니다.
+ [AWS CDK 툴킷](https://docs.aws.amazon.com/cdk/latest/guide/cli.html)은 AWS CDK 앱과 상호 작용하는 데 도움이 되는 명령줄 클라우드 개발 키트입니다. `cdk` CLI 명령은 AWS CDK 앱과 상호 작용하는 기본 도구입니다. 앱을 실행하고, 정의한 애플리케이션 모델 정보를 얻고, AWS CloudFormation 템플릿(AWS CDK에서 생성)을 배포합니다.
+ [Amazon CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html)는 .html, .css, .js 및 이미지 파일과 같은 정적 및 동적 웹 콘텐츠를 더 빨리 배포하도록 지원하는 웹 서비스입니다. CloudFront는 엣지 로케이션이라고 하는 데이터 센터의 전 세계 네트워크를 통해 더 짧은 지연 시간과 향상된 성능으로 콘텐츠를 제공합니다.
+ [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html)는 웹 및 모바일 앱에 대한 인증, 권한 부여 및 사용자 관리를 제공합니다. 사용자가 직접 로그인하거나 타사를 통해 로그인할 수 있습니다.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)는 완전관리형 NoSQL 데이터베이스 서비스로서 원활한 확장성과 함께 빠르고 예측 가능한 성능을 제공합니다.
+ [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html)는 Amazon S3, Amazon Redshift, Amazon OpenSearch Service, Splunk, 그리고 모든 사용자 지정 HTTP 엔드포인트 또는 서드 파티 서비스 제공업체가 소유 및 지원하는 소유한 HTTP 엔드포인트 등의 대상으로 실시간 [스트리밍 데이터](https://aws.amazon.com/streaming-data/)를 전송하는 완전관리형 서비스입니다.
+ [Amazon Kinesis Data Streams](https://docs.aws.amazon.com/streams/latest/dev/introduction.html)는 대규모 데이터 레코드 스트림을 실시간으로 수집하고 처리하는 서비스입니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다. Lambda는 필요 시에만 코드를 실행하며, 일일 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 규모를 조정합니다. 사용한 컴퓨팅 시간만큼만 비용을 지불하고, 코드가 실행되지 않을 때는 요금이 부과되지 않습니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.

**코드**

이 패턴의 코드가 첨부되어 있습니다.

## 에픽
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-epics"></a>

### AWS CDK Toolkit 설치
<a name="install-aws-cdk-toolkit"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| AWS CDK Toolkit을 설치합니다. | AWS CDK Toolkit을 전역적으로 설치하려면 다음 명령을 실행합니다.`npm install -g aws-cdk` | DevOps | 
| 버전을 확인합니다. | AWS CDK Toolkit 버전을 확인하려면 다음 명령을 실행하세요. `cdk --version` | DevOps | 

### AWS 보안 인증 설정
<a name="set-up-aws-credentials"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 보안 인증을 설정합니다. | 보안 인증 정보를 설정하려면 `aws configure` 명령을 실행하고 프롬프트를 따르세요.<pre>$aws configure<br />AWS Access Key ID [None]: <br />AWS Secret Access Key [None]: your_secret_access_key<br />Default region name [None]:<br />Default output format [None]:</pre> | DevOps | 

### 프로젝트 코드 다운로드
<a name="download-the-project-code"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 첨부된 프로젝트 코드를 다운로드합니다. | 디렉토리 및 파일 구조에 대한 자세한 내용은 *추가 정보* 섹션을 참고하십시오. | DevOps | 

### AWS CDK 환경 부트스트랩
<a name="bootstrap-the-aws-cdk-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 환경을 부트스트랩합니다. | 사용하려는 계정 및 AWS 리전에 AWS CloudFormation 템플릿을 배포하려면 다음 명령을 실행합니다.`cdk bootstrap <account>/<Region>`자세한 내용은 [AWS 설명서](https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html)를 참조하세요. | DevOps | 

### 프로젝트 구축 및 배포
<a name="build-and-deploy-the-project"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 프로젝트를 빌드합니다. | 프로젝트 코드를 빌드하려면 `npm run build` 명령을 실행하세요. | DevOps | 
| 프로젝트를 배포합니다. | 프로젝트 코드를 배포하려면 `cdk deploy` 명령을 실행하세요. |  | 

### 출력 확인
<a name="verify-outputs"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 스택 생성을 확인합니다. | AWS Management Console에서 **CloudFormation**을 선택합니다. 프로젝트의 스택에서 상위 스택과 두 개의 하위 스택이 생성되었는지 확인합니다. | DevOps | 

### 애플리케이션 테스트
<a name="test-the-application"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Kinesis Data Streams로 데이터를 전송합니다. | Amazon Kinesis Data Generator(KDG)를 사용하여 Kinesis Data Streams으로 데이터를 전송하도록 AWS 계정을 구성합니다. 자세한 내용은 [Amazon Kinesis Data Generator](https://awslabs.github.io/amazon-kinesis-data-generator/web/help.html)를 참조하세요. | DevOps | 
| Amazon Cognito 사용자를 생성합니다. | Amazon Cognito 사용자를 생성하려면 [Kinesis Data Streams 도움말 페이지](https://awslabs.github.io/amazon-kinesis-data-generator/web/help.html)의 *Amazon Cognito 사용자 생성* 섹션에서 cognito-setup.json CloudFormation 템플릿을 다운로드하십시오. 템플릿을 시작한 다음 Amazon Cognito **사용자 이름**과 **암호**를 입력합니다.**출력** 탭에는 Kinesis Data Generator URL이 나열됩니다. | DevOps | 
| Kinesis Data Generator에 로그인 | KDG에 로그인하려면 제공한 Amazon Cognito 보안 인증 정보와 Kinesis Data Generator URL을 사용하십시오. | DevOps | 
| 애플리케이션을 테스트합니다. | KDG의 **레코드 템플릿**, **템플릿 1**에서 *추가 정보* 섹션의 테스트 코드를 붙여넣고 **데이터 보내기**를 선택합니다. | DevOps | 
| API Gateway를 테스트합니다. | 데이터를 수집한 후에는 `GET` 메서드를 사용하여 데이터를 검색하여 API Gateway를 테스트합니다. | DevOps | 

## 관련 리소스
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-resources"></a>

**참조**
+ [AWS Cloud Development Kit](https://aws.amazon.com/cdk/)
+ [GitHub에서의 AWS CDK](https://github.com/aws/aws-cdk)
+ [중첩 스택 작업](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html)
+ [AWS 샘플 예제 - 서버리스 실시간 분석](https://github.com/aws-samples/serverless-realtime-analytics)

## 추가 정보
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-additional"></a>

**디렉터리 및 파일 세부 정보**

이 패턴은 다음 세 개의 스택을 설정합니다.
+ `parent-cdk-stack.ts` - 이 스택은 상위 스택 역할을 하며 두 하위 애플리케이션을 중첩된 스택으로 호출합니다. 
+ `real-time-analytics-poc-stack.ts` - 이 중첩된 스택에는 인프라 및 애플리케이션 코드가 포함됩니다.
+ `real-time-analytics-web-stack.ts` - 이 중첩된 스택에는 정적 웹 애플리케이션 코드만 포함됩니다.

*중요 파일 및 해당 기능*
+ `bin/real-time-analytics-poc.ts` - AWS CDK 애플리케이션의 엔트리 포인트. `lib/`에서 정의된 모든 스택을 로드합니다.
+ `lib/real-time-analytics-poc-stack.ts` - AWS CDK 애플리케이션 스택의 정의(`real-time-analytics-poc`).
+ `lib/real-time-analytics-web-stack.ts` - AWS CDK 애플리케이션 스택의 정의(`real-time-analytics-web-stack`).
+ `lib/parent-cdk-stack.ts` - AWS CDK 애플리케이션 스택의 정의(`parent-cdk`).
+ `package.json` - 애플리케이션 이름, 버전 및 종속성을 포함하는 npm 모듈 매니페스트.
+ `package-lock.json` - npm에서 유지 관리합니다.
+ `cdk.json` - 애플리케이션 실행을 위한 툴킷.
+ `tsconfig.json` - 프로젝트의 TypeScript 구성
+ `.gitignore` - Git이 소스 제어에서 제외해야 하는 파일 목록입니다.
+ `node_modules` - npm에서 유지 관리합니다. 프로젝트의 종속성을 포함합니다.

상위 스택의 다음 코드 섹션은 하위 애플리케이션을 중첩된 AWS CDK 스택으로 호출합니다.

```
import * as cdk from '@aws-cdk/core';
import { Construct, Stack, StackProps } from '@aws-cdk/core';
import { RealTimeAnalyticsPocStack } from './real-time-analytics-poc-stack';
import { RealTimeAnalyticsWebStack } from './real-time-analytics-web-stack';


export class CdkParentStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);


    new RealTimeAnalyticsPocStack(this, 'RealTimeAnalyticsPocStack');
    new RealTimeAnalyticsWebStack(this, 'RealTimeAnalyticsWebStack');
  }
}
```

**테스트용 코드**

```
session={{date.now('YYYYMMDD')}}|sequence={{date.now('x')}}|reception={{date.now('x')}}|instrument={{random.number(9)}}|l={{random.number(20)}}|price_0={{random.number({"min":10000, "max":30000})}}|price_1={{random.number({"min":10000, "max":30000})}}|price_2={{random.number({"min":10000, "max":30000})}}|price_3={{random.number({"min":10000, "max":30000})}}|price_4={{random.number({"min":10000, "max":30000})}}|price_5={{random.number({"min":10000, "max":30000})}}|price_6={{random.number({"min":10000, "max":30000})}}|price_7={{random.number({"min":10000, "max":30000})}}|price_8={{random.number({"min":10000, "max":30000})}}|
```

**API Gateway 테스트**

API Gateway 콘솔에서 `GET` 메서드를 사용하여 API Gateway 콘솔을 테스트합니다.

![\[OPTIONS에 GET이 선택된 API Gateway 콘솔.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/0ac29a11-1362-4084-92ed-6b85205763ca/images/452e5b8f-6d61-401d-8484-e5a436cb6f1b.png)


 

## 첨부
<a name="attachments-0ac29a11-1362-4084-92ed-6b85205763ca"></a>

이 문서와 관련된 추가 콘텐츠에 액세스하려면 [attachment.zip](samples/p-attach/0ac29a11-1362-4084-92ed-6b85205763ca/attachments/attachment.zip) 파일의 압축을 풉니다.