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 확인}" \