@bifos/nhncloud-cli 0.3.0 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  # nhncloud-cli
2
2
 
3
3
  NHN Cloud 서비스를 AWS CLI 방식으로 호출하는 통합 CLI.
4
- 현재 `logncrash search` (Log & Crash 로그 검색) 지원한다.
4
+ 현재 `configure`, `logncrash search/send` (Log & Crash 로그 검색·전송), `deploy` (배포·바이너리 조회·업로드·다운로드), `instance` (Compute 인스턴스 목록·발급·전원 제어·타입 변경·키페어 관리·이미지·가용성 영역 조회·볼륨 연결 포함), `network` (VPC·서브넷 목록 조회), `volume` (Block Storage 볼륨 목록·조회·생성), `ncr` (NHN Container Registry 레지스트리 목록·조회·이미지 목록·태그 목록) 명령을 지원한다.
5
5
 
6
6
  ## 설치
7
7
 
@@ -17,7 +17,7 @@ npm install -g @bifos/nhncloud-cli
17
17
  nhncloud configure
18
18
  ```
19
19
 
20
- - profile → UAK(id/secret) → logncrash appkey/secret → iaas 자격증명 순으로 입력한다.
20
+ - profile → UAK(id/secret) → logncrash appkey/secret → iaas 자격증명 → ncr appkey 순으로 입력한다.
21
21
  - 저장 전 연결 테스트를 자동으로 수행한다 (`--no-verify` 로 생략 가능).
22
22
  - CI/자동화는 flag 로 비대화형 설정이 가능하다.
23
23
 
@@ -88,6 +88,24 @@ nhncloud deploy server-groups my-service
88
88
 
89
89
  # 배포 이력 조회
90
90
  nhncloud deploy histories my-service
91
+
92
+ # 바이너리 그룹 목록 — 그룹 key 확인
93
+ nhncloud deploy binary-groups my-service
94
+
95
+ # 위에서 확인한 key 로 바이너리 목록 조회
96
+ nhncloud deploy binaries my-service --binary-group <key>
97
+
98
+ # 업로드 최신순 정렬 + 전체 필드는 --json
99
+ nhncloud deploy binaries my-service --binary-group <key> --sort-key UPLOAD_DATE --sort-direction DESC --json
100
+
101
+ # 바이너리 업로드 — binary-groups 로 확인한 그룹 key 에 파일 올리기
102
+ nhncloud deploy upload <target> --file ./build/app.jar --binary-group <key> --description "release build"
103
+
104
+ # 업로드 응답의 binaryKey 만 필요하면 --quiet
105
+ nhncloud deploy upload <target> --file ./build/app.jar --binary-group <key> --quiet
106
+
107
+ # 바이너리 다운로드 — 파일로 저장 (기본 덮어쓰기 거부, --force 로 강제)
108
+ nhncloud deploy download <target> --binary-group <key> --binary-key <binary-key> -o ./app.jar
91
109
  ```
92
110
 
93
111
  ### 로그 검색
@@ -103,6 +121,56 @@ nhncloud logncrash search \
103
121
  시간은 상대시간 (`1h` / `30m` / `2d` / `now`) 또는 ISO8601 (`2026-05-01T00:00:00+09:00`) 로 입력한다.
104
122
  API 제약상 검색 시작은 최근 90일 이내, 검색 범위는 31일 이하여야 한다 (초과 시 입력 오류로 거절).
105
123
 
124
+ ### 로그 대량 추출 (export)
125
+
126
+ ```bash
127
+ # 검색 결과 전체를 파일로 추출 (JSON Lines, scroll 순회)
128
+ nhncloud logncrash export \
129
+ --query 'logType:"ERROR"' \
130
+ --from 1h --to now \
131
+ --output errors.jsonl
132
+
133
+ # JSON 배열 형식으로 추출
134
+ nhncloud logncrash export --query 'logType:"ERROR"' --from 1h --to now \
135
+ --output errors.json --format json
136
+ ```
137
+
138
+ 단발 검색(`search`)과 달리 scroll API 로 전체 결과(최대 10만 건)를 순회해 파일로 저장한다.
139
+ 진행 상황은 stderr, 데이터는 파일에만 기록된다(stdout 비움).
140
+ scrollKey 유효기간은 1분이므로 데이터가 많을 때는 `--size` 를 키워 페이지 수를 줄이는 것을 권장한다.
141
+ 시간 범위 제한은 search 와 동일(90일 이내·31일 이하).
142
+
143
+ #### export 옵션
144
+
145
+ | 옵션 | 필수 | 설명 |
146
+ |------|:---:|------|
147
+ | `--query <lucene>` | 예 | Lucene 질의 문자열 |
148
+ | `--from <time>` | 예 | 검색 시작 (ISO8601 또는 상대시간 `1h`/`30m`/`2d`/`now`) |
149
+ | `--to <time>` | 예 | 검색 끝 |
150
+ | `--output <file>` | 예 | 출력 파일 경로 |
151
+ | `--format <fmt>` | 아니오 | `jsonl`(기본, 한 줄당 한 로그) 또는 `json`(배열) |
152
+ | `--size <n>` | 아니오 | scroll pageSize — 범위 10~100, 기본 100 |
153
+ | `--force` | 아니오 | 출력 파일이 있으면 덮어쓴다 (기본 거부) |
154
+ | `--profile <name>` | 아니오 | 사용할 profile 이름 |
155
+
156
+ ### 로그 전송
157
+
158
+ ```bash
159
+ # 로그 한 건 전송 — 본문 직접
160
+ nhncloud logncrash send --body "결제 완료" --level INFO
161
+
162
+ # 파일에서 본문 읽어 전송
163
+ nhncloud logncrash send --file ./error.log --level ERROR
164
+
165
+ # 파이프(stdin)로 전송
166
+ echo "배치 작업 종료" | nhncloud logncrash send --level INFO
167
+
168
+ # 프로젝트 버전·소스 지정
169
+ nhncloud logncrash send --body "deploy 시작" --app-version 2.3.0 --source batch
170
+ ```
171
+
172
+ > logncrash send 는 검색과 다른 collector 로 전송하며 appkey 만 사용한다 (secret 불요). 단일 로그 본문은 8MB 까지.
173
+
106
174
  ### 출력 모드
107
175
 
108
176
  | 모드 | 옵션 | 용도 |
@@ -168,6 +236,33 @@ nhncloud logncrash search --query '*' --from 1d --to now --json | jq '.totalItem
168
236
  # 인스턴스 목록 조회
169
237
  nhncloud instance list
170
238
 
239
+ # 이미지 목록 (create --image <id> 에 넣을 image id 확인)
240
+ nhncloud instance images
241
+
242
+ # public 이미지만, 전체 필드 JSON
243
+ nhncloud instance images --visibility public --json
244
+
245
+ # 페이지네이션 — 다음 페이지
246
+ nhncloud instance images --limit 20 --marker <last-image-id>
247
+
248
+ # 인스턴스 타입(flavor) 목록 — id·name 만
249
+ nhncloud instance flavors
250
+
251
+ # 타입 상세 — vcpus·ram·disk 포함 (테이블은 핵심 5컬럼)
252
+ nhncloud instance flavors --detail
253
+
254
+ # 전체 필드(is_public·extra_specs 등)는 --json 으로
255
+ nhncloud instance flavors --detail --json
256
+
257
+ # RAM 8GB 이상 타입만 필터
258
+ nhncloud instance flavors --detail --min-ram 8192
259
+
260
+ # 가용성 영역(availability zone) 목록 (영역명·가용 여부)
261
+ nhncloud instance availability-zones
262
+
263
+ # 전체 응답(zoneState 등)은 --json 으로
264
+ nhncloud instance availability-zones --json
265
+
171
266
  # 단일 인스턴스 상태 조회
172
267
  nhncloud instance get <instance-id>
173
268
 
@@ -212,10 +307,188 @@ IP=$(nhncloud instance create --name ci-runner \
212
307
 
213
308
  # 인스턴스 삭제 (confirm 생략)
214
309
  nhncloud instance delete <instance-id> --yes
310
+
311
+ # 인스턴스 타입(flavor) 변경 — 후보 id 는 instance flavors 로 조회
312
+ nhncloud instance flavors --detail
313
+ nhncloud instance resize <instance-id> --flavor <flavor-id>
314
+
315
+ # resize 후 VERIFY_RESIZE 상태 — 확정 또는 롤백
316
+ nhncloud instance resize-confirm <instance-id>
317
+ nhncloud instance resize-revert <instance-id>
318
+
319
+ # 인스턴스 정지 / 시작
320
+ nhncloud instance stop <instance-id>
321
+ nhncloud instance start <instance-id>
322
+
323
+ # 재부팅 (기본 SOFT)
324
+ nhncloud instance reboot <instance-id>
325
+
326
+ # HARD 재부팅 (강제 전원 cycle)
327
+ nhncloud instance reboot <instance-id> --hard
328
+
329
+ # 키페어 목록 (name·fingerprint)
330
+ nhncloud instance keypairs
331
+
332
+ # 단일 키페어 조회
333
+ nhncloud instance keypair get <keypair-name>
334
+
335
+ # 키페어 생성 — NHN 이 키쌍 생성, private_key 를 0600 파일로 저장 (한 번만 받을 수 있음)
336
+ nhncloud instance keypair create <keypair-name> -o ./my-key.pem
337
+
338
+ # 기존 공개키 등록 (private_key 미반환)
339
+ nhncloud instance keypair create <keypair-name> --public-key ~/.ssh/id_rsa.pub
340
+
341
+ # 키페어 삭제
342
+ nhncloud instance keypair delete <keypair-name>
215
343
  ```
216
344
 
345
+ > **private_key 안내**: 키페어 생성 시 NHN 이 만든 private_key 는 생성 응답 **한 번만** 반환됩니다.
346
+ > `-o <keyfile>` 로 저장하거나 stdout 을 안전한 곳에 보관하세요. 분실 시 복구할 수 없습니다.
347
+
217
348
  지원 region: `kr1` / `kr2` / `kr3` / `jp1` (`--region` 으로 override 가능).
218
349
 
350
+ ### 네트워크 (Network)
351
+
352
+ `instance create --network <uuid>` 에 넣을 VPC id 를 확인하거나 서브넷 구성을 조회한다.
353
+ `network` 명령군은 `instance` 와 같은 `iaas` 자격증명·Keystone 토큰을 공유한다 — 별도 설정이 필요 없다.
354
+
355
+ ```bash
356
+ # VPC 목록 (instance create --network <uuid> 에 넣을 VPC id 확인)
357
+ nhncloud network list
358
+
359
+ # 전체 필드 JSON
360
+ nhncloud network list --json
361
+
362
+ # 서브넷 목록 (소속 VPC·CIDR·가용 IP 확인)
363
+ nhncloud network subnet list
364
+
365
+ # 다른 region
366
+ nhncloud network list --region kr2
367
+
368
+ # create 흐름 — 확인한 VPC id 를 --network 에 사용 (--network 가 받는 uuid = VPC id, 실측 확정)
369
+ nhncloud instance create \
370
+ --name web \
371
+ --flavor <flavor-id> \
372
+ --image <image-id> \
373
+ --network <network-uuid>
374
+ ```
375
+
376
+ > **`--network` 가 받는 id**: `network list` 의 VPC id 를 그대로 `--network` 에 사용한다.
377
+ > subnet id 가 아니다 — `instance list --json` 의 addresses 키와 VPC name 이 1:1 대응함을 실측으로 확인.
378
+
379
+ ### Block Storage (Volume)
380
+
381
+ 독립 블록 스토리지 볼륨을 관리한다.
382
+ `volume` 명령군은 `instance`·`network` 와 같은 `iaas` 자격증명·Keystone 토큰을 공유한다 — 별도 설정이 필요 없다.
383
+
384
+ **볼륨 생성(`volume create`)·인스턴스 연결(`instance volume attach`)·연결 해제(`instance volume detach`)는 쓰기 작업이므로 실행 전 환경을 확인한다(수동 QA 필수).**
385
+
386
+ ```bash
387
+ # 볼륨 목록 조회
388
+ nhncloud volume list
389
+
390
+ # 정렬·페이지네이션
391
+ nhncloud volume list --sort created_at:desc --limit 20
392
+
393
+ # 단일 볼륨 조회
394
+ nhncloud volume get <volume-id>
395
+
396
+ # 전체 필드 JSON
397
+ nhncloud volume get <volume-id> --json
398
+
399
+ # 볼륨 생성 — ⚠️ 쓰기 작업, 실행 전 환경 확인 필수
400
+ nhncloud volume create --size 10
401
+
402
+ # 이름·타입 지정
403
+ nhncloud volume create --size 50 --name my-volume --volume-type "General SSD"
404
+
405
+ # 인스턴스에 연결된 볼륨 목록 조회
406
+ nhncloud instance volumes <instance-id>
407
+
408
+ # 볼륨 연결 — ⚠️ 쓰기 작업 (--volume 플래그로 볼륨 ID 지정)
409
+ nhncloud instance volume attach <instance-id> --volume <volume-id>
410
+
411
+ # 볼륨 연결 해제 — ⚠️ 쓰기 작업 (인스턴스 ID + 볼륨 ID 위치 인수)
412
+ nhncloud instance volume detach <instance-id> <volume-id>
413
+ ```
414
+
415
+ > **UX 비대칭**: `attach` 는 `--volume <id>` 플래그로 볼륨을 지정하고,
416
+ > `detach` 는 `<instanceId> <volumeId>` 위치 인수 두 개로 지정한다.
417
+
418
+ 지원 region: `kr1` / `kr2` / `kr3` / `jp1` (`--region` 으로 override 가능).
419
+
420
+ ### 공인 IP (Floating IP)
421
+
422
+ Floating IP 를 발급해 인스턴스에 부여하는 공인 IP 를 관리한다.
423
+ `floatingip` 명령군은 `network` 와 같은 `iaas` 자격증명·Keystone 토큰을 공유한다.
424
+
425
+ ```bash
426
+ # Floating IP 목록
427
+ nhncloud floatingip list
428
+
429
+ # Floating IP 발급 (--network 미지정 시 외부 VPC 자동 조회)
430
+ nhncloud floatingip create
431
+ nhncloud floatingip create --network <network-uuid>
432
+
433
+ # 삭제
434
+ nhncloud floatingip delete <floatingip-id> --yes
435
+ ```
436
+
437
+ > **associate**: `floatingip associate <floatingip-id> <instance-id>` 는 instance→port_id 매핑 경로 미확정으로 보류 중.
438
+ > 실측으로 경로가 확정되면 후속 task 에서 추가한다.
439
+
440
+ ### NHN Container Registry (NCR)
441
+
442
+ NCR Management API 로 레지스트리를 조회한다.
443
+ 인증은 공통 UAK(`X-TC-AUTHENTICATION-ID/SECRET` 정적 헤더)를 재사용하며 OAuth 토큰 교환이 없다.
444
+ appKey 는 NHN Cloud 콘솔 → Container Registry 서비스에서 확인한다.
445
+
446
+ ```bash
447
+ # ncr appkey 설정 (비대화형)
448
+ nhncloud configure --ncr-appkey <appkey>
449
+
450
+ # 레지스트리 목록 조회
451
+ nhncloud ncr list --app-key <appkey>
452
+
453
+ # region 지정 (기본: kr1)
454
+ nhncloud ncr list --region kr2 --app-key <appkey>
455
+
456
+ # JSON 출력
457
+ nhncloud ncr list --app-key <appkey> --json
458
+
459
+ # 단일 레지스트리 조회 (이름 또는 ID)
460
+ nhncloud ncr get <registry-name> --app-key <appkey>
461
+ ```
462
+
463
+ appKey 를 `nhncloud configure --ncr-appkey <appkey>` 로 저장해 두면 `--app-key` 없이도 호출할 수 있다.
464
+
465
+ ```bash
466
+ # configure 로 저장 후 --app-key 생략
467
+ nhncloud configure --ncr-appkey <appkey>
468
+ nhncloud ncr list
469
+ nhncloud ncr get <registry-name>
470
+ ```
471
+
472
+ 이미지(repository)·태그는 레지스트리 데이터플레인 Harbor REST API 를 직접 호출한다.
473
+ UAK 를 Basic Auth 로 사용하며 추가 설정은 없다.
474
+
475
+ ```bash
476
+ # 이미지(repository) 목록 조회
477
+ nhncloud ncr images <registry>
478
+
479
+ # region 지정
480
+ nhncloud ncr images <registry> --region kr2
481
+
482
+ # JSON 출력
483
+ nhncloud ncr images <registry> --json
484
+
485
+ # 특정 이미지의 태그 목록 조회
486
+ nhncloud ncr tags <registry> <repository>
487
+
488
+ # JSON 출력 (태그·push_time·size)
489
+ nhncloud ncr tags <registry> <repository> --json
490
+ ```
491
+
219
492
  ## 개발
220
493
 
221
494
  ```bash
@@ -224,4 +497,5 @@ pnpm run build # tsup 단일 번들 (dist/index.js)
224
497
  pnpm tsc --noEmit # 타입 체크
225
498
  node dist/index.js instance --help
226
499
  node dist/index.js logncrash search --help
500
+ node dist/index.js ncr --help
227
501
  ```