## 운영 구조

**2026-09-27 기록 · biolem-server.** 필요할 때 EC2 애플리케이션과 RDS 데이터베이스를 함께 켜고, 사용하지 않을 때 중지하는 운영 절차다. 앱은 이 서버를 이용하므로 전원 상태가 로그인·저장·조회 가능 여부에 직접 영향을 준다.

`aws-power`는 자연어 요청을 `status`, `start`, `stop`으로 연결하는 스킬이다. 실제 조작은 AWS API를 호출하는 실행 스크립트가 담당한다. 이 노트의 명령과 흐름은 설명이며 웹페이지에서 전원을 조작하지 않는다.

| 담당 | 역할 |
| --- | --- |
| EC2 | 애플리케이션·Docker·배포 러너 실행 |
| RDS | PostgreSQL 데이터 보관과 요청 처리 |
| aws-power | 대상 리소스 조회·시작·중지 요청 |
| EventBridge Scheduler | AWS 안에서 정해진 시간에 중지 실행 |
| Claude·Codex 점검 | 종료 여부를 확인하고 필요한 경우 stop 요청 |

## 상태와 전원 명령

로컬에서는 `biolem-server` 저장소에서 실행한다. 어느 앱을 켜는지 먼저 확인하고, 상태 조회 → 전환 요청 → 실제 상태 재조회 순서를 지킨다. 아래 세 명령 중 목적에 맞는 명령을 각각 선택한다.

```bash
# biolem-server 저장소에서 실행
bash infra/aws-power.sh status
bash infra/aws-power.sh start
bash infra/aws-power.sh stop
```

| 요청 | 스크립트의 조건 | 완료 판단 |
| --- | --- | --- |
| status | EC2·RDS 각각 조회 | 두 상태가 모두 정상적으로 반환됨 |
| start | stopped인 리소스에 시작 요청 | EC2 running + RDS available + 핵심 API 응답 |
| stop | EC2 running / RDS available에 중지 요청 | 두 리소스 모두 stopped |

`starting`·`stopping`은 전환 중이다. 명령이 끝나거나 몇 분이 지났다는 이유로 완료라고 보고하지 않는다. 빈 응답·인증 실패·권한 오류도 정상 중지로 처리하지 않는다. 로컬 스크립트는 일부 조회 오류를 숨기므로 상태 출력이 비어 있으면 별도 오류 확인이 필요하다.

EC2가 켜진 뒤 Docker의 재시작 정책과 systemd 러너가 복구되도록 구성했다. 인스턴스 상태와 앱의 정상 응답은 별도로 확인한다.

## 로컬과 클라우드 실행

| 경로 | 실행 위치 | 준비와 확인 |
| --- | --- | --- |
| 로컬 Mac | biolem-server의 infra/aws-power.sh | 로컬 AWS 자격증명, CLI, 대상 리전 확인 |
| Codex Cloud | biolem-aws-power 환경의 새 작업 | setup이 발급한 STS 임시 인증정보와 실행 래퍼 사용 |
| Claude Cloud | biolem-server 세션과 저장된 환경 | 전용 IAM 키·리전·스킬 설정, 실제 호출 확인 |

Codex Cloud에서는 setup 단계에서 전용 IAM 사용자로 **1시간 STS 임시 인증정보**를 발급한다. 저장소 밖에 보관하고 컨테이너 캐싱을 꺼 새 작업에서 다시 발급하도록 구성했다. 장기 키를 에이전트 파일이나 Git에 남기지 않는다.

```bash
# 준비된 Codex Cloud 환경의 실행 래퍼
~/.local/share/biolem-aws-power/aws-power status
```

Codex Cloud는 실제 EC2·RDS 조회와 EC2 start/stop 권한 dry-run을 확인한 기록이 있다. dry-run은 실제 전원 전환 성공을 뜻하지 않는다. Claude Cloud는 환경 저장·스킬 등록 기록까지 확인했고, 실제 AWS 호출은 해당 기록에서 미검증이다.

Cloud 실행은 Mac 전원과 독립적이다. 반면 Mac에서 실행하는 Codex 예약은 Mac과 앱이 실행 중이어야 한다. 이름이 같은 도구라도 실행 위치와 자격증명을 구분한다.

## 자동 종료와 추가 점검

저장된 설정·운영 기록 기준의 일정이다. 현재 활성 상태와 최근 실행 성공 여부는 작업 시 다시 조회한다.

| 시각 · 한국 시간 | 실행 주체 | 동작과 조건 |
| --- | --- | --- |
| 매일 10:00 | AWS EventBridge Scheduler | EC2·RDS 각각 중지. Mac 없이 AWS에서 실행 |
| 매일 10:10 | Claude Cloud 루틴 | 상태 확인 후 필요한 경우 중지하도록 설정 |
| 매일 10:10 | Codex 로컬 자동화 | Mac·앱이 실행 중일 때 상태 확인 후 필요한 경우 중지 |

Scheduler 설정은 `infra/create-auto-stop.sh`의 `cron(0 10 * * ? *)`, 시간대 `Asia/Seoul`이다. EC2·RDS용 스케줄 두 개와 지정 리소스의 중지만 허용하는 역할을 사용한다. 수동 전원 봇의 조회·시작·중지 권한과 Scheduler 역할은 별도다.

```bash
# 예약 목록 조회
aws scheduler list-schedules \
  --region ap-northeast-2 \
  --name-prefix biolem-auto-stop
```

스케줄 존재만으로 실행 성공을 판단하지 않는다. 최근 실행 결과와 EC2·RDS 실제 상태를 대조한다. 이미 중지된 RDS에 중지를 요청하면 오류가 날 수 있으므로 상태와 함께 읽는다.

## 비용과 가용성

RDS는 7일 연속 중지 후 자동으로 다시 시작한다. 중지 중에도 프로비저닝된 저장공간과 백업 비용은 남는다. 따라서 한 번 수동 중지한 것으로 장기 비용 관리가 끝나지 않는다. [AWS RDS 중지 안내](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_StopInstance.html)

EC2도 중지만으로 EBS와 유지하는 공인 IPv4 등 모든 비용이 없어지는 것은 아니다. 청구 항목을 따로 확인한다. [AWS EC2 중지 안내](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Stop_Start.html)

**개발 중 비용 절감과 심사·서비스 가용성을 함께 결정한다.** App Store 심사 중에는 테스트 계정과 API가 계속 동작해야 한다. EventBridge, Claude 루틴, Codex 로컬 예약 세 경로를 모두 확인해 심사 운영에 맞춘 뒤, API·로그인·기록 저장을 실제로 점검한다.

기본 스케줄을 설명하는 이 노트만 보고 예약을 해제하거나 서버를 켜지 않는다. 운영 기간·대상·변경 결과를 따로 기록하고, 기간이 끝나면 합의된 비용 관리 정책으로 복귀한다. [아이폰 앱 배포 절차](/about/ios-release)

## 문제를 만났을 때

| 증상 | 확인 순서 |
| --- | --- |
| 상태가 빈 값 | AWS CLI 오류·자격증명·권한·리전 확인. stopped로 해석하지 않음 |
| ExpiredToken | Codex Cloud 새 작업에서 STS 다시 발급 |
| Codex EC2 MissingAction | Query GET과 SigV4 헤더 인증을 사용하는 최종 setup 적용 여부 확인 |
| 시작 후 앱 접속 실패 | EC2·RDS 상태 → Docker·러너 → 네트워크·API 주소 → 앱 로그인 |
| 예약을 껐는데 다시 종료 | EventBridge·Claude·Codex 세 경로 확인 |
| 폰에서 요청 후 목록으로 이동 | 클라우드 작업 목록을 다시 열어 실행 결과 확인 |

네트워크 오류를 해결하려고 TLS 검증을 해제하거나 자격증명을 공개하지 않는다. 실행 키, 계정 ID, 인스턴스 ID, 접속 IP와 심사 계정 정보는 이 공개 노트에 포함하지 않는다.

## 유지 관리할 원본

- biolem-server: `.claude/skills/aws-power/SKILL.md`, `infra/aws-power.sh`, `infra/create-auto-stop.sh`
- Codex Cloud: `infra/codex-aws-power-setup.sh`, `docs/codex-aws-power.md`와 웹에 저장된 setup
- biolem2: `docs/operations/aws-power.md`, `docs/state/aws-infra.md`
- Codex 로컬: `~/.codex/automations/biolem-aws/automation.toml`

스크립트 수정 시 스킬 설명·예약 시각·클라우드에 저장한 실행 코드도 함께 대조한다. 이번 구성 경험은 [이력서](/submit#biolem), [경력 상세](/about#biolem), [프로젝트 도표](/resume#biolem)에서 확인할 수 있다.
