AWS Fargate에 대한 CircleaCI(등)를 통한 완전 자동/반자동 설계

다음은 다섯째 날의 항목이다.

  • CI/CD Advent Calendar 2021 [1]

  • AWS Containers Advent Calendar 2021 [2]

  • CircleCI Advent Calendar 2021 [3]
  • 2021년 초부터 팜게이트에 힘쓰다가 3월, 5월부터 활용되고 문제가 발생하면 개선한다는 것이 제 CI/CD의 복습성 기사입니다.
    먼저 기본 정보를 나열합니다.
    3->4->8->10월 공개된 4편의 글
    3월 Laavel 제품 Fargate화의 길
    https://zenn.dev/sogaoh/articles/21-03-27-def9b519527b3d417b4d
    4월의 Blue/Green Deployment 구축, 운용안(ecspresso+Code Deploy)
    https://zenn.dev/sogaoh/articles/21-04-15-61afc6904b9c21ff9c7b
    8월에 생각나서 70분 동안 tfenv의 CircleaCI Orb을 만들었어요.
    https://zenn.dev/sogaoh/articles/21-08-27-5f56bcf3a7348a
    10월에 Bitbucket Pipelines에서 CodeBuild로 CD 변환
    https://zenn.dev/sogaoh/articles/21-10-02-7b0e74b38758ba

    CI/CD Fargate 의 대략적인 단계


    '라벨 제품'을 전제로 하지만 다음은 저 스스로 이해한다.

    1. 환경 구축


    1.1. 애플리케이션 이미징 [4] 로컬 이동
    1.2. (Terraform) 인프라 구축(ECS는 cluster까지만 가능)
    1.3. ecspresso에서 ECS 서비스 작업 정의 구축
    1.4. Bluetooth/Green Deployment 설정AWS CodeDeploy

    2. CI/CD 스크립트 정리 및 검증


    (이하 개요)
    2.1. 로컬 환경에 적합한 환경을 자동으로 구축한 다음 Unit/Feature/E2E Test 자동화
  • 충분하지 않지만 업데이트 테스트에 대한 포지셔닝
  • 2.2. ECR 최신 코드를 기반으로 한 인상의push
    2.3. ecspresso의 deploy를 이용하여 (ECS 서비스 작업 정의 업데이트)
  • 최종 단계에서 DB migration
  • 자동화
    2.4. 혹시 모르니까 롤백 스크립트도 준비했어요.
  • 구축 초기에 검증했지만 운용에 들어가면 사용하지 않아 사용 시 불안해졌다.가끔 훈련이 필요하다.
  • 3. CI/CD 도구에 스크립트 탑재


    3.1. CI/CD의 docker 이미지 정리 수행
  • 사용하기 OrbCircleaCI는 매우 편리하다.최근에야 시작했지만 기릿허브 액션도 비슷하게 느껴진다.

  • Bitbucket Pipelines Docker file에 다양한 스크립트를 설치할 수 있습니다(좋은 방법이나 편리한 방법이 있으면 알려주세요).
  • 3.2. 2. 스크립트 실행
    3.3. 가능하면 로컬 검증
  • 는CircleaCICLI 도구,GiitHub Actionact로어느 정도검증이 가능하다.
  • BitBucket Pipelines에서 자신이 사용하는 기구에서 Docker in Docker는 그 중에서 docker compose up의 느낌을 준다.'할 수 없다'[5]
    (나는 Piperlines로만 실행할 수 있다고 생각한다)
  • CI/CD 확장


    개발자를 주체로 디자인하고 현장의 수요에 따라 조금씩 확장했다.

    API에서 전체 자동으로 호출


    CircleaCI뿐만 아니라 초기에는 API용[6]의 디자인이었다고 생각합니다.
    하지만 그렇다면 자신 이외의 사람이 실행하고 싶을 때 기호화폐가 필요하다면 알려주는 게 어떨까?(할 말이 없다) 그래서 특정 지점으로의push를 터치하여 프로그램을 자동으로 실행시킨다.

    테스트 덮어쓰기 보고서를 Artifact에 저장하십시오.


    CircleaCI는 브라우저에서 Artifact에서 보고서를 직접 볼 수 있습니다.
    다운로드하면 비트bucket Pipelines, GiitHub Action을 확인할 수 있습니다.

    ECS Schedule Task 설정을 업데이트할 때 ecschedule apply를 사용할 수 있도록 준비됨


    변경 빈도가 높지 않기 때문ecscheduleapply의 집행은 로컬에서 명령부터 시작하지만, 기구로서Terraform을 참조하는 tfstate 등 보이지 않는 변동 요소가 있기 때문에 정기적으로dry-run의 문법 검사를 실시했다.

    릴리스에서는 유지 관리 모드로 사용


    ECS의 롤오버 업데이트·Blue/Green Deployment 모두 정지 시간은 발생하지 않을 것으로 보이지만, 신중한 차원에서'하고 있다'고 명시하기 위해 기관정비를 했다.응용 프로그램.circleci/config.yml 샘플(일부,XXXXX을 넣었습니다)
    실제로 이 기관은 테라form apply를 이용해 ALB의 청취자 규칙을'삽입'[7]하고, terraform-provider-mackerel는 외형 감시 경보가 발령될 때만 무트를 하는 등 조금 노력했다.

    Vue.js의 구축 메모리가 부족하여 실패했습니다. CodeBuild로 이동합니다.


    자세한 내용은 ↓
    https://zenn.dev/sogaoh/articles/21-10-02-7b0e74b38758ba

    Appendix


    유지 관리 모드의 CircleaCI 워크플로우를 자동으로 종료(API에서 호출)
    
    version: 2.1
    
    orbs:
      aws-ecr: circleci/aws-[email protected]
      ecspresso: fujiwara/[email protected]
      ecschedule: sogaoh/orb-[email protected]
      tfenv: sogaoh/orb-[email protected]
      slack : circleci/[email protected]
    
    anchors:
      - node_version: &node_version
          NODE_VERSION: v14.XX.X
      - install_ecspresso: &install_ecspresso
          ecspresso/install:
            version: v1.7.0
      - terraform_version: &terraform_version
          TERRAFORM_VERSION: 1.0.10
      - install_terraform: &install_terraform
          run:
            name: Install terraform & Show Version
            command: |
              tfenv install ${TERRAFORM_VERSION}
              tfenv use ${TERRAFORM_VERSION}
              terraform --version
      - download_maintenance_envrc: &download_maintenance_envrc
          run:
            name: Download .envrc for ecs/maintenance
            command: |
              cd infrastructures/environments/<< pipeline.parameters.environment >>/ecs/maintenance
              aws s3 cp s3://XXXXX-envrc-store/environments/<< pipeline.parameters.environment >>/ecs/.envrc ./.envrc
      - download_maintenance_envrc_ar: &download_maintenance_envrc_ar
          run:
            name: Download .envrc for ecs/maintenance
            command: |
              cd infrastructures/environments/<< parameters.environment >>/ecs/maintenance
              aws s3 cp s3://XXXXX-envrc-store/environments/<< parameters.environment >>/ecs/.envrc ./.envrc
      - scale1_maintenance: &scale1_maintenance
          run:
            name: Maintenance Service set desiredCount 1
            command: |
              cd infrastructures/environments/<< pipeline.parameters.environment >>/ecs/maintenance
              direnv allow . && eval "$(direnv export bash)"
              make verify
              make scale1
      - scale1_maintenance_ar: &scale1_maintenance_ar
          run:
            name: Maintenance Service set desiredCount 1
            command: |
              cd infrastructures/environments/<< parameters.environment >>/ecs/maintenance
              direnv allow . && eval "$(direnv export bash)"
              make verify
              make scale1
      - scale0_maintenance: &scale0_maintenance
          run:
            name: Maintenance Service set desiredCount 0
            command: |
              cd infrastructures/environments/<< pipeline.parameters.environment >>/ecs/maintenance
              direnv allow . && eval "$(direnv export bash)"
              make verify
              make scale0
      - scale0_maintenance_ar: &scale0_maintenance_ar
          run:
            name: Maintenance Service set desiredCount 0
            command: |
              cd infrastructures/environments/<< parameters.environment >>/ecs/maintenance
              direnv allow . && eval "$(direnv export bash)"
              make verify
              make scale0
      - download_maintenance_tfvars: &download_maintenance_tfvars
          run:
            name: Download terraform.tfvars for alb_listener_rule_maintenance
            command: |
              cd infrastructures/environments/<< pipeline.parameters.environment >>/alb_listener_rule_maintenance
              aws s3 cp s3://XXXXX-tf-store/<< pipeline.parameters.environment >>/alb_listener_rule_maintenance/terraform.tfvars ./terraform.tfvars
      - download_maintenance_tfvars_ar: &download_maintenance_tfvars_ar
          run:
            name: Download terraform.tfvars for alb_listener_rule_maintenance
            command: |
              cd infrastructures/environments/<< parameters.environment >>/alb_listener_rule_maintenance
              aws s3 cp s3://XXXXX-tf-store/<< parameters.environment >>/alb_listener_rule_maintenance/terraform.tfvars ./terraform.tfvars
      - insert_alb_maintenance_rule: &insert_alb_maintenance_rule
          run:
            name: Insert Maintenance ALB Listener Rule
            command: |
              cd infrastructures/environments/<< pipeline.parameters.environment >>/alb_listener_rule_maintenance
              terraform init
              terraform plan
              terraform apply -auto-approve
      - insert_alb_maintenance_rule_ar: &insert_alb_maintenance_rule_ar
          run:
            name: Insert Maintenance ALB Listener Rule
            command: |
              cd infrastructures/environments/<< parameters.environment >>/alb_listener_rule_maintenance
              terraform init
              terraform plan
              terraform apply -auto-approve
      - delete_alb_maintenance_rule: &delete_alb_maintenance_rule
          run:
            name: Delete Maintenance ALB Listener Rule
            command: |
              cd infrastructures/environments/<< pipeline.parameters.environment >>/alb_listener_rule_maintenance
              terraform init
              terraform plan -destroy
              terraform apply -destroy -auto-approve
      - delete_alb_maintenance_rule_ar: &delete_alb_maintenance_rule_ar
          run:
            name: Delete Maintenance ALB Listener Rule
            command: |
              cd infrastructures/environments/<< parameters.environment >>/alb_listener_rule_maintenance
              terraform init
              terraform plan -destroy
              terraform apply -destroy -auto-approve
      - download_monitor_mute_on_off_tfvars: &download_monitor_mute_on_off_tfvars
          run:
            name: Download terraform.tfvars for monitor mute on/off
            command: |
              cd surroundings/mackerel/external-monitor/<< pipeline.parameters.environment >>
              aws s3 cp s3://XXXXX-tf-store/mackerel/external-monitor/terraform.tfvars ./terraform.tfvars
      - download_monitor_mute_on_off_tfvars_ar: &download_monitor_mute_on_off_tfvars_ar
          run:
            name: Download terraform.tfvars for monitor mute on/off
            command: |
              cd surroundings/mackerel/external-monitor/<< parameters.environment >>
              aws s3 cp s3://XXXXX-tf-store/mackerel/external-monitor/terraform.tfvars ./terraform.tfvars
      - change_monitor_mute_on: &change_monitor_mute_on
          run:
            name: Change External Monitor is_mute ON
            command: |
              cd surroundings/mackerel/external-monitor/<< pipeline.parameters.environment >>
              terraform init
              terraform plan -var 'is_mute=true'
              terraform apply -auto-approve -var 'is_mute=true'
      - change_monitor_mute_on_ar: &change_monitor_mute_on_ar
          run:
            name: Change External Monitor is_mute ON
            command: |
              cd surroundings/mackerel/external-monitor/<< parameters.environment >>
              terraform init
              terraform plan -var 'is_mute=true'
              terraform apply -auto-approve -var 'is_mute=true'
      - change_monitor_mute_off: &change_monitor_mute_off
          run:
            name: Change External Monitor is_mute OFF
            command: |
              cd surroundings/mackerel/external-monitor/<< pipeline.parameters.environment >>
              terraform init
              terraform plan -var 'is_mute=false'
              terraform apply -auto-approve -var 'is_mute=false'
      - change_monitor_mute_off_ar: &change_monitor_mute_off_ar
          run:
            name: Change External Monitor is_mute OFF
            command: |
              cd surroundings/mackerel/external-monitor/<< parameters.environment >>
              terraform init
              terraform plan -var 'is_mute=false'
              terraform apply -auto-approve -var 'is_mute=false'
    
    
    executors:
      amzn2:
        docker:
          - image: XXXXX/builder-amzn2:latest
            auth:
              username: $DOCKER_LOGIN
              password: $DOCKER_PWD
    
    
    parameters:
      branch:
        type: string
        default: development
      environment:
        type: string
        default: development
      # Job Trigger: execute by API v2
      maintenance_start:
        type: boolean
        default: false
      maintenance_end:
        type: boolean
        default: false
    
    
    workflows:
      version: 2
      maintenance-start:
        when: << pipeline.parameters.maintenance_start >>
        jobs:
          - confirm_begin-maintenance:
              type: approval
              filters:
                branches:
                  only:
                    - develop
          - begin-maintenance:
              requires:
                - confirm_begin-maintenance
      maintenance-end:
        when: << pipeline.parameters.maintenance_end >>
        jobs:
          - confirm_finish-maintenance:
              type: approval
              filters:
                branches:
                  only:
                    - develop
          - finish-maintenance:
              requires:
                - confirm_finish-maintenance
    
    
    commands:
      start-notify:
        steps:
          - slack/notify:
              title: "${MARK_S}"
              color: '#FFC300'
              message: "\n
              :neutral_face: ${CIRCLE_USERNAME}  :evergreen_tree: ${CIRCLE_BRANCH} \n
              Job: ${CIRCLE_JOB}  \n"
              webhook: "${SLACK_ENDPOINT}"
      end-notify:
        steps:
          - slack/status:
              fail_only: true
              failure_message: "\n
              :neutral_face: ${CIRCLE_USERNAME}  :evergreen_tree: ${CIRCLE_BRANCH} \n
              Workflow: https://circleci.com/workflow-run/${CIRCLE_WORKFLOW_ID} \n
              Job: ${CIRCLE_JOB} \n
              Build URL: ${CIRCLE_BUILD_URL} \n"
              webhook: "${SLACK_ENDPOINT}"
          - slack/notify:
              title: "${MARK_E}"
              color: '#42f486'
              message: "\n
              :neutral_face: ${CIRCLE_USERNAME}  :evergreen_tree: ${CIRCLE_BRANCH} \n
              Workflow: https://circleci.com/workflow-run/${CIRCLE_WORKFLOW_ID} \n
              Job: ${CIRCLE_JOB}  \n
              Build URL: ${CIRCLE_BUILD_URL} \n"
              webhook: "${SLACK_ENDPOINT}"
    
    
    jobs:
      begin-maintenance:
        executor:
          name: amzn2
        environment:
          <<: *terraform_version
          MARK_S: ":earth_asia:  ENV : << pipeline.parameters.environment >>"
          MARK_E: ":hammer_and_wrench:  ENV : << pipeline.parameters.environment >>"
        steps:
          - start-notify
          - checkout
          - setup_remote_docker:
              docker_layer_caching: false
          - <<: *install_ecspresso
          - <<: *download_maintenance_envrc
          - <<: *scale1_maintenance
          - tfenv/install
          - <<: *install_terraform
          - <<: *download_monitor_mute_on_off_tfvars
          - <<: *change_monitor_mute_on
          - <<: *download_maintenance_tfvars
          - <<: *insert_alb_maintenance_rule
          - end-notify
      finish-maintenance:
        executor:
          name: amzn2
        environment:
          <<: *terraform_version
          MARK_S: ":hammer_and_wrench:  ENV : << pipeline.parameters.environment >>"
          MARK_E: ":earth_asia:  ENV : << pipeline.parameters.environment >>"
        steps:
          - start-notify
          - checkout
          - setup_remote_docker:
              docker_layer_caching: false
          - tfenv/install
          - <<: *install_terraform
          - <<: *download_maintenance_tfvars
          - <<: *delete_alb_maintenance_rule
          - <<: *download_monitor_mute_on_off_tfvars
          - <<: *change_monitor_mute_off
          - <<: *install_ecspresso
          - <<: *download_maintenance_envrc
          - <<: *scale0_maintenance
          - end-notify
    
    

    최후


    끝까지 읽어주셔서 감사합니다.
    내년에도 기릿허브 액션스와 기릿랩 CI사에 취직할 예정인데, 지적재산권이 될 수 있는 사례를 경험할 수 있다면 기사로 썼으면 좋겠다고 생각했다.
    좋은 한 해 되세요.
    내일 여섯째 날의 계획은 다음과 같다.기대하세요.

  • CI/CD: "Bitbucket Pipeline은 무엇입니까?"by

  • AWS Containers: "ECS task tracter"by 선생님... 오 [8]

  • CircleCI: "CircleaCI의 Conceurrency 및 Parallelism"by
  • 이렇게 말하면'반자동', CI/CD를 조작할 때의 절차와 전혀 관련이 없다.의 스크립트ecr-update, ecs-deploy, (ecs-rollback) 각 섹션에 매개 변수를 지정하여 실행합니다.
    각주
    4일째는 12/510:30 시간 미정입니다.↩︎
    넷째 날은 선생님 것ECR에서 Docker Hub의 공식 이미지 사용입니다.↩︎
    넷째 날은 선생님 것Spring Boot 프로젝트 자동 테스트가 CircleaCI에서 시작되는 2단계입니다.↩︎
    refs https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definition_image docker-compose.yml에서 기술할 수 있는build 상하문에는Fargate를 사용할 수 없다고 스스로 판단합니다.↩︎
    refs https://support.atlassian.com/ja/bitbucket-cloud/docs/debug-pipelines-locally-with-docker/ ↩︎
    refs https://circleci.com/docs/ja/2.0/api-intro/ ↩︎
    이를 위해 만든 것은sogaoh/orb-tfenv, 소스는https://github.com/sogaoh/orb-tfenv↩︎
    Author of ecspresso ↩︎

    좋은 웹페이지 즐겨찾기