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 \