AWS ECS에 10분간 Docker compose 스택을 배포합니다. Hasura와 Postgres의 경우⏰

소개하다.

ecs-cli명령은 작은 보석💎
👉 ecs-cli 파일 형식 버전 1, 2, 3과 같은 구문을 사용하여 AWS ECS에 Docker 스택을 쉽게 배치할 수 있습니다.
👉 ecs-cli의 장점은 파일 재사용docker-compose.yml이고 컨테이너를 AWS에 배치하는 것입니다.
👉 ecs-clidocker-compose-yml를 ECS 작업 정의 및 서비스로 변환
이 문서에서는 다음을 다룹니다.
  • 도구ecs-cli를 사용하여 AWS ECS 클러스터를 작성하여 Docker 컨테이너 세트
  • 를 조정합니다.
  • docker-compose로 인해 집단의 관측성이 증가하였다
  • ecs cli를 사용하여 그룹
  • 에 Docker 용기를 배치합니다
  • 활용AWS Cloud LogGroups 클러스터에 지속성 추가 및 상태 워크로드 지원
  • Amazon Elastic File System은 Amazon Web Services에서 제공하는 클라우드 스토리지 서비스로, AWS 클라우드 서비스와 내부 리소스를 사용할 수 있도록 확장성, 탄력성, 제한이 있는 동시 및 암호화 파일 저장소를 제공합니다.
    예를 들어, 다음 섹션으로 구성된 Docker 스택을 배치합니다.

  • AWS EFS: 즉각적인 GraphQL 및 Rest API
  • 를 제공하는 오픈 소스 엔진
  • 지구층의 PostgresSQL 13.2
  • 카술라 대상 아키텍처



    Docker stack


    이 Docker 스택은 AWS ECS Cluster에 배치됩니다.

    7보

  • 설치ecs-cli
  • 구성ecs-cli
  • 클러스터 스택 생성
  • 생성 Docker Compose Stack
  • AWS ECS에 docker compose 창고 배치
  • 유연한 파일 시스템 생성AWS EFS
  • Postgres SQL에 지속성 AWS EFS 추가
  • 선결 조건(macOS용)
  • jq
  • aws-cli
  • 양조 1단계:ecs cli 설치


    첫 번째 단계는 시스템에 ecs-cli 명령을 설치하는 것입니다.
    macOS, Linux, Windows의 전체 설치 과정은 이것 을 통해 얻을 수 있습니다.
    macOS의 경우 설치 프로그램은 다음과 같습니다.
    👉 다운로드ecs-cli 바이너리 파일
    sudo curl -Lo /usr/local/bin/ecs-cli https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-darwin-amd64-latest
    
    👉 설치link(OpenPGP 표준 무료 제공)
    brew install gnupg
    
    👉 ecs-cli의 공개 키 가져오기 (간단하게 보기 위해 요점의 키를 복사했습니다)
    https://gist.githubusercontent.com/raphaelmansuy/5aab3c9e6c03e532e9dcf6c97c78b4ff/raw/f39b4df58833f09eb381700a6a854b1adfea482e/ecs-cli-signature-key.key
    
    
    👉 서명 가져오기
    gpg --import ./signature.key
    
    👉 실행 가능
    sudo chmod +x /usr/local/bin/ecs-cli
    
    👉 설정 확인
    ecs-cli --version
    

    gnupg ecs cli 구성👩‍🌾


    선결 조건
  • AWS CLI v2를 설치해야 합니다.만약 그렇지 않다면 아래 설명에 따라 조작할 수 있습니다 .
  • 관리 권한이 있는 AWS ACCESS KEY ID/AWS SECRET ACCESS KEY
  • 가 필요합니다.
    AWS 액세스 키 ID를 만들려면 다음을 읽으십시오link.
    환경 변수는 올바른 AWS ACCESS KEY ID/AWS SECRET ACCESS KEY 쌍을 구성해야 합니다.
    export AWS_ACCESS_KEY_ID="Your Access Key"
    export AWS_SECRET_ACCESS_KEY="Your Secret Access Key"
    export AWS_DEFAULT_REGION=us-west-2
    
    다음 스크립트는 ecs-cli 영역에서 tutorial라는 클러스터 구성tutorial-cluster라는 ECS 구성 파일로, 이 클러스터의 기본 시작 유형은 EC2 인스턴스를 기반으로 합니다.us-west-2
    #!/bin/bash
    set -e
    PROFILE_NAME=tutorial
    CLUSTER_NAME=tutorial-cluster
    REGION=us-west-2
    LAUNCH_TYPE=EC2
    ecs-cli configure profile --profile-name "$PROFILE_NAME" --access-key "$AWS_ACCESS_KEY_ID" --secret-key "$AWS_SECRET_ACCESS_KEY"
    ecs-cli configure --cluster "$CLUSTER_NAME" --default-launch-type "$LAUNCH_TYPE" --region "$REGION" --config-name "$PROFILE_NAME"
    

    문서 2단계: ECS 클러스터 만들기🚀


    우리는 ec2 실례를 바탕으로 ECS 집단을 만들 것이다.
    ECS는 두 종류의 발사 유형configure.shEC2을 허용한다.
  • EC2(컨테이너를 실행하기 위해 자체 EC2 인스턴스 클러스터 배포 및 관리)
  • AWS Fargate(직접 실행 컨테이너, EC2 인스턴스 없음)
  • 만약 ssh로ec2 실례에 연결하려면 키 쌍이 필요합니다
    👉 이름이 FARGATE인 키 쌍을 만들려면 다음과 같이 하십시오.
    aws ec2 create-key-pair --key-name tutorial-cluster \
     --query 'KeyMaterial' --output text > ~/.ssh/tutorial-cluster.pem
    
    👉 2개의ec2 실례를 포함하는 그룹을 만듭니다 tutorial-cluster.중등이었어tutorial-cluster
    #!/bin/bash
    KEY_PAIR=tutorial-cluster
        ecs-cli up \
          --keypair $KEY_PAIR  \
          --capability-iam \
          --size 2 \
          --instance-type t3.medium \
          --tags project=tutorial-cluster,owner=raphael \
          --cluster-config tutorial \
          --ecs-profile tutorial
    
    두 개의 태그create-cluster.shproject=tutorial를 추가하여 명령에서 생성된 리소스를 쉽게 파악할 수 있습니다.
    👉 결실
    INFO[0006] Using recommended Amazon Linux 2 AMI with ECS Agent 1.50.2 and Docker version 19.03.13-ce
    INFO[0007] Created cluster                               cluster=tutorial-cluster region=us-west-2
    INFO[0010] Waiting for your cluster resources to be created...
    INFO[0010] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
    INFO[0073] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
    INFO[0136] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
    VPC created: vpc-XXXXX
    Security Group created: sg-XXXXX
    Subnet created: subnet-AAAA
    Subnet created: subnet-BBBB
    Cluster creation succeeded.
    
    이 명령은 다음을 생성하는 데 사용됩니다.
  • 새로운 공공 VPC
  • 인터넷 게이트웨이
  • 라우팅 테이블
  • 가용 영역 2개에 공통 서브넷 2개
  • 보안 그룹 1개
  • 1 자동 조정 그룹
  • 2개ec2 실례
  • 1개ecs 클러스터

  • 이제 새로 만든 ECS 클러스터에 예제 Docker 응용 프로그램을 배치할 수 있습니다.
    👉 owner=raphael라는 파일을 만듭니다.
    version: "3"
    services:
      webdemo:
        image: "amazon/amazon-ecs-sample"
        ports:
          - "80:80"
    
    
    이 창고는 로컬에서 테스트하는 것이 가장 좋다
    docker-compose up
    
    결과:
    최신: 아마존/아마존ecs 예시
    요약:sha256:36c7b282abd0186e01419f2e58743e1bf635808231049bbc9d77e59e3a8e4914
    상태:amazon/amazon ecs 업데이트 이미지 다운로드 예: 최신

    👉 이제 AWS ECS에 이 스택을 배치할 수 있습니다.
    ecs-cli compose --project-name tutorial  --file docker-compose.yml \
    --debug service up  \
    --deployment-max-percent 100 --deployment-min-healthy-percent 0 \
    --region us-west-2 --ecs-profile tutorial --cluster-config tutorial
    
    👉 서비스가 실행 중인지 확인하려면 다음 명령을 사용할 수 있습니다.
    ecs-cli ps
    
    결과:
    Name                                                       State    Ports                     TaskDefinition  Health
    tutorial-cluster/2e5af2d48dbc41c1a98/webdemo  RUNNING  34.217.107.14:80->80/tcp  tutorial:2      UNKNOWNK
    
    IP 주소docker-compose.yml를 사용하여 스택 배포 및 액세스
    👉 이제 배포된 웹 사이트를 탐색할 수 있습니다.
    open http://34.217.107.14
    
    👉 클러스터의 EC2 인스턴스에 연결하기 위해 포트 22 열기
    
    # Get my IP
    myip="$(dig +short myip.opendns.com @resolver1.opendns.com)"
    
    # Get the security group
    sg="$(aws ec2 describe-security-groups   --filters Name=tag:project,Values=tutorial-cluster | jq '.SecurityGroups[].GroupId')"
    
    # Add port 22 to the Security Group of the VPC
    aws ec2 authorize-security-group-ingress \
            --group-id $sg \
            --protocol tcp \
            --port 22 \
            --cidr "$myip/32" | jq '.'
    
    👉 인스턴스와의 연결
    chmod 400 ~/.ssh/tutorial-cluster.pem
    ssh -i ~/.ssh/tutorial-cluster.pem [email protected]
    
    👉 원격 서버에 연결하면 실행 중인 컨테이너를 확인할 수 있습니다.
    docker ps
    
    CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS                    PORTS                NAMES
    7deaa49ed72c        amazon/amazon-ecs-sample         "/usr/sbin/apache2 -…"   2 minutes ago       Up 2 minutes              0.0.0.0:80->80/tcp   ecs-tutorial-3-webdemo-9cb1a49483a9cfb7b101
    cd1d2a9807d4        amazon/amazon-ecs-agent:latest   "/agent"                 55 minutes ago      Up 55 minutes (healthy)                        ecs-agent
    

    단계 3: 관찰성 추가🤩


    실행 중인 인스턴스의 로그를 수집하려면 AWS CloudWatch 로그 그룹을 만들 수 있습니다.
    이를 위해 34.217.107.14 파일을 수정할 수 있습니다.
    version: "2"
    services:
      webdemo:
        image: "amazon/amazon-ecs-sample"
        ports:
          - "80:80"
        logging:
          driver: awslogs
          options:
             awslogs-group: tutorial
             awslogs-region: us-west-2
             awslogs-stream-prefix: demo
    
    👉 그런 다음 로그 그룹 만들기 옵션을 사용하여 서비스를 재배치합니다.
    ecs-cli compose --project-name tutorial  --file docker-compose.yml \
    --debug service up  \
    --deployment-max-percent 100 --deployment-min-healthy-percent 0 \
    --region us-west-2 --ecs-profile tutorial --cluster-config tutorial \
    --create-log-groups
    

    👉 저희는 이제 이 서비스를 삭제할 수 있습니다.🗑
    
    ecs-cli compose --project-name tutorial  --file docker-compose.yml \
    --debug service down  \
    --region us-west-2 --ecs-profile tutorial --cluster-config tutorial
    
    

    👉 더 복잡한 스택 배포


    현재 배포 준비 HASURA
    Postgres docker-compose.yml
    version: '3'
    services:
      postgres:
        image: postgres:12
        restart: always
        volumes:
        - db_data:/var/lib/postgresql/data
        environment:
          POSTGRES_PASSWORD: postgrespassword
      graphql-engine:
        image: hasura/graphql-engine:v1.3.3
        ports:
        - "80:8080"
        depends_on:
        - "postgres"
        restart: always
        environment:
          HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
          ## enable the console served by server
          HASURA_GRAPHQL_ENABLE_CONSOLE: "true" # set to "false" to disable console
          ## enable debugging mode. It is recommended to disable this in production
          HASURA_GRAPHQL_DEV_MODE: "true"
          HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log
          ## uncomment next line to set an admin secret
          # HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
    volumes:
      db_data:
    
    👉 로컬에서 스택을 테스트할 수 있습니다.
    docker-compose up &
    
    그리고 나서
    open localhost
    

    👉 이제 AWS ECS에 이 스택을 배포할 수 있습니다.
    그 전에 파일을 업데이트해야 합니다docker-compose.yml.
    우리는 반드시 보충해야 한다.
  • A docker-compose.yml명령
  • A logging명령

  • version: '3'
    services:
      postgres:
        image: postgres:12
        restart: always
        volumes:
        - db_data:/var/lib/postgresql/data
        environment:
          POSTGRES_PASSWORD: postgrespassword
        logging:
          driver: awslogs
          options:
             awslogs-group: tutorial
             awslogs-region: us-west-2
             awslogs-stream-prefix: hasura-postgres
      graphql-engine:
        image: hasura/graphql-engine:v1.3.3
        ports:
        - "80:8080"
        depends_on:
        - "postgres"
        links:
          - postgres
        restart: always
        environment:
          HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
          ## enable the console served by server
          HASURA_GRAPHQL_ENABLE_CONSOLE: "true" # set to "false" to disable console
          ## enable debugging mode. It is recommended to disable this in production
          HASURA_GRAPHQL_DEV_MODE: "true"
          HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log
          ## uncomment next line to set an admin secret
          # HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
        logging:
          driver: awslogs
          options:
             awslogs-group: tutorial
             awslogs-region: us-west-2
             awslogs-stream-prefix: hasura
    volumes:
      db_data:
    
    추가 매개변수를 지정하려면 links라는 파일을 생성해야 합니다.
    
    version: 1
    task_definition:
      ecs_network_mode: bridge
    
    ecs-params.yml 명령은 이 파일을 사용합니다.
    👉 그런 다음 스택을 시작할 수 있습니다.
    ecs-cli compose --project-name tutorial  --file docker-compose.yml \
     --debug service up  \
    --deployment-max-percent 100 --deployment-min-healthy-percent 0 \
      --region us-west-2 --ecs-profile tutorial \
    --cluster-config tutorial --create-log-groups
    
    결과:
    DEBU[0000] Parsing the compose yaml...
    DEBU[0000] Docker Compose version found: 3
    DEBU[0000] Parsing v3 project...
    WARN[0000] Skipping unsupported YAML option for service...  option name=restart service name=postgres
    WARN[0000] Skipping unsupported YAML option for service...  option name=depends_on service name=graphql-engine
    WARN[0000] Skipping unsupported YAML option for service...  option name=restart service name=graphql-engine
    DEBU[0000] Parsing the ecs-params yaml...
    DEBU[0000] Parsing the ecs-registry-creds yaml...
    DEBU[0000] Transforming yaml to task definition...
    DEBU[0004] Finding task definition in cache or creating if needed  TaskDefinition="{\n  ContainerDefinitions: [{\n      Command: [],\n      Cpu: 0,\n      DnsSearchDomains: [],\n      DnsServers: [],\n      DockerSecurityOptions: [],\n      EntryPoint: [],\n      Environment: [{\n          Name: \"POSTGRES_PASSWORD\",\n          Value: \"postgrespassword\"\n        }],\n      Essential: true,\n      ExtraHosts: [],\n      Image: \"postgres:12\",\n      Links: [],\n      LinuxParameters: {\n        Capabilities: {\n\n        },\n        Devices: []\n      },\n      Memory: 512,\n      MountPoints: [{\n          ContainerPath: \"/var/lib/postgresql/data\",\n          ReadOnly: false,\n          SourceVolume: \"db_data\"\n        }],\n      Name: \"postgres\",\n      Privileged: false,\n      PseudoTerminal: false,\n      ReadonlyRootFilesystem: false\n    },{\n      Command: [],\n      Cpu: 0,\n      DnsSearchDomains: [],\n      DnsServers: [],\n      DockerSecurityOptions: [],\n      EntryPoint: [],\n      Environment: [\n        {\n          Name: \"HASURA_GRAPHQL_ENABLED_LOG_TYPES\",\n          Value: \"startup, http-log, webhook-log, websocket-log, query-log\"\n        },\n        {\n          Name: \"HASURA_GRAPHQL_DATABASE_URL\",\n          Value: \"postgres://postgres:postgrespassword@postgres:5432/postgres\"\n        },\n        {\n          Name: \"HASURA_GRAPHQL_ENABLE_CONSOLE\",\n          Value: \"true\"\n        },\n        {\n          Name: \"HASURA_GRAPHQL_DEV_MODE\",\n          Value: \"true\"\n        }\n      ],\n      Essential: true,\n      ExtraHosts: [],\n      Image: \"hasura/graphql-engine:v1.3.3\",\n      Links: [],\n      LinuxParameters: {\n        Capabilities: {\n\n        },\n        Devices: []\n      },\n      Memory: 512,\n      Name: \"graphql-engine\",\n      PortMappings: [{\n          ContainerPort: 8080,\n          HostPort: 80,\n          Protocol: \"tcp\"\n        }],\n      Privileged: false,\n      PseudoTerminal: false,\n      ReadonlyRootFilesystem: false\n    }],\n  Cpu: \"\",\n  ExecutionRoleArn: \"\",\n  Family: \"tutorial\",\n  Memory: \"\",\n  NetworkMode: \"\",\n  RequiresCompatibilities: [\"EC2\"],\n  TaskRoleArn: \"\",\n  Volumes: [{\n      Name: \"db_data\"\n    }]\n}"
    DEBU[0005] cache miss                                    taskDef="{\n\n}" taskDefHash=4e57f367846e8f3546dd07eadc605490
    INFO[0005] Using ECS task definition                     TaskDefinition="tutorial:4"
    WARN[0005] No log groups to create; no containers use 'awslogs'
    INFO[0005] Updated the ECS service with a new task definition. Old containers will be stopped automatically, and replaced with new ones  deployment-max-percent=100 deployment-min-healthy-percent=0 desiredCount=1 force-deployment=false service=tutorial
    INFO[0006] Service status                                desiredCount=1 runningCount=1 serviceName=tutorial
    INFO[0027] Service status                                desiredCount=1 runningCount=0 serviceName=tutorial
    INFO[0027] (service tutorial) has stopped 1 running tasks: (task ee882a6a66724415a3bdc8fffaa2824c).  timestamp="2021-03-08 07:30:33 +0000 UTC"
    INFO[0037] (service tutorial) has started 1 tasks: (task a1068efe89614812a3243521c0d30847).  timestamp="2021-03-08 07:30:43 +0000 UTC"
    INFO[0074] (service tutorial) has started 1 tasks: (task 1949af75ac5a4e749dfedcb89321fd67).  timestamp="2021-03-08 07:31:23 +0000 UTC"
    INFO[0080] Service status                                desiredCount=1 runningCount=1 serviceName=tutorial
    INFO[0080] ECS Service has reached a stable state        desiredCount=1 runningCount=1 serviceName=tutorial
    
    👉 그런 다음 컨테이너가 AWS ECS 클러스터에서 작동하는지 확인할 수 있습니다.
    ecs-cli ps
    
    결실
    Name                                                              State                  Ports                       TaskDefinition  Health
    tutorial-cluster/00d7ff5191dd4d11a9b52ea64fb9ee26/graphql-engine  RUNNING                34.217.107.14:80->8080/tcp  tutorial:10     UNKNOWN
    tutorial-cluster/00d7ff5191dd4d11a9b52ea64fb9ee26/postgres        RUNNING                                            tutorial:10     UNKNOWN
    
    
    👉 다음:💪
    open http://34.217.107.14
    

    👉 우리 이제 쌓아올리는 거 멈출 수 있어.
    ecs-cli compose down
    
    솔루션에 지속적인 지원을 추가하기 위해 AWS EFS: Elastic File System

    4단계: 내 그룹에 지구층 추가



    👉 ecs-cli라는 EFS 파일 시스템 생성
    aws efs create-file-system \
        --performance-mode generalPurpose \
        --throughput-mode bursting \
        --encrypted \
        --tags Key=Name,Value=hasura-db-filesystem
    
    결과:
    {
        "OwnerId": "XXXXX",
        "CreationToken": "10f91a50-0649-442d-b4ad-2ce67f1546bf",
        "FileSystemId": "fs-5574bd52",
        "FileSystemArn": "arn:aws:elasticfilesystem:us-west-2:XXXXX:file-system/fs-5574bd52",
        "CreationTime": "2021-03-08T16:40:19+08:00",
        "LifeCycleState": "creating",
        "Name": "hasura-db-filesystem",
        "NumberOfMountTargets": 0,
        "SizeInBytes": {
            "Value": 0,
            "ValueInIA": 0,
            "ValueInStandard": 0
        },
        "PerformanceMode": "generalPurpose",
        "Encrypted": true,
        "KmsKeyId": "arn:aws:kms:us-west-2:XXXXX:key/97542264-cc64-42f9-954e-4af2b17f72aa",
        "ThroughputMode": "bursting",
        "Tags": [
            {
                "Key": "Name",
                "Value": "hasura-db-filesystem"
            }
        ]
    }
    
    👉 VPC의 각 서브넷에 마운트 지점을 추가하려면:
    aws ec2 describe-subnets --filters Name=tag:project,Values=tutorial-cluster \
     | jq ".Subnets[].SubnetId" | \
    xargs -ISUBNET  aws efs create-mount-target \
     --file-system-id fs-5574bd52 --subnet-id SUBNET
    
    다음 단계에서는 VPC에서 NFS 연결 허용
    우리는 우선 모든 적재 목표와 관련된 안전 그룹을 확보해야 한다
        efs_sg=$(aws efs describe-mount-targets --file-system-id fs-5574bd52 \
        | jq ".MountTargets[0].MountTargetId" \
         | xargs -IMOUNTG aws efs describe-mount-target-security-groups \
         --mount-target-id MOUNTG | jq ".SecurityGroups[0]" | xargs echo )
    
    👉 그리고 VPC의 보안 그룹을 위해 TCP 포트 2049를 열어야 합니다.
    vpc_sg="$(aws ec2 describe-security-groups  \
     --filters Name=tag:project,Values=tutorial-cluster \
     | jq '.SecurityGroups[].GroupId' | xargs echo)"
    
    
    👉 그리고 VPC의 기본 보안 그룹에서 TCP/2049 포트를 승인해야 합니다.
    aws ec2 authorize-security-group-ingress \
    --group-id $efs_sg \
    --protocol tcp \
    --port 2049 \
    --source-group $vpc_sg \
    --region us-west-2
    
    
    👉 이제 영구 지원을 추가하기 위해 수정hasura-db-file-system할 수 있습니다.
  • 최신 단계에서 생성한 EFS 볼륨의 ID: ecs-params.yml
  • version: 1
    task_definition:
      ecs_network_mode: bridge
      efs_volumes:
        - name: db_data
          filesystem_id: fs-5574bd52
          transit_encryption: ENABLED
    
    👉 그런 다음 스택을 재배치할 수 있습니다.
    ecs-cli compose --project-name tutorial  --file docker-compose.yml \
     --debug service up  \
    --deployment-max-percent 100 --deployment-min-healthy-percent 0 \
      --region us-west-2 --ecs-profile tutorial \
    --cluster-config tutorial --create-log-groups
    
    👉 Et voilá: 스택이 실행 중입니다.🎉 🦄 💪

    요약


    💪 ECS-CLI 클러스터를 배포하고 docker compose 스택을 시작했습니다.
    🚀 다음 단계에서는 AWS 어플리케이션 로드 밸런서를 사용하여 스택을 공개하고 보호합니다.
    본문과 관련된 스크립트는
    👉

    좋은 웹페이지 즐겨찾기