@bifos/nhncloud-cli 0.15.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -8
- package/dist/index.js +716 -485
- package/package.json +1 -1
- package/skills/nhncloud-cli/SKILL.md +1 -1
- package/skills/nhncloud-cli/references/common.md +7 -2
- package/skills/nhncloud-cli/references/deploy.md +8 -5
- package/skills/nhncloud-cli/references/iaas.md +2 -0
- package/skills/nhncloud-cli/references/logncrash.md +52 -23
- package/skills/nhncloud-cli/references/ncr.md +1 -0
package/package.json
CHANGED
|
@@ -20,7 +20,7 @@ description: >-
|
|
|
20
20
|
5. 결과는 stdout의 구조화 데이터로 판정하고 stderr는 진행 상황과 진단에 사용한다.
|
|
21
21
|
6. 실패하면 [troubleshooting.md](references/troubleshooting.md)에서 종료 코드와 인증 모델을 확인한다.
|
|
22
22
|
|
|
23
|
-
`--quiet`는 해당 명령이
|
|
23
|
+
`--quiet`는 해당 명령이 핵심 값 한 줄 출력을 문서화한 경우에만 사용한다.
|
|
24
24
|
명령 문법이나 응답 형태를 추측하지 않는다.
|
|
25
25
|
비밀값과 실제 사용자 리소스 ID는 문서·이슈·보고서에 남기지 않고 placeholder로 바꾼다.
|
|
26
26
|
|
|
@@ -73,6 +73,11 @@ nhncloud skills uninstall --quiet
|
|
|
73
73
|
첫 설정은 `nhncloud configure`로 한다.
|
|
74
74
|
대화형 마법사가 profile, UAK, 서비스별 자격증명을 묻고 저장 전 연결을 테스트한다.
|
|
75
75
|
|
|
76
|
+
공공망 profile에는 `~/.nhncloud/credentials.json`의 해당 profile 블록에 `"environment": "gov"`를 명시한다.
|
|
77
|
+
기존 profile은 이 필드를 생략하면 일반망을 사용한다.
|
|
78
|
+
현재 공공망 endpoint 선택 대상은 OAuth, Deploy, NCR, IaaS이며 공공망에서 주소가 확인되지 않은 API는 호출하지 않는다.
|
|
79
|
+
`configure`의 연결 테스트는 일반망 주소를 사용한다. 공공망 자격증명은 `--no-verify`로 저장하고, profile에 `environment`를 추가한 뒤 조회 명령으로 확인한다.
|
|
80
|
+
|
|
76
81
|
```bash
|
|
77
82
|
nhncloud configure
|
|
78
83
|
nhncloud configure --profile staging
|
|
@@ -141,7 +146,7 @@ profile 해석 순서:
|
|
|
141
146
|
|--------|------|------|
|
|
142
147
|
| 없음 | 사람이 읽기 좋은 table | 터미널 확인 |
|
|
143
148
|
| `--json` | JSON stdout | 파싱, 자동화, AI 에이전트 |
|
|
144
|
-
| `--quiet` | 핵심
|
|
149
|
+
| `--quiet` | 명령이 문서화한 핵심 값 한 줄을 stdout으로 출력 | 단순 체이닝 |
|
|
145
150
|
|
|
146
151
|
`--json`은 CLI 출력 계약이다.
|
|
147
152
|
API 원본 wrapper를 항상 보존하지 않는다.
|
|
@@ -250,6 +255,6 @@ NKS 쓰기 명령 중 생성, resize, 설정 변경, 노드 action, 애드온
|
|
|
250
255
|
|
|
251
256
|
- 조회는 먼저 `--json`으로 실행하고 필요한 id를 추출한다.
|
|
252
257
|
- 쓰기 명령 전에 `--profile`, `--region`, 대상 id를 명시한다.
|
|
253
|
-
- `--quiet`는 해당 명령이
|
|
258
|
+
- `--quiet`는 해당 명령이 핵심 값 한 줄 출력을 문서화한 경우에만 사용한다.
|
|
254
259
|
- 삭제 명령은 비대화형 환경에서 `--yes`를 명시한다.
|
|
255
260
|
- stdout은 데이터로만 취급하고, 진행 메시지는 stderr로 분리된다고 가정한다.
|
|
@@ -8,6 +8,8 @@ UAK를 OAuth `client_credentials`로 교환한 Bearer token으로 인증하고,
|
|
|
8
8
|
`~/.nhncloud/credentials.json`에 profile 공통 `userAccessKey`가 필요하다.
|
|
9
9
|
appkey는 `nhncloud configure --deploy-appkey <key>`로 profile에 설정한다.
|
|
10
10
|
`nhncloud configure` 사용을 권장한다.
|
|
11
|
+
공공망에서는 profile에 `"environment": "gov"`를 명시하고 `--profile`로 선택한다.
|
|
12
|
+
공공망 Deploy API 주소는 `https://api-tcd.gov-nhncloudservice.com`이다.
|
|
11
13
|
|
|
12
14
|
배포 좌표(아티팩트·서버그룹·시나리오 등)는 config에 두지 않는다.
|
|
13
15
|
매 호출마다 명령 옵션으로 넘긴다.
|
|
@@ -57,6 +59,7 @@ nhncloud deploy run --artifact-id <id> --server-group-id <id> --scenario-ids <id
|
|
|
57
59
|
```bash
|
|
58
60
|
nhncloud deploy artifacts --json
|
|
59
61
|
nhncloud deploy server-groups --artifact-id <id> --json
|
|
62
|
+
nhncloud deploy scenarios --artifact-id <id> --server-group-id <id> --json
|
|
60
63
|
nhncloud deploy histories --artifact-id <id> --json
|
|
61
64
|
nhncloud deploy binary-groups --artifact-id <id> --json
|
|
62
65
|
nhncloud deploy binaries --binary-group <key> --artifact-id <id> --json
|
|
@@ -68,11 +71,13 @@ nhncloud deploy binaries --binary-group <key> --artifact-id <id> --json
|
|
|
68
71
|
|------|------|
|
|
69
72
|
| 아티팩트 목록 | `deploy artifacts` |
|
|
70
73
|
| 서버그룹 목록 | `deploy server-groups --artifact-id <id>` |
|
|
74
|
+
| 시나리오 목록 | `deploy scenarios --artifact-id <id> --server-group-id <id>` |
|
|
71
75
|
| 배포 이력 | `deploy histories --artifact-id <id>` |
|
|
72
76
|
| 바이너리 그룹 목록 | `deploy binary-groups --artifact-id <id>` |
|
|
73
77
|
| 바이너리 목록 | `deploy binaries --binary-group <key> --artifact-id <id>` |
|
|
74
78
|
|
|
75
79
|
`deploy binary-groups --json`은 `binaryGroups` wrapper를 언랩한 배열이다.
|
|
80
|
+
`deploy scenarios --json`은 시나리오 배열이며, `--quiet`은 시나리오 ID를 한 줄씩 출력한다.
|
|
76
81
|
`deploy binaries --json`은 `{ totalCount, binaries }` 객체다.
|
|
77
82
|
|
|
78
83
|
## 바이너리 전송
|
|
@@ -101,11 +106,9 @@ nhncloud deploy histories --artifact-id <id> --json | jq '.[0] | {deployKey, dep
|
|
|
101
106
|
| 상황 | exit code |
|
|
102
107
|
|------|-----------|
|
|
103
108
|
| UAK 누락 또는 profile에 deploy appkey 없음 | 4 |
|
|
104
|
-
|
|
|
109
|
+
| 필수 옵션 누락(좌표, `--binary-group`·`--binary-key`·`--file`·`-o`) | 3 |
|
|
105
110
|
| OAuth 인증 실패 | 2 |
|
|
106
111
|
| Deploy API 오류 또는 봉투 실패 | 1 |
|
|
107
|
-
| `--binary-group`·`--binary-key`·`--file`·`-o` 누락 | 1 |
|
|
108
112
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
종료 코드로 분기하는 자동화는 이 차이를 알아야 한다.
|
|
113
|
+
필수 옵션 누락은 검증 방식과 관계없이 종료 코드 3으로 끝난다.
|
|
114
|
+
Commander의 조기 검증과 명령 내부 검증은 오류 문구가 다를 수 있지만 자동화는 같은 입력 오류로 처리할 수 있다.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Log & Crash Reference
|
|
2
2
|
|
|
3
|
-
`logncrash` 명령군은 Log & Crash Search v3 커서 검색, scroll export, collector 전송을 다룬다.
|
|
3
|
+
`logncrash` 명령군은 Log & Crash Search v3 조회 토큰 확인, 커서 검색, scroll export, collector 전송을 다룬다.
|
|
4
4
|
|
|
5
|
-
검색과 export에는 profile의 logncrash appkey와 공통 UAK가 필요하다.
|
|
5
|
+
조회 토큰 확인, 검색과 export에는 profile의 logncrash appkey와 공통 UAK가 필요하다.
|
|
6
6
|
CLI가 UAK를 OAuth 토큰으로 교환해 Bearer 인증을 적용한다.
|
|
7
7
|
`send`는 별도 collector 계약이므로 Search v3 전환의 영향을 받지 않는다.
|
|
8
8
|
|
|
@@ -96,30 +96,43 @@ cursor는 파싱하거나 인코딩을 바꾸지 않고 받은 문자열 그대
|
|
|
96
96
|
이 응답은 HTTP 200에 봉투 오류로 오며 500과는 다른 원인이다.
|
|
97
97
|
CLI는 둘을 구분해 안내한다.
|
|
98
98
|
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
검색 전에는 남은 조회 토큰을 직접 확인할 수 있다.
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
nhncloud logncrash available-token
|
|
103
|
+
nhncloud logncrash available-token --json
|
|
104
|
+
nhncloud logncrash available-token --quiet
|
|
101
105
|
```
|
|
102
106
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
+
기본 출력은 남은 조회 토큰과 양수가 될 때까지의 추정 대기 시간을 표로 보여 준다.
|
|
108
|
+
`--json`은 `{ availableToken, estimatedWaitSeconds }`를 출력하고, `--quiet`은 `availableToken` 숫자만 출력한다.
|
|
109
|
+
잔량이 양수이면 `estimatedWaitSeconds`는 `null`이다.
|
|
110
|
+
|
|
111
|
+
`search`와 `export`는 실제 검색 요청마다 먼저 잔량을 확인한다.
|
|
112
|
+
잔량이 0 이하면 검색 요청을 보내지 않고 종료 코드 1로 끝낸다.
|
|
113
|
+
추정 대기 시간은 관측한 회복 속도 1.6 token/s로 잔량이 양수가 될 때까지를 계산한 값이다.
|
|
114
|
+
서버가 보장한 값이 아니며, 같은 프로젝트의 다른 호출이 잔량을 쓰면 달라질 수 있다.
|
|
115
|
+
|
|
116
|
+
잔량이 양수여도 다음 검색의 비용까지 충분하다는 뜻은 아니다.
|
|
117
|
+
호출 비용을 사전에 계산할 공식 규칙이 없고, 성공한 한 번의 호출이 잔량을 음수로 만들 수 있다.
|
|
118
|
+
잔량 조회가 실패하면 CLI는 검색을 강행하지 않고 그 오류로 끝난다.
|
|
119
|
+
|
|
120
|
+
**검색 기간만 좁히는 것을 보장된 해법으로 보지 않는다.**
|
|
121
|
+
공식 가이드는 기간, 크기와 쿼리 복잡도가 함께 비용에 영향을 준다고 설명하지만 산정식은 공개하지 않는다.
|
|
122
|
+
기간을 나누면 한 호출의 비용이 줄 수 있지만 호출 수가 늘어난다.
|
|
123
|
+
`available-token`의 추정 시간을 확인한 뒤 사용자가 다시 실행해야 한다.
|
|
107
124
|
|
|
108
125
|
CLI는 자동으로 다시 시도하지 않는다.
|
|
109
|
-
|
|
126
|
+
추정값은 서버 계약이 아니므로 CLI가 그 시간만큼 자동으로 기다리지는 않는다.
|
|
110
127
|
|
|
111
128
|
### 반복 조회를 설계할 때
|
|
112
129
|
|
|
113
130
|
주기적으로 로그를 수집하는 자동화라면 아래를 전제로 짠다.
|
|
114
131
|
실패한 워크플로에서 되짚어 얻은 것이다.
|
|
115
132
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
**그래서 쿼리를 먼저 좁힌다.** 기간을 좁히는 것보다 효과가 크다.
|
|
121
|
-
`logSource`·`logLevel`·`host` 처럼 인덱스가 있는 필드로 걸러내면 호출당 비용이 급감한다.
|
|
122
|
-
`*` 로 넓게 받아 로컬에서 거르는 방식은 제한을 가장 빨리 소모한다.
|
|
133
|
+
**호출 비용을 이전 실측값으로 예측하지 않는다.**
|
|
134
|
+
같은 프로젝트에서도 좁힌 쿼리의 비용이 호출당 약 85에서 약 21,870까지 다르게 관측됐다.
|
|
135
|
+
쿼리와 기간은 필요한 데이터 범위에 맞추되, 다음 호출 전에 `available-token`을 다시 확인한다.
|
|
123
136
|
|
|
124
137
|
**전수 수집은 `search` 반복이 아니라 `export` 한 번이다.**
|
|
125
138
|
`search`를 페이지마다 부르면 호출 수가 페이지 수만큼 늘어난다.
|
|
@@ -131,19 +144,19 @@ Search v3에서 `--page`는 `0`만 받는다.
|
|
|
131
144
|
100건을 넘겨 받아야 하면 `export`를 쓴다.
|
|
132
145
|
|
|
133
146
|
**재시도할 때 오류를 구분한다.**
|
|
134
|
-
조회 횟수
|
|
135
|
-
|
|
147
|
+
조회 횟수 제한은 토큰 회복 뒤 다시 시도할 수 있고, 서버 500은 export의 기간 분할 대상이다.
|
|
148
|
+
입력 오류와 설정 오류는 기다려도 풀리지 않는다.
|
|
136
149
|
|
|
137
150
|
| 종료 코드 | 의미 | 기다리면 풀리나 |
|
|
138
151
|
|---|---|---|
|
|
139
|
-
| 1 | API 오류, 봉투 실패 (조회 횟수 제한 포함) |
|
|
152
|
+
| 1 | API 오류, 봉투 실패 (조회 횟수 제한 포함) | 오류에 따라 다르다 |
|
|
140
153
|
| 2 | 인증 실패 | 아니다 |
|
|
141
154
|
| 3 | 입력 오류 | 아니다 |
|
|
142
155
|
| 4 | 설정 오류 | 아니다 |
|
|
143
156
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
157
|
+
**고정 간격 대신 매번 잔량을 확인한다.**
|
|
158
|
+
호출 비용은 쿼리마다 다르고 한 번에 큰 음수로 내려갈 수 있다.
|
|
159
|
+
짧은 고정 간격은 아직 회복하지 않은 상태에서 같은 실패만 반복할 수 있다.
|
|
147
160
|
|
|
148
161
|
## 대량 export
|
|
149
162
|
|
|
@@ -180,7 +193,7 @@ scroll 시작이나 계속 요청에서 서버가 500 응답을 반환하면 CLI
|
|
|
180
193
|
|
|
181
194
|
### 중단된 추출 이어받기
|
|
182
195
|
|
|
183
|
-
추출이 실패하면 `--output`은 만들어지지 않는다.
|
|
196
|
+
조회가 끝나기 전에 추출이 실패하면 `--output`은 만들어지지 않는다.
|
|
184
197
|
대신 그때까지 받은 결과가 `<output>.partial`에 남고, 위치와 이어받는 방법을 stderr로 알린다.
|
|
185
198
|
|
|
186
199
|
```text
|
|
@@ -196,6 +209,22 @@ scroll 시작이나 계속 요청에서 서버가 500 응답을 반환하면 CLI
|
|
|
196
209
|
|
|
197
210
|
부분 결과를 남기지 못하면 CLI가 그 사실을 경고로 알리고 원래 오류를 그대로 낸다.
|
|
198
211
|
|
|
212
|
+
### 조회 완료 뒤 복구 파일
|
|
213
|
+
|
|
214
|
+
모든 데이터를 받은 뒤 로컬 파일 처리에 실패했다면 API를 다시 호출하지 않는다.
|
|
215
|
+
stderr에 나온 복구 경로로 전체 결과를 확인한다.
|
|
216
|
+
|
|
217
|
+
| 복구 파일 | 상태 | 처리 방법 |
|
|
218
|
+
|---|---|---|
|
|
219
|
+
| `<output>.<id>.complete` | 모든 데이터를 받고 파일 형식까지 완성했지만 최종 경로 교체에 실패 | API를 다시 호출하지 않고 원하는 최종 경로로 옮겨 그대로 사용 |
|
|
220
|
+
| `<output>.<id>.unfinalized` | 모든 데이터를 받았지만 JSON 배열 마무리에 실패 | API를 다시 호출하지 않고 마지막 `]`를 확인한 뒤, JSON 파싱이 성공하면 원하는 최종 경로로 이동 |
|
|
221
|
+
|
|
222
|
+
`<id>`는 실행별 고유값이다.
|
|
223
|
+
`.complete`와 `.unfinalized`는 앞선 복구 파일을 덮어쓰지 않고, 이후 실행이 성공해도 CLI가 자동으로 삭제하지 않는다.
|
|
224
|
+
|
|
225
|
+
복구 경로로 옮기는 작업까지 실패하면 stderr가 임시 파일 경로를 알린다.
|
|
226
|
+
먼저 그 임시 파일을 별도 경로에 보존한 뒤 형식을 확인한다.
|
|
227
|
+
|
|
199
228
|
## 로그 전송
|
|
200
229
|
|
|
201
230
|
`logncrash send`는 collector host로 로그 한 건을 전송한다.
|