AWS Fargate에 대한 CircleaCI(등)를 통한 완전 자동/반자동 설계
CI/CD Advent Calendar 2021 [1]
AWS Containers Advent Calendar 2021 [2]
CircleCI Advent Calendar 2021 [3]
먼저 기본 정보를 나열합니다.
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.3. ecspresso의 deploy를 이용하여 (ECS 서비스 작업 정의 업데이트)
2.4. 혹시 모르니까 롤백 스크립트도 준비했어요.
3. CI/CD 도구에 스크립트 탑재
3.1. CI/CD의 docker 이미지 정리 수행
Bitbucket Pipelines Docker file에 다양한 스크립트를 설치할 수 있습니다(좋은 방법이나 편리한 방법이 있으면 알려주세요).
3.3. 가능하면 로컬 검증
(나는 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로 이동합니다.
자세한 내용은 ↓
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
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 ↩︎
Reference
이 문제에 관하여(AWS Fargate에 대한 CircleaCI(등)를 통한 완전 자동/반자동 설계), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/sogaoh/articles/21-12-05-d87b6e85a8e4db텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)