From 3c82c7fffffdf93408ccbde359fcd0e383b2ddfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=9E=AC=EC=A4=91?= <126754298+m-a-king@users.noreply.github.com> Date: Sat, 15 Aug 2026 21:50:19 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EA=B4=80=EC=B8=A1=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EB=B9=84=EC=A0=80=EB=8B=9D=20SSM=20=EB=A1=9C=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EA=B3=B5=EC=9A=A9=20=EB=B8=94=EB=A1=9D=20=ED=98=B8?= =?UTF-8?q?=EC=B6=9C=EB=A1=9C=20=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - provision-runtime.sh 4절의 SSM 자격 조회(약 15줄)를 걷어내고 TeamPiKi/infra#50 의 공용 블록 provision-alloy-ssm.sh 호출로 대체. 같은 로직이 extractor·renderer 에도 복제돼 있어, 경로나 실패 정책이 바뀌면 세 곳을 함께 고쳐야 하고 하나만 빠뜨리면 그 박스만 조용히 어긋났다 - deploy.yml 업로드 목록에 그 블록을 더했다 - 블록이 형제 경로의 provision-alloy.sh 를 부르므로 같은 alloy/ 하위에 안착해야 한다 - 동작·실패 정책은 그대로다(필수 5종 중단, traces 빈 값 허용) - 같은 계약이 블록으로 옮겨졌고 그 계약은 블록의 self-test 15케이스가 고정한다 - 전환기 잔재 정리(구 team3-alloy 제거)는 core 고유라 이 스크립트에 남긴다 - AWSCLI_IMAGE 는 mysql SSM pull 이 계속 쓰므로 유지하되, alloy 가 더는 쓰지 않는다는 것을 주석에 반영 --- .github/workflows/deploy.yml | 3 ++- infra/scripts/provision-runtime.sh | 23 +++++++---------------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2677a548..c61864c4 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -199,7 +199,7 @@ jobs: docker push "$IMAGE_LATEST" docker push "$IMAGE_SHA" - # 배포에 필요한 설정 5개(nginx conf·provision 스크립트·alloy 공용 블록 2파일·healthcheck 블록)를 SSH 연결 + # 배포에 필요한 설정(nginx conf·provision 스크립트·alloy 공용 블록 3파일·healthcheck·슬롯 블록)을 SSH 연결 # 1회로 함께 올린다. 각각 scp 하면 핸드셰이크·액션 셋업이 반복돼 수십 초라 한 임시 집결 디렉토리 # (/tmp/piki-deploy)에 안착시킨다 — strip_components: 2 로 depth-3 소스는 파일명만 남고, alloy 블록 # (depth-4)은 alloy/ 하위(/tmp/piki-deploy/alloy/*)로 남아 provision-runtime.sh 가 그 경로로 호출한다(#743). @@ -219,6 +219,7 @@ jobs: infra/scripts/provision-runtime.sh, shared-infra/blocks/alloy/config.alloy, shared-infra/blocks/alloy/provision-alloy.sh, + shared-infra/blocks/alloy/provision-alloy-ssm.sh, shared-infra/blocks/healthcheck.sh, shared-infra/blocks/run_container.sh, shared-infra/blocks/slot_decide.sh, diff --git a/infra/scripts/provision-runtime.sh b/infra/scripts/provision-runtime.sh index f737f02e..51140fbf 100755 --- a/infra/scripts/provision-runtime.sh +++ b/infra/scripts/provision-runtime.sh @@ -6,8 +6,9 @@ # docker 명령은 sudo 없이(ubuntu 가 docker 그룹), 시스템·nginx 는 sudo 로 — deploy.yml 기존 패턴과 동일. set -euo pipefail -# dockerized aws-cli — mysql(3절)·alloy(4절)의 SSM pull 이 공유한다. 박스엔 aws cli 가 없다. +# dockerized aws-cli — mysql(3절)의 SSM pull 이 쓴다. 박스엔 aws cli 가 없다. # 이미지 핀은 deploy.yml 의 SSM pull 과 같은 버전을 쓴다. +# (alloy(4절)는 공용 블록 provision-alloy-ssm.sh 가 자기 핀으로 조회하므로 이 값을 쓰지 않는다.) AWSCLI_IMAGE="public.ecr.aws/aws-cli/aws-cli:2.35.21" # 1) swap — 메모리 906Mi 라 1G swap 이 필수다. 없을 때만 생성하고 fstab 에 등록해 재부팅에도 유지되게 한다. @@ -133,20 +134,10 @@ fi # validate 게이트·--network host·호스트 마운트·Running 확인은 전부 블록이 책임진다. # 자격증명(GRAFANA_*)은 SSM 공유 경로(/piki/observability/grafana-*)에서 박스가 직접 읽는다(#771) — # 세 서비스 박스가 같은 경로를 읽어 토큰 회전이 1곳 put-parameter 로 끝난다. GH secrets 경유 폐기. -# 필수 5종(metrics·logs URL/USER, token) 실패는 즉시 중단, traces 2종은 빈 값 허용(블록이 더미로 무해 처리). -obs_param() { - docker run --rm --network host "$AWSCLI_IMAGE" ssm get-parameter --name "/piki/observability/$1" --with-decryption --region ap-northeast-2 --query Parameter.Value --output text -} -GRAFANA_METRICS_URL="$(obs_param grafana-metrics-url)" || { echo "[alloy] SSM grafana-metrics-url 조회 실패 — IAM(app_ssm_read)·파라미터 존재 확인"; exit 1; } -GRAFANA_METRICS_USER="$(obs_param grafana-metrics-user)" || { echo "[alloy] SSM grafana-metrics-user 조회 실패"; exit 1; } -GRAFANA_LOGS_URL="$(obs_param grafana-logs-url)" || { echo "[alloy] SSM grafana-logs-url 조회 실패"; exit 1; } -GRAFANA_LOGS_USER="$(obs_param grafana-logs-user)" || { echo "[alloy] SSM grafana-logs-user 조회 실패"; exit 1; } -GRAFANA_CLOUD_TOKEN="$(obs_param grafana-cloud-token)" || { echo "[alloy] SSM grafana-cloud-token 조회 실패"; exit 1; } -GRAFANA_TRACES_URL="$(obs_param grafana-traces-url)" || GRAFANA_TRACES_URL="" -GRAFANA_TRACES_USER="$(obs_param grafana-traces-user)" || GRAFANA_TRACES_USER="" -export GRAFANA_METRICS_URL GRAFANA_METRICS_USER GRAFANA_LOGS_URL GRAFANA_LOGS_USER -export GRAFANA_TRACES_URL GRAFANA_TRACES_USER GRAFANA_CLOUD_TOKEN -echo "[alloy] Grafana 자격 SSM 로드 완료 (/piki/observability/grafana-*)" +# **그 조회 자체도 공용 블록(provision-alloy-ssm.sh) 소관이다** — 예전엔 이 스크립트가 직접 읽었으나 +# 같은 로직이 extractor·renderer 에도 복제돼 있어, 경로나 실패 정책이 바뀌면 세 곳을 함께 고쳐야 하고 +# 하나만 빠뜨리면 그 박스만 조용히 어긋났다(TeamPiKi/infra#50 에서 블록으로 추출). +# 필수 5종(metrics·logs URL/USER, token) 실패는 즉시 중단, traces 2종은 빈 값 허용 — 블록이 판정한다. # 수집 대상은 컨테이너 label opt-in(piki.observe 등, contracts/observability.md) — 서비스 열거 regex 와 # cross-box scrape(EXTRACTOR_METRICS_TARGET)는 폐기됐다(extractor prod 박스는 자체 Alloy 가 수집). # 전환기 잔재 정리: 구 수집기(team3-alloy)·구 config 경로가 남으면 새 수집기(piki-alloy, 블록이 기동)와 @@ -158,7 +149,7 @@ if docker inspect team3-alloy >/dev/null 2>&1; then || { echo "[alloy] 구 수집기(team3-alloy) 제거 실패 - 이중 수집 방지를 위해 중단"; exit 1; } fi sudo rm -rf /etc/alloy-team3 -bash /tmp/piki-deploy/alloy/provision-alloy.sh \ +bash /tmp/piki-deploy/alloy/provision-alloy-ssm.sh \ --config /tmp/piki-deploy/alloy/config.alloy \ --name piki-alloy \ --environment "${ENVIRONMENT:?ENVIRONMENT 미주입 — deploy.yml envs 확인}" \