ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AWS ECS 개념 및 Node 서버 배포 - 3
    카테고리 없음 2022. 3. 10. 17:10

    저번글에선 ecs에 백엔드 코드를 배포하는 것 까지 완료 하였다.

     

    이번엔 깃헙에서 push 했을 때 자동으로 도커로 빌드하여 ECS에 배포하는 프로세스를 만들어 보겠다.

     

    Task definition 생성 및 기존 Iam 권한 변경


    ECS에 들어가서 작업 정의 > sample-definition >  sample definition:1 로 가면 JSON 탭을 클릭하면 해당 내용이 보인다.

    해당 내용을 복사해서 프로젝트 루트에 definition.json 파일을 만들고 해당 json 을 붙혀넣기 해준다.

     

    {
      "ipcMode": null,
      "executionRoleArn": "arn:aws:iam::464086861459:role/ecsTaskExecutionRole",
      "containerDefinitions": [
        {
          "dnsSearchDomains": null,
          "environmentFiles": null,
          "logConfiguration": {
            "logDriver": "awslogs",
            "secretOptions": null,
            "options": {
              "awslogs-group": "/ecs/sample-definition",
              "awslogs-region": "ap-northeast-2",
              "awslogs-stream-prefix": "ecs"
            }
          },
          "entryPoint": null,
          "portMappings": [
            {
              "hostPort": 4000,
              "protocol": "tcp",
              "containerPort": 4000
            }
          ],
          "command": null,
          "linuxParameters": null,
          "cpu": 0,
          "environment": [],
          "resourceRequirements": null,
          "ulimits": null,
          "dnsServers": null,
          "mountPoints": [],
          "workingDirectory": null,
          "secrets": null,
          "dockerSecurityOptions": null,
          "memory": null,
          "memoryReservation": null,
          "volumesFrom": [],
          "stopTimeout": null,
          "image": "464086861459.dkr.ecr.ap-northeast-2.amazonaws.com/sample-app",
          "startTimeout": null,
          "firelensConfiguration": null,
          "dependsOn": null,
          "disableNetworking": null,
          "interactive": null,
          "healthCheck": null,
          "essential": true,
          "links": null,
          "hostname": null,
          "extraHosts": null,
          "pseudoTerminal": null,
          "user": null,
          "readonlyRootFilesystem": null,
          "dockerLabels": null,
          "systemControls": null,
          "privileged": null,
          "name": "sample-container"
        }
      ],
      "placementConstraints": [],
      "memory": "512",
      "taskRoleArn": null,
      "compatibilities": [
        "EC2",
        "FARGATE"
      ],
      "taskDefinitionArn": "arn:aws:ecs:ap-northeast-2:464086861459:task-definition/sample-definition:1",
      "family": "sample-definition",
      "requiresAttributes": [
        {
          "targetId": null,
          "targetType": null,
          "value": null,
          "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
        },
        {
          "targetId": null,
          "targetType": null,
          "value": null,
          "name": "ecs.capability.execution-role-awslogs"
        },
        {
          "targetId": null,
          "targetType": null,
          "value": null,
          "name": "com.amazonaws.ecs.capability.ecr-auth"
        },
        {
          "targetId": null,
          "targetType": null,
          "value": null,
          "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
        },
        {
          "targetId": null,
          "targetType": null,
          "value": null,
          "name": "ecs.capability.execution-role-ecr-pull"
        },
        {
          "targetId": null,
          "targetType": null,
          "value": null,
          "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
        },
        {
          "targetId": null,
          "targetType": null,
          "value": null,
          "name": "ecs.capability.task-eni"
        }
      ],
      "pidMode": null,
      "requiresCompatibilities": [
        "FARGATE"
      ],
      "networkMode": "awsvpc",
      "runtimePlatform": null,
      "cpu": "256",
      "revision": 1,
      "status": "ACTIVE",
      "inferenceAccelerators": null,
      "proxyConfiguration": null,
      "volumes": []
    }

    완료 했으면 이전 포스팅에서 생성한 ecs-test 유저에  AmazonECS_FullAccess 권한을 추가 해준다.

     

     

    Github Action 추가


    그럼 이제 github을 통해서 cd 기능을 구축할 것이다.

    먼저 깃헙에 새로운 레퍼지토리를 생성해준다.

    그런 다음 로컬 프로젝트에서 방금 생성한 레퍼지터리로 코드를 푸시 한다.

    git init
    git add .
    git commit -m "intial commit"
    git remote add origin https://github.com/CKANYWHERE/node-ecs-test
    git push origin master

    정상적으로 push 되었으면 github action에서 ECS, ECR 서비스에 접근 할 수 있도록 셋팅을 한다.

    Settings > Secrets 탭에서 AWS_ACCESS_KEY_ID 와 AWS_SECRET_ACCESS_KEY를

    ecs-test 유저의 Access Key ID, Secret Access Key를 각각 넣어주도록 한다.

    키 셋팅을 완료 했다면 Actions 페이지로 간다.

    Deploy to Amazon Ecs 클릭

    이런 화면이 뜰텐데 몇가지 수정을 해준다.

     

    1. on: push: branches: [master]

    2. env에 있는 환경변수들을 본인의 ECS에 맞게 변경

     

    name: Deploy to Amazon ECS
    
    on:
      push:
        branches: [master]
    
    env:
      AWS_REGION: ap-northeast-2                   # set this to your preferred AWS region, e.g. us-west-1
      ECR_REPOSITORY: sample-app           # set this to your Amazon ECR repository name
      ECS_SERVICE: sample                 # set this to your Amazon ECS service name
      ECS_CLUSTER: ecs-cluster                 # set this to your Amazon ECS cluster name
      ECS_TASK_DEFINITION: task-definition.json # set this to the path to your Amazon ECS task definition
                                                   # file, e.g. .aws/task-definition.json
      CONTAINER_NAME: sample-container           # set this to the name of the container in the
                                                   # containerDefinitions section of your task definition
    
    jobs:
      deploy:
        name: Deploy
        runs-on: ubuntu-latest
        environment: production
    
        steps:
        - name: Checkout
          uses: actions/checkout@v2
    
        - name: Configure AWS credentials
          uses: aws-actions/configure-aws-credentials@v1
          with:
            aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            aws-region: ${{ env.AWS_REGION }}
    
        - name: Login to Amazon ECR
          id: login-ecr
          uses: aws-actions/amazon-ecr-login@v1
    
        - name: Build, tag, and push image to Amazon ECR
          id: build-image
          env:
            ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
            IMAGE_TAG: ${{ github.sha }}
          run: |
            # Build a docker container and
            # push it to ECR so that it can
            # be deployed to ECS.
            docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
            docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
            echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
    
        - name: Fill in the new image ID in the Amazon ECS task definition
          id: task-def
          uses: aws-actions/amazon-ecs-render-task-definition@v1
          with:
            task-definition: ${{ env.ECS_TASK_DEFINITION }}
            container-name: ${{ env.CONTAINER_NAME }}
            image: ${{ steps.build-image.outputs.image }}
    
        - name: Deploy Amazon ECS task definition
          uses: aws-actions/amazon-ecs-deploy-task-definition@v1
          with:
            task-definition: ${{ steps.task-def.outputs.task-definition }}
            service: ${{ env.ECS_SERVICE }}
            cluster: ${{ env.ECS_CLUSTER }}
            wait-for-service-stability: true

     

    설정이 끝나면 

     

     

    Start commit 을 클릭하여 브랜치에 커밋을 등록한다.

     

    성공을 했다.

     

    ECR에도 새로운 이미지가 올라갔고

    ECS도 업데이트 시간을 보면 잘 업데이트가 된 것을 확인 할 수 있다.

    응답도 정상적으로 온다.

     

     

    그럼 코드를 수정해서 배포를 해보겠다. 

    const app = require("express")();
    
    app.get("/", (req, res) => {
        res.json({
            message: true
        });
    });
    
    app.get("/test", (req, res) => {
        res.json({
            message: 'Build SUCCESS'
        });
    })
    
    app.listen(4000, () => {
        console.log("Server started");
    });

    test로 드어가는 라우터를 하나 추가한다.

    그 다음 푸시를 한다.

    git add .
    git commit -m "build test"
    git push origin master

    푸시를 하면 action에 workflow가 잘 돌아가고 있는것이 보인다.

     

    배포를 완료하였고 테스트를 해보겠다.

     

    성공!

     

    댓글

Designed by Tistory.