[AWS re:Invent2018] Infrastructure as Code를 구현하는 AWS CDK 사용

AWS 최대 이벤트re:Invent2018에 참여했습니다.
2018년 8월 공개된 클라우드 Development Kit(CDK)와 관련해서는 아래 세션에서도 소개가 있어 터치해보기도 했다.
DEV327 - Beyond the Basics: Advanced Infrastructure as Code Programming on AWS

이른바 AWS CDK


AWS CDK는 AWS에서 Infrastructure as Code의 프레임워크를 OSS화하기 위한 것이다.리소스를 Declative 대신 Imperative에서 정의할 수 있는 리소스CloudFormation가 아닌 것이 특징입니다.최종 자원 공급은 클라우드 포메이션 템플릿을 사용하기 때문에 클라우드 포메이션 기능을 포함하는 프레임워크입니다.
Declarative와 Imperative의 비교는 세션에서도 소개됩니다.

그 특징은 프로그래밍 언어를 사용하여 자원을 정의할 수 있다는 것이다. 집필할 때 지원하는 언어는 다음과 같다.
  • Java
  • Javascript, TypeScript
  • .NET
  • 시용하다


    나는 즉시 CDK로 자원을 미리 설정하고 싶다.
    이번 참조공식 강좌는 자바스크립트를 사용하여 자원을 정의합니다.

    시작 준비


    먼저 CDK의 CLI 키트를 설치합니다.설치에 필요한 환경Node.jsnpm
    다음 명령을 사용하여 CDK를 설치합니다.
    $ npm install -g aws-cdk
    $ cdk --version
    0.18.1 (build 9f7af21)
    
    집필할 때 CDK의 버전은 0.18.1이다.
    그런 다음 CDK를 사용하는 프로젝트를 만듭니다.
    다음 명령을 실행하여 프로젝트를 초기화합니다.
    $ mkdir reinvent2018-cdk
    $ cd reinvent2018-cdk
    $ npm init -y
    
    마지막으로 CDK 스택과 애플리케이션에 필요한 Core Library(@aws-Cdk/cdk)를 설치합니다.
    $ npm install @aws-cdk/cdk
    npm notice created a lockfile as package-lock.json. You should commit this file.
    npm WARN [email protected] No description
    npm WARN [email protected] No repository field.
    
    + @aws-cdk/[email protected]
    added 10 packages from 7 contributors and audited 10 packages in 2.102s
    found 0 vulnerabilities
    
    시작 준비를 사용하여 여기서 끝냅니다.

    자원 사전 설정


    AWS CDK에서 리소스는 애플, Stack(s), Construct(s) 3층에 의해 정의됩니다.

    즉시 자원을 정의합니다.

    사과 만들기


    먼저 애플리케이션을 제작한다.프로젝트 폴더에 bin/reinvent 2018-cdk가 있습니다.다음과 같이 Application에 대한 정의를 보여 주는 js 파일을 만듭니다.
    const cdk = require('@aws-cdk/cdk');
    
    class MyApp extends cdk.App {
        constructor() {
            super();
        }
    }
    
    new MyApp().run();
    
    AWS CDK로 제작된 Application은 cdk입니다.앱류를 계승해서 만든 것 같아요.
    CDK 응용 프로그램의 실행은 Javascript 이외의 언어를 사용할 때 컴파일해야 합니다.이번에는 Javascript이기 때문에 컴파일할 필요가 없습니다.
    이어서 cdk.cdk.cdk.cdk.cdk.cdk.cdk.cdk.cdk.cdk.cdk.cdk.cdk.cdk.cdk.cdk.cdk.cdk.cdk.cdk의 명령줄 도구로 만든 CDK Application입니다.json을 만드는 것은 다음과 같다.
    {
      "app": "node bin/reinvent2018-cdk.js"
    }
    
    다음 명령을 사용하여 Application 내의 Stack 차트를 가져옵니다.
    (이곳에서 AWS의Credentials 구성가 완료되었습니다.)
    Stack이 아직 제작되지 않았기 때문에 빈 배열로 돌아갑니다.
    $ cdk ls -l
    []
    

    Stack 작성


    그런 다음 Application에서 Stack을 만듭니다.
    방금 만든 bin/reinvent 2018-cdk.다음과 같이 js 정의 Stack을 업데이트합니다.
    const cdk = require('@aws-cdk/cdk');
    
    class MyStack extends cdk.Stack {
        constructor(parent, id, props) {
            super(parent, id, props);
        }
    }
    
    class MyApp extends cdk.App {
        constructor(argv) {
            super(argv);
    
            new MyStack(this, 'reinvent2018-cdk');
        }
    }
    
    new MyApp().run();
    
    Stack은 cdk입니다.Stack을 계승하여 제작합니다.parent, id,props 등 매개 변수는 문서를 참조하십시오.
    다음 명령을 실행하여 스택이 정의되었는지 확인합니다.
    $ cdk ls -l
    - name: reinvent2018-cdk
      environment:
        name: <account-id>/ap-northeast-1
        account: "<account-id>"
        region: ap-northeast-1
    
    순조롭게 진행되면 정의된 창고를 표시합니다.

    Costruct 작성


    마지막으로 Construct를 만듭니다.여기서 S3 세그먼트를 정의하고 생성합니다.
    위와 같이 제작된 bin/reinvent 2018-cdk.js의 Stack 내에서 S3 구간을 정의합니다.
    S3 패키지를 설치합니다.
    $ npm install @aws-cdk/aws-s3
    npm WARN [email protected] No description
    npm WARN [email protected] No repository field.
    
    + @aws-cdk/[email protected]
    added 6 packages from 1 contributor and audited 109 packages in 8.412s
    found 0 vulnerabilities
    
    bin/reinvent2018-cdk.다음은 js를 업데이트합니다.
    const cdk = require('@aws-cdk/cdk');
    const s3 = require('@aws-cdk/aws-s3');
    
    class MyStack extends cdk.Stack {
        constructor(parent, id, props) {
            super(parent, id, props);
            new s3.Bucket(this, 'MyReInventBucket', {
                versioned: true,
                bucketName: 'reinvent2018-cdk'
            });
        }
    }
    
    class MyApp extends cdk.App {
        constructor(argv) {
            super(argv);
    
            new MyStack(this, 'reinvent2018-cdk');
        }
    }
    
    new MyApp().run();
    
    Stack 정의에 S3 세그먼트에 대한 Controct가 추가되었습니다.

    자원 설계


    다음 명령을 사용하여 CDK에서 정의한 리소스를 추출합니다.
    $ cdk deploy
    reinvent2018-cdk: deploying...
    reinvent2018-cdk: creating CloudFormation changeset...
     0/3 | 15:48:07 | CREATE_IN_PROGRESS   | AWS::CDK::Metadata | CDKMetadata 
     0/3 | 15:48:08 | CREATE_IN_PROGRESS   | AWS::S3::Bucket    | MyReInventBucket (MyReInventBucket83E9F87D) 
     0/3 | 15:48:10 | CREATE_IN_PROGRESS   | AWS::S3::Bucket    | MyReInventBucket (MyReInventBucket83E9F87D) Resource creation Initiated
     0/3 | 15:48:10 | CREATE_IN_PROGRESS   | AWS::CDK::Metadata | CDKMetadata Resource creation Initiated
     1/3 | 15:48:11 | CREATE_COMPLETE      | AWS::CDK::Metadata | CDKMetadata 
     2/3 | 15:48:30 | CREATE_COMPLETE      | AWS::S3::Bucket    | MyReInventBucket (MyReInventBucket83E9F87D) 
    
     ✅  reinvent2018-cdk
    
    Stack ARN:
    arn:aws:cloudformation:ap-northeast-1:<account-id>:stack/reinvent2018-cdk/xxxxxxxxxxxxxxx
    
    delpoy 명령은 CDK 정의에서 CloudFormation 템플릿을 작성하여 CloudFormation을 통해 리소스를 만듭니다.
    실제 AWS 콘솔을 확인하면 클라우드 포메이션 스택과 S3 물통이 제작됐음을 확인할 수 있다.
    CloudFormation 스택

    S3통

    또한 S3 구간의 칸이 진짜로 설정되어 있기 때문에 칸도 활성화됩니다.
    슬롯 설정

    리소스 업데이트


    디버깅한 자원을 업데이트해 보십시오.
    디자인된bin/reinvent 2018-cdk.js의 일부분을 업데이트하고 버젼링 기능을 비활성화합니다.
    const cdk = require('@aws-cdk/cdk');
    const s3 = require('@aws-cdk/aws-s3');
    
    class MyStack extends cdk.Stack {
        constructor(parent, id, props) {
            super(parent, id, props);
            new s3.Bucket(this, 'MyReInventBucket', {
                versioned: false,
                bucketName: 'reinvent2018-cdk'
            });
        }
    }
    
    class MyApp extends cdk.App {
        constructor(argv) {
            super(argv);
    
            new MyStack(this, 'reinvent2018-cdk');
        }
    }
    
    new MyApp().run();
    
    업데이트 후 diff 명령을 사용하면 처리된 자원과의 차이를 확인할 수 있습니다.
    $ cdk diff
    Resources
    [~] AWS::S3::Bucket MyReInventBucket MyReInventBucket83E9F87D 
     └─ [-] VersioningConfiguration
         └─ {"Status":"Enabled"}
    
    창고를 업데이트하기 위해 deploy 명령을 다시 실행합니다.
    $ cdk deploy
    reinvent2018-cdk: deploying...
    reinvent2018-cdk: creating CloudFormation changeset...
     0/2 | 15:58:24 | UPDATE_IN_PROGRESS   | AWS::S3::Bucket    | MyReInventBucket (MyReInventBucket83E9F87D) 
     1/2 | 15:58:45 | UPDATE_COMPLETE      | AWS::S3::Bucket    | MyReInventBucket (MyReInventBucket83E9F87D) 
     1/2 | 15:58:47 | UPDATE_COMPLETE_CLEA | AWS::CloudFormation::Stack | reinvent2018-cdk 
     2/2 | 15:58:48 | UPDATE_COMPLETE      | AWS::CloudFormation::Stack | reinvent2018-cdk 
    
     ✅  reinvent2018-cdk
    
    Stack ARN:
    arn:aws:cloudformation:ap-northeast-1:<account-id>:stack/reinvent2018-cdk/xxxxxxxxxxxxxxx
    
    실제 콘솔도 클라우드포메이션의 스택과 S3의 슬롯 설정을 업데이트한 것을 확인했다.
    CloudFormation 스택

    슬롯 설정

    총결산


    나는 익숙한 프로그래밍 언어로 Infrastructure as Code를 구현할 수 있는 AWS CDK를 만졌다.이번에는 기본적인 부분만 접했지만 프로그래밍 언어로 기재할 수 있기 때문에 자원을 더욱 유연하게 정의할 수 있다고 생각합니다.집필할 때는 디벨로퍼 프리뷰로 앞으로 기능과 대응 언어가 더욱 충실해질 것으로 기대해 주세요.

    좋은 웹페이지 즐겨찾기