AWS CDK를 사용하여 ECS(Fargate) 환경을 쉽게 구축하는 방법

11559 단어 FargateCDKECSAWS
streampack의 Tana입니다.

ECS (Fargate) 환경을 수동으로 설정하려면 화면에서 보면 어느 정도 할 수 있지만,
ALB를 만들거나 Service, Task Definition 등을 설정하는 것은 복잡합니다.
또한 개념을 이해하는 데 시간이 걸립니다.
Dynamic Port Mapping을 사용하는 경우 Security Group에 inbound를 등록해야 하거나 시도 및 오류를 반복합니다.
구축만으로 피곤합니다.

따라서 AWS Cloud Template Kit (CDK)를 사용하면 20 줄 정도의 코드와 몇 번의 명령 실행으로
아래의 리소스와 함께 모범 사례인 ECS(Fargate) 환경을 구축해 주는 방법입니다.

네트워크
  • VPC
  • Subnets
  • Internet Gateway
  • NAT 게이트웨이 (EIP)
  • Route Tables
  • Security Group

  • ECS (Fargate)
  • ALB (Target Group, Security Group 포함)
  • Cluster
  • Service
  • Task Definition(Container)

  • CDK의 install이나 초기 순서등은 이쪽으로 기재 있기 때문에 할애합니다.
    htps : // 기주 b. 코 m / 아 ws ぁ bs / 아 ws-cdk # 껄껄 g-s r d

    cdk init로 작성된 템플릿을 바탕으로 아래가 실제로 작성한 코드입니다.
    Dockerhub를 사용하는 다른 예제가 있으므로 이번에는 ECR을 사용합니다.

    lib/demo-stack.ts
    import cdk = require('@aws-cdk/cdk');
    import ecs = require("@aws-cdk/aws-ecs");
    import ec2 = require("@aws-cdk/aws-ec2");
    import ecr = require("@aws-cdk/aws-ecr");
    
    export class DemoStack extends cdk.Stack {
      constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
    
        // ------------- ここを記載 --------------
        // ベストプラクティスなネットワーク環境の構築
        const vpc = new ec2.VpcNetwork(this, 'MyCdkVpc', {maxAZs: 2});
        const cluster = new ecs.Cluster(this, 'Cluster', {vpc});
    
        // ECSクラスタ設定(t2.medium指定)
        cluster.addDefaultAutoScalingGroupCapacity({instanceType: new ec2.InstanceType("t2.medium"), instanceCount: 1});
    
        // ECRを使用
        const repository = new ecr.Repository(this, 'myRepoName');
    
        // ECS(ALB/Service/Task Defintion/Container) 関連をまとめて構築
        new ecs.LoadBalancedEc2Service(this, 'Service', {
          cluster,
          memoryLimitMiB: 512,
          image: ecs.ContainerImage.fromEcrRepository(repository),
          containerPort: 8080,   // コンテナポート番号
          environment: {
            ENV: 'production'
          }
        });
        // ------------- ここまで --------------
      }
    }
    

    synth로 typescript 작성한 코드에서 CloudFormation Template(Yaml)에서 미리 확인할 수 있습니다.
    CloudFormation의 400행 정도의 코드를 작성할 필요가 없어집니다.
    $ cdk synth
    
    $ cdk deploy
    

    deploy는 IAM Policy 및 Security Group의 미리보기를 표시하고 AWS 계정에 빌드를 시작합니다.

    ECR을 사용하는 경우는 리포지토리까지 작성해 줍니다만, 어플리케이션의 Docker Image 를 push 해 줄 필요가 있습니다.
    따라서 생성된 리포지토리를 검색하고 이미지를 푸시합니다.
    # リポジトリ名を取得
    $ aws ecr describe-repositories | jq -r '.repositories[].repositoryName'
    ----
    demos-demoa-xxxxxx
    

    아래와 같은 명령(shell)을 실행하여 build&push 합니다.

    build_push.sh
    ECRID=xxxxxxxxx
    ECRNAME=demos-demoa-xxxxxx
    
    # build an your docker app
    docker build -t ${ECRNAME} .
    docker tag ${ECRNAME}:latest ${ECRID}.dkr.ecr.ap-northeast-1.amazonaws.com/${ECRNAME}:latest
    
    # push
    $(aws ecr get-login --no-include-email --region ap-northeast-1)
    docker push ${ECRID}.dkr.ecr.ap-northeast-1.amazonaws.com/${ECRNAME}:latest
    

    성공하면 ALB URL이 지불되므로 액세스하고 확인하고 결과가 반환되면 완료됩니다!


    결과가 제대로 표시되지 않으면 Cluster Event 로그 및 Task를 AWS 콘솔, ecs-cli 등을 사용하여 다시 확인합니다.
    ecs-cli ps --cluster DemoStack-Clusterxxxx-xxxxx
    

    대개 컨테이너 포트가 올바르지 않거나 환경 변수, ECR 리포지토리에 등록되어 있는지 확인합니다.

    삭제하려면 destory를 실행합니다. (사전에 ECR에 등록한 Image 삭제 필요)
    $ cdk destory
    

    CDK 단점으로서는 세세한 지정이나 조정하고 싶은 경우는, 별도로 각각 코드를 쓸 필요가 있을 것 같습니다.
    예를 들어,
  • 비용 절감을 위해 NAT 게이트웨이 (EIP)를 생략하고 싶습니다
  • 컨테이너의 log driver 나 ulimits 를 설정하고 싶다

  • 다음은 컨테이너에 log driver 등을 추가하는 경우입니다.

    demo-stack.ts
    
        const demoContainer = demoTaskDefinition.addContainer('demo-container', {
          image: ecs.ContainerImage.fromEcrRepository(repository),
          logging: new ecs.AwsLogDriver(this, 'demo-logging', { streamPrefix: 'demo-app' })
        });
    
        demoContainer.addUlimits(
          {
            name : ecs.UlimitName.Fsize,
            hardLimit : 10240000,
            softLimit : 10240000
          }
        )
    

    세세한 인수의 지정이나 props 의 지정은 CDK doc 로 브라우저에서 문서를 열어서 검색・확인할 수 있습니다.
    $ cdk docs
    

    아직 미리 보기로 향후 개선 더욱 개선될 것 같지만, ECS(Fargate) 환경을 자주 만들어 테스트하고 삭제하는 경우에는 최적입니다.

    CDK workshop도 있는 것 같아서, 한번 보고 시험해 보면 이미지가 솟아나갈까 생각합니다.
    htps : // cd 쿠 rk 쇼 p. 코m/

    좋은 웹페이지 즐겨찾기