CDK - EKS Cluster


CDK

CDK란 AWS Cloud Development Kit로 소스코드 개발을 통해 CloudFormation을 배포하고 AWS리소스를 관리할 수 있다.

1. CDK 시작하기

# Init
project_name=eks-test
cd ~/workspace/cdk
mkdir $project_name
cd $project_name
cdk init --language typescript

커맨드를 수행하고 나면 bin, lib 등의 폴더 및 파일들이 생성된다.

  • bin 폴더에는 $project_name.ts 파일이 생성된다. 일반적으로 이 곳에는 환경변수 등을 설정한다.
  • lib 폴더에는 eks-test-stack.ts 파일이 생성된다. 일반적으로 이 곳에서 생성할 리소스를 정의한다.

AWS에서는 CDK에 필요한 여러 모듈을 기본적으로 제공해주고 있다. EKS같은 경우 aws-cdk-lib.aws_eks module를 통해 생성할 수 있으며 다양한 기본 샘플을 제공한다.

이러한 Lib를 추가하여 쉽게 AWS 리소스를 배포할 수 있으며 다음 장에서 실제 샘플 소스코드를 배포하는 방법을 확인한다.


2. CDK 소스 수정

  • bin
    • bin폴더에는 ${project_name}.ts 파일이 생성된다. 일반적으로 이 곳에는 환경변수 등을 설정한다.
      import 'source-map-support/register';
      import * as cdk from 'aws-cdk-lib';
      import { EksTestStack } from '../lib/eks-test-stack';
      
      const app = new cdk.App();
      new EksTestStack(app, 'EksTestStack', {
        /* 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: '11111222223', region: 'ap-southeast-2' },
      
        /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */
      });
      
  • lib
    • lib폴더에는 ${project_name}-stack.ts 파일이 생성된다. 일반적으로 이 곳에서 생성할 리소스를 정의한다.
      import * as cdk from 'aws-cdk-lib';
      //import * as iam from 'aws-cdk-lib/aws-iam';
      import * as eks from 'aws-cdk-lib/aws-eks';
      //import * as ec2 from 'aws-cdk-lib/aws-ec2';
      //import * as lambda from 'aws-cdk-lib/aws-lambda';
      import { KubectlV27Layer } from '@aws-cdk/lambda-layer-kubectl-v27';
      import { Construct } from 'constructs';
      // import * as sqs from 'aws-cdk-lib/aws-sqs';
      
      export class EksTestStack extends cdk.Stack {
        constructor(scope: Construct, id: string, props?: cdk.StackProps) {
          super(scope, id, props);
      
          const cluster = new eks.Cluster(this, 'test-eks', {
          version: eks.KubernetesVersion.V1_27,
          kubectlLayer: new KubectlV27Layer(this, 'kubectl'),
          albController: {
            version: eks.AlbControllerVersion.V2_5_1,
            // policy: document, //policy 추가
          },
          });
        }
      }
      
  • package.json
    @aws-cdk/lambda-layer-kubectl-v27 다음 모듈을 package.json에 추가해주어야 한다.
      "dependencies": {
        "@aws-cdk/lambda-layer-kubectl-v27": "^2.0.0",
        "aws-cdk-lib": "2.91.0",
        "constructs": "^10.0.0",
        "source-map-support": "^0.5.21"
      }
    


3. 배포하기

  # Install dependencies in package.json
  $ npm install 

  $ npm run build

  $ cdk deploy
  ✨  Synthesis time: 2.5s
  ......
  Do you wish to deploy these changes (y/n)? y
  EksTestStack: deploying... [1/1]
  EksTestStack: creating CloudFormation changeset...

  ✅  EksTestStack

  ✨  Deployment time: 966.01s

  Stack ARN:
  arn:aws:cloudformation:ap-southeast-2:558846430793:stack/EksTestStack/3e1292f0-4704-11ee-bcb5-025affa237e8

  ✨  Total time: 968.5s

이렇게 배포를 진행하게 되면 CloudFormation 스택을 생성하게 되며 CloudFormation을 통해 AWS 리소스를 배포하게 된다.




  • References
    [1] https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_eks-readme.html

Tag: [ aws  cloud  eks  cdk  ]