From 63a0c2501dcd681ff5d8188a073edc1dc2289f42 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:48:34 +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=EC=9D=84=20=EA=B3=B5?= =?UTF-8?q?=EC=9A=A9=20=EB=B8=94=EB=A1=9D=20=ED=98=B8=EC=B6=9C=EB=A1=9C=20?= =?UTF-8?q?=EC=B6=95=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SSM 자격 조회 로직(약 45줄)을 걷어내고 TeamPiKi/infra#50 의 공용 블록 provision-alloy-ssm.sh 호출로 대체. 같은 로직이 core·renderer 에도 복제돼 있어, 경로나 실패 정책이 바뀌면 세 곳을 함께 고쳐야 하고 하나만 빠뜨리면 그 박스만 조용히 어긋났다 - 이 스크립트에 남는 것은 이 박스의 값(--box piki-extractor·--environment prod)뿐이다 - fetch 대상에 provision-alloy-ssm.sh 를 더했다 - 블록이 형제 경로의 provision-alloy.sh 를 부르므로 셋을 같은 디렉터리에 받는다 - 동작·실패 정책은 그대로다(필수 5종 중단, traces 빈 값 허용) - 같은 계약이 블록으로 옮겨졌고, 그 계약은 블록의 self-test 15케이스가 고정한다 - 검증: fetch 3종 성공 + 블록이 SSM 조회까지 진입하는 것을 로컬에서 확인(자격이 없어 의도대로 중단) --- infra/scripts/provision-observability.sh | 65 ++++++------------------ 1 file changed, 16 insertions(+), 49 deletions(-) diff --git a/infra/scripts/provision-observability.sh b/infra/scripts/provision-observability.sh index 43ac4d1..028af22 100755 --- a/infra/scripts/provision-observability.sh +++ b/infra/scripts/provision-observability.sh @@ -2,13 +2,15 @@ # # extractor prod 박스 관측(Alloy) 배선 - 이 스크립트가 값의 SSOT다. # -# TeamPiKi/infra 의 공통 Alloy 블록(blocks/alloy/config.alloy + provision-alloy.sh)을 -# fetch 하고, Grafana Cloud 자격을 SSM Parameter Store 에서 읽어 env 로 얹은 뒤 -# extractor 의 값(environment=prod, box=piki-extractor)으로 공통 블록을 호출한다. +# TeamPiKi/infra 의 공통 Alloy 블록을 fetch 하고, extractor 의 값(environment=prod, +# box=piki-extractor)으로 호출한다. 이 스크립트가 갖는 것은 그 **값**뿐이다. # -# 실행 위치: extractor 박스 안 (SSM run-command 또는 세션 접속 후 직접 실행). -# 이 박스에는 aws cli 가 없어 SSM 조회는 dockerized aws cli 로 한다 -# (인스턴스 IAM 롤 + IMDSv2 hop limit 2 라 컨테이너 안에서도 자격 획득 가능). +# 자격(SSM) 로드는 공용 블록 provision-alloy-ssm.sh 소관이다 - 예전에는 이 스크립트가 직접 +# 조회했으나 같은 로직이 core·renderer 에도 복제돼 있어, 경로나 실패 정책이 바뀌면 세 곳을 함께 +# 고쳐야 하고 하나만 빠뜨리면 그 박스만 조용히 어긋났다(TeamPiKi/infra#50 에서 블록으로 추출). +# +# 실행 위치: extractor 박스 안. 배포(deploy.yml)가 매 배포 실행하고, 수동 실행(SSM run-command· +# 세션 접속)도 그대로 가능하다. # # 전제: TeamPiKi/infra 의 공통 Alloy 블록 PR 이 머지돼 있어야 한다. 머지 전에는 # --ref 로 그 PR 의 브랜치명을 지정해 선검증할 수 있다. @@ -41,51 +43,16 @@ mkdir -p "$WORK_DIR" INFRA_RAW_BASE="https://raw.githubusercontent.com/TeamPiKi/infra/$REF/blocks/alloy" # --- 1. 공통 Alloy 블록 fetch (repo public, 인증 불필요) --- -curl -fsSL "$INFRA_RAW_BASE/config.alloy" -o "$WORK_DIR/config.alloy" \ - || { echo "config.alloy fetch 실패 (ref=$REF)" >&2; exit 1; } -curl -fsSL "$INFRA_RAW_BASE/provision-alloy.sh" -o "$WORK_DIR/provision-alloy.sh" \ - || { echo "provision-alloy.sh fetch 실패 (ref=$REF)" >&2; exit 1; } - -# --- 2. Grafana Cloud 자격을 SSM Parameter Store 에서 조회 --- -# 자격의 정본은 공유 경로 /piki/observability/grafana-* 하나다(세 서비스 박스가 같은 경로를 읽어 -# 토큰 회전이 1곳 put-parameter 로 끝난다 — TeamPiKi/core#771, 계약: TeamPiKi/infra contracts/observability.md). -# 박스엔 aws cli 가 없어 dockerized aws cli 로 조회한다. -get_ssm_param() { - local param_name="$1" - docker run --rm --network host \ - -e AWS_DEFAULT_REGION=ap-northeast-2 \ - amazon/aws-cli ssm get-parameter \ - --name "$param_name" \ - --with-decryption \ - --query 'Parameter.Value' \ - --output text -} - -# metrics/logs/token 5종은 필수 - 없으면 관측이 성립하지 않으므로 즉시 실패. -GRAFANA_METRICS_URL=$(get_ssm_param /piki/observability/grafana-metrics-url) \ - || { echo "필수 SSM 파라미터 조회 실패: /piki/observability/grafana-metrics-url" >&2; exit 1; } -GRAFANA_METRICS_USER=$(get_ssm_param /piki/observability/grafana-metrics-user) \ - || { echo "필수 SSM 파라미터 조회 실패: /piki/observability/grafana-metrics-user" >&2; exit 1; } -GRAFANA_LOGS_URL=$(get_ssm_param /piki/observability/grafana-logs-url) \ - || { echo "필수 SSM 파라미터 조회 실패: /piki/observability/grafana-logs-url" >&2; exit 1; } -GRAFANA_LOGS_USER=$(get_ssm_param /piki/observability/grafana-logs-user) \ - || { echo "필수 SSM 파라미터 조회 실패: /piki/observability/grafana-logs-user" >&2; exit 1; } -GRAFANA_CLOUD_TOKEN=$(get_ssm_param /piki/observability/grafana-cloud-token) \ - || { echo "필수 SSM 파라미터 조회 실패: /piki/observability/grafana-cloud-token" >&2; exit 1; } - -# traces 2종은 선택 - 없으면 빈 값으로 둔다. 공통 config.alloy 가 더미 endpoint 로 -# fallback 해 trace export 만 비활성화되고(metrics/logs 는 정상 동작), 스크립트는 실패하지 않는다. -GRAFANA_TRACES_URL=$(get_ssm_param /piki/observability/grafana-traces-url) || GRAFANA_TRACES_URL="" -GRAFANA_TRACES_USER=$(get_ssm_param /piki/observability/grafana-traces-user) || GRAFANA_TRACES_USER="" - -export GRAFANA_METRICS_URL GRAFANA_METRICS_USER -export GRAFANA_LOGS_URL GRAFANA_LOGS_USER -export GRAFANA_TRACES_URL GRAFANA_TRACES_USER -export GRAFANA_CLOUD_TOKEN +# provision-alloy-ssm.sh 는 자기 형제 경로의 provision-alloy.sh 를 호출하므로 셋을 같은 디렉터리에 받는다. +for f in config.alloy provision-alloy.sh provision-alloy-ssm.sh; do + curl -fsSL "$INFRA_RAW_BASE/$f" -o "$WORK_DIR/$f" \ + || { echo "$f fetch 실패 (ref=$REF)" >&2; exit 1; } +done -# --- 3. 공통 블록 호출 - 이 박스는 prod 전용이라 environment=prod 고정 --- +# --- 2. 공통 블록 호출 - 이 박스는 prod 전용이라 environment=prod 고정 --- # (dev extractor 는 core dev 박스에 동거하며 그쪽 배선은 core 소관, 여기서 다루지 않는다) -bash "$WORK_DIR/provision-alloy.sh" \ +# 자격(SSM) 조회·필수/선택 판정은 블록이 한다 - 이 스크립트는 박스 값만 넘긴다. +bash "$WORK_DIR/provision-alloy-ssm.sh" \ --config "$WORK_DIR/config.alloy" \ --name piki-alloy \ --environment prod \