본문 바로가기

개발/AWS

[AWS] CDK 시작하기 & Argument of type 'this' is not assignable to parameter of type 'Construct' 이슈 해결

반응형

1. CDK Cli 설치 및 CDK bootstrap

AWS CDK CLI를 설치하려면 먼저 Node Package Manager(NPM)가 설치되어 있어야 합니다. 

# npm으로 aws-cdk 설치
npm install -g aws-cdk  

# 성공적으로 설치 되었는지 확인
cdk --version 
# > 2.20.0 (build 738ef49)

 

배포하게 될 대개의 AWS CDK 스택들은 스택과 함께 배포되는 외부 파일(예: AWS Lambda 함수나 Docker 이미지) 등의 자산을 포함하고 있습니다. CDK는 이를 Amazon S3 버킷 또는 기타 컨테이너에 업로드하여 배포 중에 AWS CloudFormation에서 사용할 수 있게 합니다. 배포하려면 이러한 컨테이너가 AWS 계정 및 배포하려는 리전에 이미 존재해야 합니다. 이러한 컨테이너를 생성하는 작업을 부트스트래핑이라고 합니다. AWS 계정(및 해당 리전)을 부트스트랩하려면 다음을 실행합니다.

cdk bootstrap
# Output
⏳  Bootstrapping environment aws://123456789012/us-east-1...
CDKToolkit: creating CloudFormation changeset...

✅  Environment aws://328159166015/us-west-2 bootstrapped.

부트스트랩을 실행하고 나면 AWS 계정의 Cloudformation 서비스에서 CDKToolKit이라는 스택을 확인할 수 있습니다.

이는 aws 리소스 배포에 필요한 S3 버킷, IAM, ECR 등을 포함합니다.

부트스트랩으로 생성된 리소스를 확인하려면 Cloudformation > CDK ToolKit > '리소스' 탭을 보면 됩니다.

 

❗ 이 때 생성된 리소스를 임의로 지우면 cdk 기반의 deploy가 정상적으로 진행되지 않습니다!

관련 리소스를 확인해보시고 절대 지우지 마시고..

혹시 지우셨다면 관련 리소스를 아예 다 지운다음에 새로 cdk deploy를 해야 합니다.

 

 

2. AWS Configure

로컬 PC에서 aws리소스에 접근하기 위해서 필요한 절차입니다.

AWS 콘솔에서 사용자를 추가해주세요

 

IAM > 액세스관리 > 사용자 > '사용자 추가' 

AWS 자격 증명 유형 : 액세스키  - 프로그래밍 방식 엑세스

권한설정 : Administrator Access

 

[1]

 

[2]

 

[3]

 

이렇게 발급받은 액세스 키 ID와 비밀 엑세스 키를 local pc에 등록해줍니다.

로컬 터미널 창에서 aws configure 명령을 입력 후 정보를 등록해주세요. 

$ aws configure
AWS Access Key ID : [발급받은 Access key id 입력]
AWS Secret Access Key : [발급받은 Access key pw 입력]
Default region name [None]: ap-northeast-2
Default output format [None]: json

 

3. CDK 프로젝트 생성하기 

CDK프로젝트를 만들 새로운 디렉토리를 생성해줍니다.

디렉토리 이름은 cdk-pardon으로 하였습니다.  (지금 생성한 디렉토리 이름과 동일한 이름의 CDK프로젝트가 생성됩니다.)

CDK 는 다양한 언어를 지원하는데 typescript 기반으로 생성하겠습니다.

mkdir cdk-pardon
cd cdk-pardon
cdk init --language typescript

 

이런 파일 구조로 cdk 프로젝트가 생성됩니다.

  • bin/cdk-project.ts - CDK 애플리케이션에 대한 진입 포인트입니다. lib/* 하위에 정의한 모든 스택을 로드/생성합니다.
  • lib/cdk-project-stack.ts - 주요 CDK 애플리케이션이 정의되는 지점입니다. 리소스 및 그 속성이 여기로 이동할 수 있습니다.
  • package.json - 프로젝트 종속 파일, 그리고 일부 추가 정보를 정의하고 스크립트를 구축하는 지점입니다(npm buildnpm testnpm watch).
  • cdk.json - 이 파일은 애플리케이션은 물론 CDK 및 프로젝트에 관련된 일부 추가 설정 및 파라미터를 실행하는 방법에 대한 도구 키트를 알려줍니다.

코드 작성의 시작점은 lib/cdk-project-stack.ts 파일입니다. 

 

4.  디폴트 코드 수정(lib/cdk-project.ts, lib/cdk-project-stack.ts)

lib/cdk-project.ts, lib/cdk-project-stack.ts 의 코드를 모두 삭제하고 아래 코드로 바꿔줍니다. 

// bin/cdk-project.ts

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { Cdk2PardonStack } from '../lib/cdk2-pardon-stack';

const app = new cdk.App();
new Cdk2PardonStack(app, 'Cdk2PardonStack', {
  /* If you don't specify 'env', this stack will be environment-agnostic.
   * Account/Region-dependent features and context lookups will not work,
   * but a single synthesized template can be deployed anywhere. */

  /* Uncomment the next line to specialize this stack for the AWS Account
   * and Region that are implied by the current CLI configuration. */
  // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION },

  /* Uncomment the next line if you know exactly what Account and Region you
   * want to deploy the stack to. */
  // env: { account: '123456789012', region: 'us-east-1' },

  /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */
});
app.synth();
// lib/cdk-project-stack.ts 

import { App, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';

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

 

❗ this 를 넘겨줄 때 나는 에러 해결

Argument of type 'this' is not assignable to parameter of type 'Construct'.

라는 에러메시지와 함께 this에 빨간줄이 그어지는 경우가 있습니다.

이럴 땐 리소스를 리소스 임포트를

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

와 같이 'aws-cdk-lib/' 에서 했는지 확인해보세요. 
import * as dynamodb from '@aws-cdk/aws-dynamodb';

이렇게 '@aws-cdk/' 에서 리소스를 임포트 하면 버전 오류가 나서 this가 정상적으로 전달되지 않습니다.

 

4.  S3, dynamoDB생성

일단은 각 리소스에 대한 별다른 세팅 없이 생성을 확인해보겠습니다. 

lib/cdk-project-stack.ts 를 아래와 같이 작성해줍니다. 

import { App, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
import * as s3 from 'aws-cdk-lib/aws-s3';
export class CdkPardonStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    
    // dynamoDB 생성
    const table = new dynamodb.Table(this, 'PrdPardonDdbMain', {
      tableName: 'PrdPardonDdbMain',
      partitionKey: { name: 'pk', type: dynamodb.AttributeType.STRING },
    });

    // 버킷 생성 
    const bucket = new s3.Bucket(this, 'prd-pardon-main', {
      bucketName: 'prd-pardon-main'
    });

  }
}

 

이렇게 작성한 리소스 스택을 aws상에 배포하려면 aws deploy명령어를 실행합니다. 

cdk deploy​

 

 

AWS 콘솔에 가보면 리소스들이 정상적으로 생성된 것을 확인할 수 있습니다. 

 

 

참고)

AWS AWS Cloud Development Kit(CDK) 설치

https://aws.amazon.com/ko/getting-started/guides/setup-cdk/module-two/

CDK 프로젝트 생성

https://aws.amazon.com/ko/getting-started/guides/setup-cdk/module-three/

Argument of type 'this' is not assignable to parameter of type 'Construct'. 이슈 관련

https://stackoverflow.com/questions/70652702/argument-of-type-app-is-not-assignable-to-parameter-of-type-construct

 

반응형