mcp-aws-manager 0.3.8 → 0.4.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 +716 -36
- package/README_KO.md +882 -48
- package/bin/lib/enterprise-controls.js +353 -0
- package/bin/lib/integrations.js +730 -0
- package/bin/lib/mcp-server-core.js +5199 -0
- package/bin/lib/output-presentation.js +601 -0
- package/bin/mcp-aws-manager-mcp.js +104 -1157
- package/bin/mcp-aws-manager.js +9469 -751
- package/package.json +54 -7
- package/schemas/mcp-tool-response.schema.json +58 -0
- package/scripts/check-utf8.js +73 -0
- package/scripts/e2e-aws-scenarios.js +350 -0
- package/scripts/smoke-clients.js +178 -0
- package/AWS_SSO_SETUP_GUIDE.md +0 -133
- package/AWS_SSO_SETUP_GUIDE_KO.md +0 -70
- package/IMPLEMENTATION_INTEGRATIONS.md +0 -124
- package/MCP_CLIENT_SETUP.md +0 -107
- package/MCP_CLIENT_SETUP_KO.md +0 -107
- package/MCP_DIFFERENTIATION.md +0 -39
package/README_KO.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# mcp-aws-manager (한국어 안내)
|
|
1
|
+
# mcp-aws-manager (한국어 안내)
|
|
2
2
|
|
|
3
|
-
AWS 운영
|
|
3
|
+
SSM 우선(SSM-first) 방식의 AWS 운영 CLI + MCP stdio 서버입니다.
|
|
4
4
|
|
|
5
|
-
이 패키지는 AWS
|
|
5
|
+
이 패키지는 AWS 운영 작업(인벤토리/런타임/조치)을 정규화된 응답 스키마와 `ACTION_REQUIRED` 가이드로 제공합니다. 단순 AWS CLI 래퍼가 아니라, 에이전트 친화적인 운영 워크플로우 실행을 목표로 합니다.
|
|
6
6
|
|
|
7
7
|
## 빠른 시작
|
|
8
8
|
|
|
@@ -13,105 +13,939 @@ mcp-aws-manager doctor
|
|
|
13
13
|
mcp-aws-manager discover --profiles default --no-progress
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
##
|
|
17
|
-
|
|
18
|
-
- 멀티 서비스 인벤토리: EC2, Lambda, ALB/NLB, ASG, RDS, ElastiCache, Route53
|
|
19
|
-
- SSM 상태
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
16
|
+
## 무엇을 제공하나요
|
|
17
|
+
|
|
18
|
+
- 멀티 서비스 인벤토리: EC2, Lambda, ALB/NLB, ASG, RDS, ElastiCache, Route53, VPC/Subnet/SecurityGroup, ECS, S3, IAM, KMS, CloudWatch, CloudTrail, Config, Secrets Manager, ECR, DynamoDB, SNS, EventBridge, SQS, ACM, Kinesis, MSK, Budgets, Cost Anomaly, EBS, EFS, EKS, API Gateway (REST/v2), CloudFront, WAF, Shield, Step Functions, CloudWatch Logs, X-Ray, Inspector2, Redshift, OpenSearch, Organizations, ControlTower
|
|
19
|
+
- SSM 상태 가시성: managed/online
|
|
20
|
+
- 도메인 분석 파이프라인: IaC drift, CI/CD signals, backup/DR posture, security posture, FinOps cost signals, application layer health, incident severity recommendation
|
|
21
|
+
- 선택적 런타임 스냅샷 및 SSM 자동 조치
|
|
22
|
+
- 변경 표면 확장: EC2 + ECS + ASG + RDS + EKS 통제형 변경 도구
|
|
23
|
+
- 정책 기반 라우팅: mode/surface/schema-tier 자동 선택
|
|
24
|
+
- 대규모 운영 제어: Organizations AssumeRole fan-out + profile/region 샤딩
|
|
25
|
+
- 인증 불가 시 수동 모드: JSON/CSV 서버 목록 + PEM SSH/ProxyJump/Bastion 런타임 스냅샷
|
|
26
|
+
- `ACTION_REQUIRED` 기반 human-in-the-loop 재시도 루프
|
|
27
|
+
- 내부 실행 경로 고정(AWS SDK + AWS CLI)
|
|
28
|
+
- 출력 프레젠테이션 제어: output profile/sections/fields + client-aware 기본값
|
|
29
|
+
- 거버넌스 로그 + topology/relationship JSON 산출물
|
|
30
|
+
- incident webhook 연동 + incident payload artifact(선택)
|
|
31
|
+
|
|
32
|
+
## 언제 쓰면 좋은가요
|
|
33
|
+
|
|
34
|
+
`mcp-aws-manager`는 범용 AWS API 접근보다 운영 워크플로우 MCP가 필요할 때 적합합니다.
|
|
35
|
+
|
|
36
|
+
- 인벤토리/런타임/조치 루프를 결정적으로 반복 실행하고 싶을 때
|
|
37
|
+
- `ACTION_REQUIRED` 중심 운영 가이드와 산출물이 필요할 때
|
|
38
|
+
- 단순 ad-hoc API 제어만 필요하면 범용 AWS MCP가 더 단순할 수 있습니다
|
|
39
|
+
|
|
40
|
+
비교/경계는 아래 문서를 참고하세요.
|
|
41
|
+
|
|
42
|
+
- `MCP_DIFFERENTIATION.md`
|
|
43
|
+
|
|
44
|
+
## 빠른 비교 요약
|
|
45
|
+
|
|
46
|
+
| 선택 포인트 | `mcp-aws-manager` | 범용 API형 AWS MCP |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| 1차 목적 | 운영 워크플로우(인벤토리/런타임/조치) 결정적 실행 | 광범위한 ad-hoc API/툴 접근 |
|
|
49
|
+
| 도구 노출 모델 | 고정 gateway 3-tool (`capabilities_summary`, `capabilities_detail`, `gateway_execute`) | 서비스/액션별 다수 직접 툴 |
|
|
50
|
+
| 변경 안전장치 | mutate 경로 확인/정책 게이트 내장 | 서버/툴별 정책 구현에 의존 |
|
|
51
|
+
| 응답 계약 | 정규화(`ok/summary/records/requiredActions/meta`) | 구현마다 상이 |
|
|
52
|
+
| 적합한 상황 | 반복 가능한 운영 루프 + 운영자 가이드 필요 | 탐색/실험 위주의 광범위 API 접근 |
|
|
53
|
+
|
|
54
|
+
상세 근거와 경계는 `MCP_DIFFERENTIATION.md`, `MCP_DIFFERENTIATION_KO.md`를 참고하세요.
|
|
55
|
+
|
|
56
|
+
## API 커버리지 스냅샷
|
|
57
|
+
|
|
58
|
+
- AWS API 총량은 고정 숫자가 없으며(지속 증가), 전체 서비스 기준으로 매우 큽니다.
|
|
59
|
+
- 현재 구현 범위는 "모든 AWS API"가 아닙니다.
|
|
60
|
+
- 사용 중인 AWS SDK service clients: `49`
|
|
61
|
+
- 사용 중인 AWS SDK operation calls: `95`
|
|
62
|
+
- 사용 중인 AWS CLI commands: `1` (`aws sso login --profile <profile>`)
|
|
63
|
+
- 참고: 엔터프라이즈 제어(정책 게이트/롤백/거버넌스 검증)를 유지하면서 인벤토리 커버리지를 확장했습니다.
|
|
64
|
+
|
|
65
|
+
현재 사용 중인 95개 AWS SDK 작업:
|
|
66
|
+
|
|
67
|
+
- STS: `GetCallerIdentity`
|
|
68
|
+
- EC2: `DescribeRegions`, `DescribeInstances`, `DescribeVpcs`, `DescribeSubnets`, `DescribeSecurityGroups`, `StartInstances`, `StopInstances`, `RebootInstances`, `DescribeIamInstanceProfileAssociations`, `AssociateIamInstanceProfile`, `ReplaceIamInstanceProfileAssociation`
|
|
69
|
+
- SSM: `DescribeInstanceInformation`, `DescribeParameters`, `SendCommand`, `GetCommandInvocation`
|
|
70
|
+
- Lambda: `ListFunctions`
|
|
71
|
+
- ELBv2: `DescribeLoadBalancers`, `DescribeTargetGroups`
|
|
72
|
+
- Auto Scaling: `DescribeAutoScalingGroups`, `SetDesiredCapacity`
|
|
73
|
+
- RDS: `DescribeDBInstances`, `StartDBInstance`, `StopDBInstance`, `RebootDBInstance`
|
|
74
|
+
- ElastiCache: `DescribeCacheClusters`
|
|
75
|
+
- Route53: `ListHostedZones`, `ListResourceRecordSets`
|
|
76
|
+
- ECS: `ListClusters`, `DescribeClusters`, `ListServices`, `DescribeServices`, `UpdateService`
|
|
77
|
+
- S3: `ListBuckets`, `GetBucketLocation`
|
|
78
|
+
- IAM: `ListRoles`
|
|
79
|
+
- KMS: `ListKeys`, `DescribeKey`
|
|
80
|
+
- CloudWatch: `DescribeAlarms`
|
|
81
|
+
- CloudTrail: `DescribeTrails`
|
|
82
|
+
- AWS Config: `DescribeConfigurationRecorders`, `DescribeConfigurationRecorderStatus`, `DescribeDeliveryChannels`, `DescribeConfigRules`, `DescribeComplianceByConfigRule`
|
|
83
|
+
- Secrets Manager: `ListSecrets`
|
|
84
|
+
- ECR: `DescribeRepositories`
|
|
85
|
+
- DynamoDB: `ListTables`, `DescribeTable`
|
|
86
|
+
- SNS: `ListTopics`
|
|
87
|
+
- EventBridge: `ListEventBuses`
|
|
88
|
+
- SQS: `ListQueues`, `GetQueueAttributes`
|
|
89
|
+
- ACM: `ListCertificates`, `DescribeCertificate`
|
|
90
|
+
- Kinesis: `ListStreams`, `DescribeStreamSummary`
|
|
91
|
+
- MSK: `ListClustersV2`
|
|
92
|
+
- AWS Budgets: `DescribeBudgets`
|
|
93
|
+
- EBS: `DescribeVolumes`
|
|
94
|
+
- EFS: `DescribeFileSystems`
|
|
95
|
+
- EKS: `ListClusters`, `DescribeCluster`, `DescribeNodegroup`, `UpdateNodegroupConfig`
|
|
96
|
+
- API Gateway (REST): `GetRestApis`
|
|
97
|
+
- API Gateway v2: `GetApis`
|
|
98
|
+
- CloudFront: `ListDistributions`
|
|
99
|
+
- WAFv2: `ListWebACLs`
|
|
100
|
+
- Shield: `ListProtections`
|
|
101
|
+
- Step Functions: `ListStateMachines`
|
|
102
|
+
- CloudWatch Logs: `DescribeLogGroups`
|
|
103
|
+
- X-Ray: `GetGroups`
|
|
104
|
+
- Inspector2: `ListFindings`
|
|
105
|
+
- Redshift: `DescribeClusters`
|
|
106
|
+
- OpenSearch: `ListDomainNames`, `DescribeDomain`
|
|
107
|
+
- Organizations: `ListAccounts`
|
|
108
|
+
- ControlTower: `ListLandingZones`
|
|
109
|
+
- CloudFormation: `DescribeStacks`
|
|
110
|
+
- CodePipeline: `ListPipelines`, `ListPipelineExecutions`
|
|
111
|
+
- CodeBuild: `ListProjects`, `ListBuildsForProject`, `BatchGetBuilds`
|
|
112
|
+
- CodeDeploy: `ListApplications`, `ListDeploymentGroups`, `ListDeployments`, `BatchGetDeployments`
|
|
113
|
+
- AWS Backup: `ListBackupPlans`, `ListProtectedResources`
|
|
114
|
+
- SecurityHub: `GetFindings`
|
|
115
|
+
- GuardDuty: `ListDetectors`, `ListFindings`
|
|
116
|
+
- Cost Explorer: `GetCostAndUsage`, `GetAnomalies`, `GetSavingsPlansUtilization`, `GetReservationCoverage`
|
|
24
117
|
|
|
25
118
|
## 바이너리
|
|
26
119
|
|
|
27
120
|
- CLI: `mcp-aws-manager`
|
|
28
|
-
- MCP stdio server: `mcp-aws-manager-mcp`
|
|
121
|
+
- MCP stdio server (single-entry, 기본값: `--surface all`): `mcp-aws-manager-mcp`
|
|
122
|
+
|
|
123
|
+
`mcp-aws-manager-mcp`는 gateway 라우팅 기반으로 surface 범위만 선택합니다.
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
mcp-aws-manager-mcp --surface all
|
|
127
|
+
mcp-aws-manager-mcp --surface readonly
|
|
128
|
+
mcp-aws-manager-mcp --surface mutate
|
|
129
|
+
```
|
|
29
130
|
|
|
30
|
-
## 최초 설정
|
|
131
|
+
## 에이전트 보조 최초 설정
|
|
31
132
|
|
|
32
|
-
|
|
133
|
+
신규 사용자는 아래 순서를 권장합니다.
|
|
134
|
+
|
|
135
|
+
1. 설치 및 bootstrap:
|
|
33
136
|
|
|
34
137
|
```bash
|
|
35
138
|
npm.cmd install -g mcp-aws-manager@latest
|
|
36
139
|
mcp-aws-manager
|
|
37
140
|
```
|
|
38
141
|
|
|
39
|
-
|
|
142
|
+
bootstrap/setup 기본 동작은 단일 서버 1개를 등록합니다.
|
|
143
|
+
|
|
144
|
+
- `mcp-aws-manager` (single-entry, `--surface all`)
|
|
145
|
+
|
|
146
|
+
명시적 등록 예시:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
mcp-aws-manager setup
|
|
150
|
+
mcp-aws-manager setup --clients codex,claude
|
|
151
|
+
mcp-aws-manager setup --clients cursor,windsurf,antigravity
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
2. 상태 점검:
|
|
40
155
|
|
|
41
156
|
```bash
|
|
42
157
|
mcp-aws-manager doctor
|
|
43
158
|
```
|
|
44
159
|
|
|
45
|
-
3. AWS 인증 설정(권장: SSO)
|
|
160
|
+
3. AWS 인증 설정(권장: SSO):
|
|
46
161
|
|
|
47
162
|
```bash
|
|
48
163
|
aws configure sso --profile default
|
|
49
164
|
aws sso login --profile default
|
|
50
165
|
```
|
|
51
166
|
|
|
52
|
-
4. 인증
|
|
167
|
+
4. 인증 확인:
|
|
53
168
|
|
|
54
169
|
```bash
|
|
55
170
|
aws sts get-caller-identity --profile default
|
|
56
171
|
```
|
|
57
172
|
|
|
58
|
-
5. 인벤토리
|
|
173
|
+
5. 인벤토리 실행:
|
|
59
174
|
|
|
60
175
|
```bash
|
|
61
176
|
mcp-aws-manager discover --profiles default --no-progress
|
|
62
177
|
```
|
|
63
178
|
|
|
64
|
-
|
|
179
|
+
실패 시 `ACTION_REQUIRED`를 1건 처리한 뒤 동일 명령으로 재시도하세요.
|
|
180
|
+
|
|
181
|
+
AWS 인증이 불가능하면 수동 모드를 사용하세요.
|
|
65
182
|
|
|
66
183
|
```bash
|
|
67
184
|
mcp-aws-manager discover --manual-server-list ./servers.csv --pem-paths C:\keys\prod.pem --no-progress
|
|
68
185
|
```
|
|
69
186
|
|
|
70
|
-
|
|
187
|
+
GUI 리포트는 기본 생성됩니다(자동 경로: workspace/home `aws-inventory.html`).
|
|
71
188
|
|
|
72
189
|
```bash
|
|
73
190
|
mcp-aws-manager discover --profiles default --no-progress
|
|
74
191
|
```
|
|
75
192
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
-
|
|
79
|
-
-
|
|
80
|
-
-
|
|
193
|
+
GUI 포함 항목:
|
|
194
|
+
|
|
195
|
+
- 요약 카드(레코드/서비스/프로필/리전/EC2/SSM/공인 IP/이슈)
|
|
196
|
+
- 탭 뷰(`Report`, `Diagrams`, `Evidence`, `Inventory`)
|
|
197
|
+
- 리소스 유형별 섹션을 포함한 상세 markdown 리포트(`report.md`)
|
|
198
|
+
- 토폴로지 다이어그램(Profile -> Region -> Type -> Resource)
|
|
199
|
+
- 관계 다이어그램(DNS / TargetGroup-ALB / ASG 휴리스틱 링크)
|
|
200
|
+
- 리소스 상세와 집중 관계 다이어그램(`focus.svg`)을 포함한 포커스 서버/리소스 선택기
|
|
201
|
+
- 증적 보기 및 내보내기(`evidence.json`)
|
|
202
|
+
- 다이어그램 내보내기(`diagram.drawio`, `topology.svg`, `relationship.svg`)
|
|
203
|
+
- 다운로드 파일명에 생성 시각 자동 포함(예: `report-20260304-113000.md`)
|
|
204
|
+
|
|
205
|
+
경로/오픈 제어:
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
mcp-aws-manager discover --profiles default --html-out ./inventory.html --open-html --no-progress
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
기본값은 `open-html=true`입니다. 자동 오픈을 끄려면 `--no-open-html`을 사용하세요.
|
|
212
|
+
|
|
213
|
+
### 수동 MCP 클라이언트 설정(대체 경로)
|
|
214
|
+
|
|
215
|
+
자동 `bootstrap/setup`이 불가능한 환경에서만 사용하세요.
|
|
216
|
+
|
|
217
|
+
1) 로컬 저장소(개발):
|
|
218
|
+
|
|
219
|
+
```json
|
|
220
|
+
{
|
|
221
|
+
"mcpServers": {
|
|
222
|
+
"mcp-aws-manager": {
|
|
223
|
+
"command": "node",
|
|
224
|
+
"args": [
|
|
225
|
+
"<repo>/bin/mcp-aws-manager-mcp.js",
|
|
226
|
+
"--surface",
|
|
227
|
+
"all"
|
|
228
|
+
],
|
|
229
|
+
"cwd": "<repo>"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
2) 전역 npm 설치:
|
|
236
|
+
|
|
237
|
+
```json
|
|
238
|
+
{
|
|
239
|
+
"mcpServers": {
|
|
240
|
+
"mcp-aws-manager": {
|
|
241
|
+
"command": "mcp-aws-manager-mcp",
|
|
242
|
+
"args": ["--surface", "all"]
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
3) `npx`(전역 설치 없이):
|
|
249
|
+
|
|
250
|
+
```json
|
|
251
|
+
{
|
|
252
|
+
"mcpServers": {
|
|
253
|
+
"mcp-aws-manager": {
|
|
254
|
+
"command": "npx",
|
|
255
|
+
"args": ["-y", "-p", "mcp-aws-manager", "mcp-aws-manager-mcp", "--surface", "all"]
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## 사용자 확인이 필요한 단계
|
|
262
|
+
|
|
263
|
+
대부분 아래 항목만 수동으로 처리하면 됩니다.
|
|
264
|
+
|
|
265
|
+
- SSO 브라우저 로그인 및 MFA 확인
|
|
266
|
+
- 조직 계정의 IAM 권한 승인
|
|
267
|
+
- EC2 런타임 가시성을 위해 `AmazonSSMManagedInstanceCore` 부여 및 SSM Agent/네트워크 정상화
|
|
268
|
+
|
|
269
|
+
에이전트 재시도 루프(권장):
|
|
270
|
+
|
|
271
|
+
1. 먼저 도구를 실행합니다.
|
|
272
|
+
2. `requiresUserAction=false`이면 결과를 요약하고 종료합니다.
|
|
273
|
+
3. `requiresUserAction=true`이면 `requiredActions[]`에서 한 건만 안내합니다.
|
|
274
|
+
4. 사용자가 완료를 알리면 `guidance.retryTool` + `guidance.retryArgs`로 즉시 재실행합니다.
|
|
275
|
+
5. `requiresUserAction=false`가 될 때까지 반복합니다.
|
|
276
|
+
|
|
277
|
+
## MCP 도구 사용
|
|
278
|
+
|
|
279
|
+
단일 엔트리 MCP 서버 실행(기본: `--surface all`):
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
mcp-aws-manager-mcp
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
노출 프로필 선택:
|
|
286
|
+
|
|
287
|
+
- `mcp-aws-manager-mcp --surface all|readonly|mutate` (gateway-only)
|
|
288
|
+
|
|
289
|
+
Gateway 모델은 `tools/list`에 정확히 3개만 노출합니다.
|
|
290
|
+
|
|
291
|
+
- `capabilities_summary`
|
|
292
|
+
- `capabilities_detail`
|
|
293
|
+
- `gateway_execute`
|
|
294
|
+
|
|
295
|
+
Gateway 호출 흐름:
|
|
296
|
+
|
|
297
|
+
1. `capabilities_summary`로 카테고리/`operationId` 목록을 조회합니다.
|
|
298
|
+
2. `capabilities_detail`로 선택한 `operationId`의 실행 계약을 확인합니다.
|
|
299
|
+
3. `gateway_execute`로 `{ "operationId": "...", "args": { ... } }`를 실행합니다.
|
|
300
|
+
|
|
301
|
+
대표 `operationId` 계열:
|
|
302
|
+
|
|
303
|
+
- 조회 계열: `discover.aws_inventory_basic`, `discover.aws_inventory_advanced`, `discover.aws_inventory_summary`, `discover.aws_inventory_detail`, `discover.list_bedrock_endpoints`, `discover.list_sagemaker_endpoints`
|
|
304
|
+
- 변경 계열: `mutate.ec2_start_instances`, `mutate.ec2_stop_instances`, `mutate.ec2_reboot_instances`, `mutate.ec2_apply_instance_profile`, `mutate.ec2_rollback_last_change`, `mutate.ecs_update_service_desired_count`, `mutate.asg_set_desired_capacity`, `mutate.rds_start_instances`, `mutate.rds_stop_instances`, `mutate.rds_reboot_instances`, `mutate.eks_update_nodegroup_scaling`
|
|
305
|
+
- 거버넌스/시스템 계열: `governance.verify_chain`, `system.get_server_runtime`, `system.cli_help`
|
|
306
|
+
|
|
307
|
+
Gateway execute 예시:
|
|
308
|
+
|
|
309
|
+
- Discovery summary: `{ "operationId": "discover.aws_inventory_summary", "args": { "profiles": ["default"], "regions": ["ap-southeast-1"] } }`
|
|
310
|
+
- Discovery detail: `{ "operationId": "discover.aws_inventory_detail", "args": { "profiles": ["default"], "regions": ["ap-southeast-1"], "resourceTypes": ["ec2"], "limit": 50 } }`
|
|
311
|
+
- AI/ML 조회: `{ "operationId": "discover.list_bedrock_endpoints", "args": { "profile": "default", "region": "us-east-1", "metricWindowMinutes": 60 } }`
|
|
312
|
+
- Mutation: `{ "operationId": "mutate.ec2_start_instances", "args": { "profile": "default", "region": "ap-southeast-1", "instanceIds": ["i-123"], "userConfirmation": "yes" } }`
|
|
313
|
+
|
|
314
|
+
Discover 연산 참고:
|
|
315
|
+
|
|
316
|
+
- `discover.aws_inventory_basic`: compact 입력 스키마
|
|
317
|
+
- `discover.aws_inventory_advanced`: full 입력 스키마
|
|
318
|
+
- `discover.aws_inventory_summary`: summary-first + selector hint
|
|
319
|
+
- `discover.aws_inventory_detail`: 선택자 기반 상세/페이지 조회 (`resourceTypes`, `resourceIds`, `offset`, `limit`)
|
|
320
|
+
- 출력 레이아웃 옵션: `outputProfile`, `sections`, `includeFields`, `excludeFields`, `rendererTemplate`
|
|
321
|
+
- 라우팅/제어 옵션: `mode`, `schemaTier`, `userConfirmation`, `profileShard`, `regionShard`, `orgRoleName`, `orgAccountIds`, `orgIncludeAllAccounts`, `orgMaxAccounts`, `enterprisePolicyPath`, `approvalTicket`, `changeReason`
|
|
322
|
+
- 증적/산출물 옵션: `topologyOutPath`, `relationshipsOutPath`, `governanceLogPath`, `verifyGovernanceChain`, `incidentWebhookUrl`, `incidentWebhookTimeoutMs`, `incidentWebhookAuthHeader`, `incidentWebhookToken`, `incidentOutPath`
|
|
323
|
+
- `workingDirectory`는 allowlist(`cwd`, home, `MCP_AWS_ALLOWED_WORKDIRS`)로 검증됩니다.
|
|
324
|
+
- stderr로 구조화 JSON 로그를 출력하며, `LOG_LEVEL=error|warn|info|debug`(기본 `info`)로 상세도를 제어할 수 있습니다.
|
|
325
|
+
|
|
326
|
+
런타임 introspection:
|
|
327
|
+
|
|
328
|
+
- gateway 모델: `gateway_execute` + `operationId: "system.get_server_runtime"`
|
|
329
|
+
- 응답에는 현재 surface, 노출 연산/도구, confirmation 정책, response contract 메타가 포함됩니다.
|
|
330
|
+
|
|
331
|
+
예시 tool args:
|
|
332
|
+
|
|
333
|
+
```json
|
|
334
|
+
{
|
|
335
|
+
"profiles": ["default"],
|
|
336
|
+
"regions": ["ap-northeast-2"],
|
|
337
|
+
"profileShard": { "index": 1, "total": 2 },
|
|
338
|
+
"regionShard": { "index": 1, "total": 3 },
|
|
339
|
+
"orgRoleName": "OrganizationAccountAccessRole",
|
|
340
|
+
"orgIncludeAllAccounts": false,
|
|
341
|
+
"orgAccountIds": ["111111111111", "222222222222"],
|
|
342
|
+
"orgMaxAccounts": 25,
|
|
343
|
+
"includeLambda": true,
|
|
344
|
+
"includeIac": true,
|
|
345
|
+
"includeCicd": true,
|
|
346
|
+
"includeBackupDr": true,
|
|
347
|
+
"includeSecurity": true,
|
|
348
|
+
"includeFinops": true,
|
|
349
|
+
"includeApplication": true,
|
|
350
|
+
"includeIncident": true,
|
|
351
|
+
"mode": "observe",
|
|
352
|
+
"schemaTier": "advanced",
|
|
353
|
+
"publicOnly": true,
|
|
354
|
+
"runtimeSnapshot": true,
|
|
355
|
+
"outputProfile": "operator",
|
|
356
|
+
"sections": ["overview", "runtime", "application", "actions"],
|
|
357
|
+
"includeFields": ["resourceType", "resourceId", "state", "ssmOnline", "runtimeSnapshotStatus"],
|
|
358
|
+
"excludeFields": ["runtimeSnapshotOutput"],
|
|
359
|
+
"clientProfile": "codex",
|
|
360
|
+
"rendererTemplate": "compact",
|
|
361
|
+
"userConfirmation": "yes",
|
|
362
|
+
"topologyOutPath": "C:\\tmp\\topology.json",
|
|
363
|
+
"relationshipsOutPath": "C:\\tmp\\relationships.json",
|
|
364
|
+
"governanceLogPath": "C:\\tmp\\governance.jsonl",
|
|
365
|
+
"incidentWebhookUrl": "https://example.com/hooks/oncall",
|
|
366
|
+
"incidentWebhookAuthHeader": "Authorization",
|
|
367
|
+
"incidentWebhookToken": "Bearer ***",
|
|
368
|
+
"incidentOutPath": "C:\\tmp\\incident.json",
|
|
369
|
+
"htmlOutPath": "C:\\tmp\\inventory.html",
|
|
370
|
+
"openHtml": true,
|
|
371
|
+
"manualServerListPath": "C:\\tmp\\servers.csv",
|
|
372
|
+
"pemPaths": ["C:\\keys\\prod.pem"],
|
|
373
|
+
"sshUser": "ec2-user",
|
|
374
|
+
"sshPort": 22,
|
|
375
|
+
"sshConnectTimeoutSec": 8,
|
|
376
|
+
"autoSsoLogin": true,
|
|
377
|
+
"noProgress": true
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
## Action Codes
|
|
382
|
+
|
|
383
|
+
자주 등장하는 `ACTION_REQUIRED` 코드:
|
|
384
|
+
|
|
385
|
+
- `SSO_LOGIN_NEEDED`
|
|
386
|
+
- `AWS_CREDENTIALS_REQUIRED`
|
|
387
|
+
- `IAM_PERMISSION_REQUIRED`
|
|
388
|
+
- `AWS_OPERATION_FAILED`
|
|
389
|
+
- `SSM_ROLE_OR_AGENT_REQUIRED`
|
|
390
|
+
- `INSTANCE_HAS_PROFILE`
|
|
391
|
+
- `IAM_PROFILE_ASSOCIATION_FAILED`
|
|
392
|
+
- `CHANGE_CONFIRMATION_REQUIRED`
|
|
393
|
+
- `CHANGE_NOT_CONFIRMED`
|
|
394
|
+
- `APPROVAL_TICKET_REQUIRED`
|
|
395
|
+
- `APPROVAL_TICKET_INVALID`
|
|
396
|
+
- `CHANGE_REASON_REQUIRED`
|
|
397
|
+
- `ENTERPRISE_POLICY_NOT_FOUND`
|
|
398
|
+
- `ENTERPRISE_POLICY_INVALID`
|
|
399
|
+
- `ENTERPRISE_POLICY_BLOCKED_ACTION`
|
|
400
|
+
- `ENTERPRISE_POLICY_DISCOVER_REMEDIATION_BLOCKED`
|
|
401
|
+
- `ENTERPRISE_POLICY_BLOCKED_PROFILE`
|
|
402
|
+
- `ENTERPRISE_POLICY_BLOCKED_REGION`
|
|
403
|
+
- `ENTERPRISE_POLICY_BATCH_TOO_LARGE`
|
|
404
|
+
- `INCIDENT_WEBHOOK_DISPATCH_FAILED`
|
|
405
|
+
- `GOVERNANCE_LOG_WRITE_FAILED`
|
|
406
|
+
- `GOVERNANCE_CHAIN_BROKEN`
|
|
407
|
+
- `GOVERNANCE_LOG_NOT_FOUND`
|
|
408
|
+
- `GOVERNANCE_LOG_INVALID_JSON`
|
|
409
|
+
- `GOVERNANCE_CHAIN_HASH_MISMATCH`
|
|
410
|
+
- `GOVERNANCE_CHAIN_PREV_HASH_MISMATCH`
|
|
411
|
+
- `IAC_CLOUDFORMATION_PERMISSION_REQUIRED`
|
|
412
|
+
- `CICD_CODEPIPELINE_PERMISSION_REQUIRED`
|
|
413
|
+
- `CICD_CODEBUILD_PERMISSION_REQUIRED`
|
|
414
|
+
- `CICD_CODEDEPLOY_PERMISSION_REQUIRED`
|
|
415
|
+
- `BACKUP_PERMISSION_REQUIRED`
|
|
416
|
+
- `BACKUP_COVERAGE_REVIEW_REQUIRED`
|
|
417
|
+
- `SECURITY_POSTURE_PERMISSION_REQUIRED`
|
|
418
|
+
- `SECURITY_CONFIG_PERMISSION_REQUIRED`
|
|
419
|
+
- `SECURITY_INSPECTOR2_PERMISSION_REQUIRED`
|
|
420
|
+
- `SECURITY_ACM_PERMISSION_REQUIRED`
|
|
421
|
+
- `SECURITY_ACM_CERT_EXPIRING`
|
|
422
|
+
- `FINOPS_COST_EXPLORER_PERMISSION_REQUIRED`
|
|
423
|
+
- `INCIDENT_ESCALATION_RECOMMENDED`
|
|
424
|
+
- `WORKING_DIRECTORY_INVALID`
|
|
425
|
+
- `WORKING_DIRECTORY_NOT_FOUND`
|
|
426
|
+
- `WORKING_DIRECTORY_NOT_DIRECTORY`
|
|
427
|
+
- `WORKING_DIRECTORY_NOT_ALLOWED`
|
|
428
|
+
- `SSM_RUNCOMMAND_PERMISSION_REQUIRED`
|
|
429
|
+
- `LAMBDA_LIST_PERMISSION_REQUIRED`
|
|
430
|
+
- `ELBV2_LIST_PERMISSION_REQUIRED`
|
|
431
|
+
- `ASG_LIST_PERMISSION_REQUIRED`
|
|
432
|
+
- `RDS_LIST_PERMISSION_REQUIRED`
|
|
433
|
+
- `ELASTICACHE_LIST_PERMISSION_REQUIRED`
|
|
434
|
+
- `ROUTE53_LIST_PERMISSION_REQUIRED`
|
|
435
|
+
- `VPC_LIST_PERMISSION_REQUIRED`
|
|
436
|
+
- `ECS_LIST_PERMISSION_REQUIRED`
|
|
437
|
+
- `S3_LIST_PERMISSION_REQUIRED`
|
|
438
|
+
- `IAM_LIST_PERMISSION_REQUIRED`
|
|
439
|
+
- `KMS_LIST_PERMISSION_REQUIRED`
|
|
440
|
+
- `SNS_LIST_PERMISSION_REQUIRED`
|
|
441
|
+
- `EVENTBRIDGE_LIST_PERMISSION_REQUIRED`
|
|
442
|
+
- `SQS_LIST_PERMISSION_REQUIRED`
|
|
443
|
+
- `ACM_LIST_PERMISSION_REQUIRED`
|
|
444
|
+
- `KINESIS_LIST_PERMISSION_REQUIRED`
|
|
445
|
+
- `MSK_LIST_PERMISSION_REQUIRED`
|
|
446
|
+
- `CLOUDWATCH_LIST_PERMISSION_REQUIRED`
|
|
447
|
+
- `EBS_LIST_PERMISSION_REQUIRED`
|
|
448
|
+
- `EFS_LIST_PERMISSION_REQUIRED`
|
|
449
|
+
- `EKS_LIST_PERMISSION_REQUIRED`
|
|
450
|
+
- `APIGATEWAY_LIST_PERMISSION_REQUIRED`
|
|
451
|
+
- `APIGATEWAYV2_LIST_PERMISSION_REQUIRED`
|
|
452
|
+
- `CLOUDFRONT_LIST_PERMISSION_REQUIRED`
|
|
453
|
+
- `WAF_LIST_PERMISSION_REQUIRED`
|
|
454
|
+
- `SHIELD_LIST_PERMISSION_REQUIRED`
|
|
455
|
+
- `STEPFUNCTIONS_LIST_PERMISSION_REQUIRED`
|
|
456
|
+
- `CLOUDWATCH_LOGS_LIST_PERMISSION_REQUIRED`
|
|
457
|
+
- `XRAY_LIST_PERMISSION_REQUIRED`
|
|
458
|
+
- `INSPECTOR2_LIST_PERMISSION_REQUIRED`
|
|
459
|
+
- `REDSHIFT_LIST_PERMISSION_REQUIRED`
|
|
460
|
+
- `OPENSEARCH_LIST_PERMISSION_REQUIRED`
|
|
461
|
+
- `ORGANIZATIONS_LIST_PERMISSION_REQUIRED`
|
|
462
|
+
- `CONTROLTOWER_LIST_PERMISSION_REQUIRED`
|
|
463
|
+
- `MANUAL_SERVER_LIST_EMPTY`
|
|
464
|
+
- `MANUAL_SERVER_HOST_REQUIRED`
|
|
465
|
+
- `WEB_IDENTITY_CONFIG_REQUIRED`
|
|
466
|
+
- `WEB_IDENTITY_TOKEN_FILE_NOT_FOUND`
|
|
467
|
+
- `PEM_KEY_NOT_FOUND`
|
|
468
|
+
- `BASTION_PEM_KEY_NOT_FOUND`
|
|
469
|
+
- `PEM_MAPPING_REQUIRED`
|
|
470
|
+
- `SSH_CLIENT_NOT_FOUND`
|
|
471
|
+
- `SSH_AUTH_OR_CONNECT_FAILED`
|
|
472
|
+
|
|
473
|
+
`ACTION_REQUIRED` 메타 필드:
|
|
474
|
+
|
|
475
|
+
- `severity`
|
|
476
|
+
- `owner`
|
|
477
|
+
- `autoFixable`
|
|
478
|
+
|
|
479
|
+
## 응답 계약(Response Contract)
|
|
480
|
+
|
|
481
|
+
- 모든 도구 응답에 runtime contract 필드 포함:
|
|
482
|
+
- `meta.schemaVersion`
|
|
483
|
+
- `meta.compatibility`
|
|
484
|
+
- `meta.responseType`
|
|
485
|
+
- View envelope( CLI JSON / MCP parsed payload ):
|
|
486
|
+
- `outputProfile`
|
|
487
|
+
- `sections`
|
|
488
|
+
- `fields`
|
|
489
|
+
- `view.records`
|
|
490
|
+
- `rawNormalized` (재처리 안정성을 위해 항상 포함)
|
|
491
|
+
- `schema` / `schemaVersion`
|
|
492
|
+
- 계약 스키마: `schemas/mcp-tool-response.schema.json`
|
|
493
|
+
- 호환성 정책: `RESPONSE_COMPATIBILITY_POLICY.md`
|
|
494
|
+
|
|
495
|
+
<details>
|
|
496
|
+
<summary>상세 AWS 인증 설정 (SSO vs Access Key)</summary>
|
|
497
|
+
|
|
498
|
+
권장 방식:
|
|
499
|
+
|
|
500
|
+
- 운영자(사람) 계정은 `SSO (IAM Identity Center)` 권장
|
|
501
|
+
- `Access Key`는 SSO를 쓸 수 없는 예외 상황의 로컬 대체 수단
|
|
502
|
+
- CI/CD 자동화는 장기 키보다 IAM Role/OIDC 권장
|
|
503
|
+
|
|
504
|
+
SSO 권장 이유:
|
|
505
|
+
|
|
506
|
+
- 장기 키를 로컬에 보관하지 않아 보안 리스크 감소
|
|
507
|
+
- MFA/세션 만료 동작을 표준화하기 쉬움
|
|
508
|
+
- 중앙 권한 회수(revoke) 및 감사(audit)에 유리
|
|
509
|
+
|
|
510
|
+
사전 조건:
|
|
511
|
+
|
|
512
|
+
- AWS CLI v2
|
|
513
|
+
- 조직 계정에 IAM Identity Center 구성 완료
|
|
514
|
+
- 대상 계정/Permission Set 할당 완료
|
|
515
|
+
|
|
516
|
+
SSO 설정:
|
|
517
|
+
|
|
518
|
+
```bash
|
|
519
|
+
aws configure sso --profile default
|
|
520
|
+
aws sso login --profile default
|
|
521
|
+
aws sts get-caller-identity --profile default
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
Access key 설정(대체 경로):
|
|
525
|
+
|
|
526
|
+
```bash
|
|
527
|
+
aws configure --profile default
|
|
528
|
+
aws sts get-caller-identity --profile default
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
OIDC/WebIdentity 설정(CI/CD 또는 Kubernetes):
|
|
532
|
+
|
|
533
|
+
```bash
|
|
534
|
+
export AWS_ROLE_ARN=arn:aws:iam::123456789012:role/oidc-workload-role
|
|
535
|
+
export AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
|
|
536
|
+
aws sts get-caller-identity
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
CLI 옵션으로 동일하게 지정:
|
|
540
|
+
|
|
541
|
+
```bash
|
|
542
|
+
mcp-aws-manager discover \
|
|
543
|
+
--auth-mode web-identity \
|
|
544
|
+
--web-identity-role-arn arn:aws:iam::123456789012:role/oidc-workload-role \
|
|
545
|
+
--web-identity-token-file /var/run/secrets/eks.amazonaws.com/serviceaccount/token
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
빠른 점검:
|
|
549
|
+
|
|
550
|
+
```bash
|
|
551
|
+
aws configure list-profiles
|
|
552
|
+
aws configure list --profile default
|
|
553
|
+
aws ec2 describe-regions --profile default
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
자주 나는 오류:
|
|
81
557
|
|
|
82
|
-
|
|
558
|
+
- `Missing the following required SSO configuration values`
|
|
559
|
+
`aws configure sso --profile default`를 다시 실행해 필수 항목을 모두 입력하세요.
|
|
560
|
+
- `Unable to locate credentials`
|
|
561
|
+
SSO 세션 만료 또는 인증정보 누락 상태입니다. `aws sso login --profile default`를 실행하거나 Access Key를 재설정하세요.
|
|
562
|
+
- `AccessDenied` / `not authorized`
|
|
563
|
+
인증은 성공했지만 해당 API를 호출할 IAM 권한(Permission Set/Policy)이 부족합니다.
|
|
564
|
+
|
|
565
|
+
</details>
|
|
566
|
+
|
|
567
|
+
<details>
|
|
568
|
+
<summary>AWS 접근 경로 설정 (Profile / SSO / OIDC WebIdentity)</summary>
|
|
569
|
+
|
|
570
|
+
인증 모드:
|
|
571
|
+
|
|
572
|
+
- `auto` (기본): 기본적으로 profile을 사용하되, WebIdentity(role+token)가 주어지면 해당 경로를 사용할 수 있습니다.
|
|
573
|
+
- `profile`: AWS profile 자격증명(`fromIni`)을 고정 사용합니다.
|
|
574
|
+
- `web-identity`: OIDC/WebIdentity 토큰 경로(`fromTokenFile`)를 고정 사용합니다.
|
|
575
|
+
|
|
576
|
+
권장 선택:
|
|
577
|
+
|
|
578
|
+
- 운영자 PC: `profile` + SSO 로그인
|
|
579
|
+
- CI/CD 또는 Kubernetes 워크로드 아이덴티티: `web-identity`
|
|
580
|
+
- 혼합 환경: `auto` 유지 + 필요 시 명시 옵션 전달
|
|
581
|
+
|
|
582
|
+
Profile/SSO 경로:
|
|
583
|
+
|
|
584
|
+
```bash
|
|
585
|
+
aws configure sso --profile prod-admin
|
|
586
|
+
aws sso login --profile prod-admin
|
|
587
|
+
mcp-aws-manager discover --profiles prod-admin --regions us-east-1 --auth-mode profile
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
WebIdentity 경로:
|
|
591
|
+
|
|
592
|
+
```bash
|
|
593
|
+
export AWS_ROLE_ARN=arn:aws:iam::123456789012:role/oidc-workload-role
|
|
594
|
+
export AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
|
|
595
|
+
mcp-aws-manager discover --auth-mode web-identity --regions us-east-1
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
Gateway/mutation 및 AI-read 입력 필드:
|
|
599
|
+
|
|
600
|
+
- `authMode`
|
|
601
|
+
- `webIdentityRoleArn`
|
|
602
|
+
- `webIdentityTokenFile`
|
|
603
|
+
- `webIdentitySessionName` (선택)
|
|
604
|
+
|
|
605
|
+
입력 우선순위:
|
|
606
|
+
|
|
607
|
+
- 명시적 tool 입력/CLI 옵션
|
|
608
|
+
- `MCP_AWS_WEB_IDENTITY_*`
|
|
609
|
+
- `AWS_ROLE_ARN` / `AWS_WEB_IDENTITY_TOKEN_FILE`
|
|
610
|
+
|
|
611
|
+
인증 관련 주요 ACTION_REQUIRED:
|
|
612
|
+
|
|
613
|
+
- `WEB_IDENTITY_CONFIG_REQUIRED`
|
|
614
|
+
- `WEB_IDENTITY_TOKEN_FILE_NOT_FOUND`
|
|
615
|
+
- `AWS_CREDENTIALS_REQUIRED`
|
|
616
|
+
|
|
617
|
+
</details>
|
|
618
|
+
|
|
619
|
+
<details>
|
|
620
|
+
<summary>서버 내부 접근 경로 설정 (SSM / PEM SSH / ProxyJump / Bastion)</summary>
|
|
621
|
+
|
|
622
|
+
런타임 스냅샷 경로 선택:
|
|
623
|
+
|
|
624
|
+
- AWS 관리 EC2(`manualInput=false`): SSM RunCommand 경로 사용
|
|
625
|
+
- 수동 서버 목록(`manualInput=true`): SSH 경로 사용
|
|
626
|
+
- SSH 경로는 다음 중 하나:
|
|
627
|
+
- `ssh-pem` (직접 키 접속)
|
|
628
|
+
- `ssh-proxyjump` (`--ssh-proxy-jump`)
|
|
629
|
+
- `ssh-bastion` (`--ssh-bastion-*`, 내부적으로 ProxyCommand 사용)
|
|
630
|
+
|
|
631
|
+
수동 목록 + 직접 PEM 예시:
|
|
632
|
+
|
|
633
|
+
```bash
|
|
634
|
+
mcp-aws-manager discover \
|
|
635
|
+
--manual-server-list ./servers.json \
|
|
636
|
+
--pem-paths ~/.ssh/target.pem \
|
|
637
|
+
--runtime-snapshot
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
수동 목록 + ProxyJump 예시:
|
|
641
|
+
|
|
642
|
+
```bash
|
|
643
|
+
mcp-aws-manager discover \
|
|
644
|
+
--manual-server-list ./servers.json \
|
|
645
|
+
--pem-paths ~/.ssh/target.pem \
|
|
646
|
+
--ssh-proxy-jump ec2-user@bastion.example.com \
|
|
647
|
+
--runtime-snapshot
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
수동 목록 + Bastion 키 분리 예시:
|
|
651
|
+
|
|
652
|
+
```bash
|
|
653
|
+
mcp-aws-manager discover \
|
|
654
|
+
--manual-server-list ./servers.json \
|
|
655
|
+
--pem-paths ~/.ssh/target.pem \
|
|
656
|
+
--ssh-bastion-host bastion.example.com \
|
|
657
|
+
--ssh-bastion-user ec2-user \
|
|
658
|
+
--ssh-bastion-port 22 \
|
|
659
|
+
--ssh-bastion-pem-path ~/.ssh/bastion.pem \
|
|
660
|
+
--runtime-snapshot
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
수동 서버 JSON 필드(호스트별 선택):
|
|
664
|
+
|
|
665
|
+
- `host`/`publicIp`/`privateIp`/`publicDns`
|
|
666
|
+
- `sshUser`, `sshPort`, `pemPath`
|
|
667
|
+
- `proxyJump` 또는 `sshProxyJump`
|
|
668
|
+
- `bastionHost`, `bastionUser`, `bastionPort`, `bastionPemPath`
|
|
669
|
+
|
|
670
|
+
접근 경로 관련 주요 ACTION_REQUIRED:
|
|
671
|
+
|
|
672
|
+
- `MANUAL_SERVER_HOST_REQUIRED`
|
|
673
|
+
- `PEM_MAPPING_REQUIRED`
|
|
674
|
+
- `BASTION_PEM_KEY_NOT_FOUND`
|
|
675
|
+
- `SSH_AUTH_OR_CONNECT_FAILED`
|
|
676
|
+
|
|
677
|
+
</details>
|
|
678
|
+
|
|
679
|
+
<details>
|
|
680
|
+
<summary>Integration Connector 관리 (No-Code)</summary>
|
|
681
|
+
|
|
682
|
+
기본 상태 파일:
|
|
683
|
+
|
|
684
|
+
- `~/.mcp-aws-manager/integrations.json`
|
|
83
685
|
|
|
84
686
|
조회:
|
|
85
687
|
|
|
86
|
-
|
|
87
|
-
-
|
|
688
|
+
```bash
|
|
689
|
+
mcp-aws-manager integration list
|
|
690
|
+
mcp-aws-manager integration show
|
|
691
|
+
```
|
|
692
|
+
|
|
693
|
+
설정 + 활성화:
|
|
694
|
+
|
|
695
|
+
```bash
|
|
696
|
+
mcp-aws-manager integration configure pagerduty --set routingKey=XXXX --enable
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
정책 팩:
|
|
700
|
+
|
|
701
|
+
```bash
|
|
702
|
+
mcp-aws-manager integration policy show
|
|
703
|
+
mcp-aws-manager integration policy set strict_change
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
진단:
|
|
707
|
+
|
|
708
|
+
```bash
|
|
709
|
+
mcp-aws-manager integration doctor
|
|
710
|
+
mcp-aws-manager integration doctor --check-live --timeout-ms 8000
|
|
711
|
+
```
|
|
88
712
|
|
|
89
|
-
|
|
713
|
+
discover 시 오버라이드:
|
|
714
|
+
|
|
715
|
+
- `--integration-config <path>`
|
|
716
|
+
- `--integration-timeout-ms <n>`
|
|
717
|
+
- `--policy-pack <balanced|strict_change|readonly_only>`
|
|
718
|
+
- `--policy-override`
|
|
719
|
+
|
|
720
|
+
</details>
|
|
721
|
+
|
|
722
|
+
<details>
|
|
723
|
+
<summary>Discover 옵션 레퍼런스</summary>
|
|
724
|
+
|
|
725
|
+
- `--profiles <a,b,c>`
|
|
726
|
+
- `--regions <a,b,c>`
|
|
727
|
+
- `--profile-shard <index/total>`
|
|
728
|
+
- `--region-shard <index/total>`
|
|
729
|
+
- `--org-role-name <role-name>`
|
|
730
|
+
- `--org-account-ids <a,b,c>`
|
|
731
|
+
- `--org-include-all-accounts`
|
|
732
|
+
- `--org-max-accounts <n>`
|
|
733
|
+
- `--instance-ids <id1,id2>`
|
|
734
|
+
- `--include-lambda`
|
|
735
|
+
- `--include-ec2` / `--no-ec2`
|
|
736
|
+
- `--include-alb` / `--no-include-alb`
|
|
737
|
+
- `--include-asg` / `--no-include-asg`
|
|
738
|
+
- `--include-rds` / `--no-include-rds`
|
|
739
|
+
- `--include-elasticache` / `--no-include-elasticache`
|
|
740
|
+
- `--include-route53` / `--no-include-route53`
|
|
741
|
+
- `--include-vpc` / `--no-include-vpc`
|
|
742
|
+
- `--include-ecs` / `--no-include-ecs`
|
|
743
|
+
- `--include-s3` / `--no-include-s3`
|
|
744
|
+
- `--include-iam` / `--no-include-iam`
|
|
745
|
+
- `--include-kms` / `--no-include-kms`
|
|
746
|
+
- `--include-cloudwatch` / `--no-include-cloudwatch`
|
|
747
|
+
- `--include-cloudtrail` / `--no-include-cloudtrail`
|
|
748
|
+
- `--include-config` / `--no-include-config`
|
|
749
|
+
- `--include-secrets` / `--no-include-secrets`
|
|
750
|
+
- `--include-parameter-store` / `--no-include-parameter-store`
|
|
751
|
+
- `--include-ecr` / `--no-include-ecr`
|
|
752
|
+
- `--include-dynamodb` / `--no-include-dynamodb`
|
|
753
|
+
- `--include-sns` / `--no-include-sns`
|
|
754
|
+
- `--include-eventbridge` / `--no-include-eventbridge`
|
|
755
|
+
- `--include-sqs` / `--no-include-sqs`
|
|
756
|
+
- `--include-acm` / `--no-include-acm`
|
|
757
|
+
- `--include-kinesis` / `--no-include-kinesis`
|
|
758
|
+
- `--include-msk` / `--no-include-msk`
|
|
759
|
+
- `--include-budgets` / `--no-include-budgets`
|
|
760
|
+
- `--include-cost-anomaly` / `--no-include-cost-anomaly`
|
|
761
|
+
- `--include-ebs` / `--no-include-ebs`
|
|
762
|
+
- `--include-efs` / `--no-include-efs`
|
|
763
|
+
- `--include-eks` / `--no-include-eks`
|
|
764
|
+
- `--include-apigateway` / `--no-include-apigateway`
|
|
765
|
+
- `--include-apigatewayv2` / `--no-include-apigatewayv2`
|
|
766
|
+
- `--include-cloudfront` / `--no-include-cloudfront`
|
|
767
|
+
- `--include-waf` / `--no-include-waf`
|
|
768
|
+
- `--include-shield` / `--no-include-shield`
|
|
769
|
+
- `--include-step-functions` / `--no-include-step-functions`
|
|
770
|
+
- `--include-cloudwatch-logs` / `--no-include-cloudwatch-logs`
|
|
771
|
+
- `--include-xray` / `--no-include-xray`
|
|
772
|
+
- `--include-inspector2` / `--no-include-inspector2`
|
|
773
|
+
- `--include-redshift` / `--no-include-redshift`
|
|
774
|
+
- `--include-opensearch` / `--no-include-opensearch`
|
|
775
|
+
- `--include-organizations` / `--no-include-organizations`
|
|
776
|
+
- `--include-controltower` / `--no-include-controltower`
|
|
777
|
+
- `--include-iac` / `--no-include-iac`
|
|
778
|
+
- `--include-cicd` / `--no-include-cicd`
|
|
779
|
+
- `--include-backup-dr` / `--no-include-backup-dr`
|
|
780
|
+
- `--include-security` / `--no-include-security`
|
|
781
|
+
- `--include-finops` / `--no-include-finops`
|
|
782
|
+
- `--include-application` / `--no-include-application`
|
|
783
|
+
- `--include-incident` / `--no-include-incident`
|
|
784
|
+
- `--incident-force-escalate`
|
|
785
|
+
- `--mode <auto|observe|change|incident>`
|
|
786
|
+
- `--schema-tier <auto|basic|advanced>`
|
|
787
|
+
- `--auth-mode <auto|profile|web-identity>`
|
|
788
|
+
- `--web-identity-role-arn <arn>`
|
|
789
|
+
- `--web-identity-token-file <path>`
|
|
790
|
+
- `--web-identity-session-name <name>`
|
|
791
|
+
- `--user-confirmation <yes|no>`
|
|
792
|
+
- `--enterprise-policy <path>`
|
|
793
|
+
- `--approval-ticket <id>`
|
|
794
|
+
- `--change-reason <text>`
|
|
795
|
+
- `--policy-pack <balanced|strict_change|readonly_only>`
|
|
796
|
+
- `--policy-override`
|
|
797
|
+
- `--integration-config <path>`
|
|
798
|
+
- `--integration-timeout-ms <n>`
|
|
799
|
+
- `--public-only`
|
|
800
|
+
- `--managed-only`
|
|
801
|
+
- `--auto-remediate-ssm`
|
|
802
|
+
- `--ssm-instance-profile-name <name>` / `--ssm-instance-profile-arn <arn>`
|
|
803
|
+
- `--allow-replace-profile`
|
|
804
|
+
- `--runtime-snapshot` / `--no-runtime-snapshot`
|
|
805
|
+
- `--snapshot-profile <quick|standard|deep>`
|
|
806
|
+
- `--output-profile <operator|audit|exec|finops|incident|compact|auditable>`
|
|
807
|
+
- `--sections <overview,inventory,runtime,application,iac,cicd,backupDr,security,finops,incident,actions,governance>`
|
|
808
|
+
- `--include-fields <a,b,c>`
|
|
809
|
+
- `--exclude-fields <a,b,c>`
|
|
810
|
+
- `--client-profile <codex|claude|cursor|operator>`
|
|
811
|
+
- `--renderer-template <default|compact>`
|
|
812
|
+
- `--snapshot-timeout <seconds>`
|
|
813
|
+
- `--snapshot-concurrency <n>`
|
|
814
|
+
- `--snapshot-max-kb <n>`
|
|
815
|
+
- `--manual-server-list <path>` (JSON/CSV)
|
|
816
|
+
- `--pem-paths <a,b,c>`
|
|
817
|
+
- `--ssh-user <name>`
|
|
818
|
+
- `--ssh-port <port>`
|
|
819
|
+
- `--ssh-connect-timeout <seconds>`
|
|
820
|
+
- `--ssh-proxy-jump <user@host[:port][,hop2...]>`
|
|
821
|
+
- `--ssh-bastion-host <host>`
|
|
822
|
+
- `--ssh-bastion-user <user>`
|
|
823
|
+
- `--ssh-bastion-port <port>`
|
|
824
|
+
- `--ssh-bastion-pem-path <path>`
|
|
825
|
+
- `--html-out <path>` (기본: 자동 경로, workspace/home `aws-inventory.html`)
|
|
826
|
+
- `--topology-out <path>` (기본: 자동 경로, workspace/home `aws-topology.json`)
|
|
827
|
+
- `--relationships-out <path>` (기본: 자동 경로, workspace/home `aws-relationships.json`)
|
|
828
|
+
- `--governance-log <path>` (기본: 자동 경로, workspace/home `mcp-aws-governance-log.jsonl`)
|
|
829
|
+
- `--verify-governance-chain` / `--no-verify-governance-chain`
|
|
830
|
+
- `--incident-webhook-url <url>`
|
|
831
|
+
- `--incident-webhook-timeout-ms <n>`
|
|
832
|
+
- `--incident-webhook-auth-header <name>`
|
|
833
|
+
- `--incident-webhook-token <token>`
|
|
834
|
+
- `--incident-out <path>`
|
|
835
|
+
- `--open-html` (기본 on)
|
|
836
|
+
- `--no-open-html` (자동 오픈 off)
|
|
837
|
+
- `--auto-sso-login` / `--no-auto-sso-login`
|
|
838
|
+
- `--format <json|csv|markdown|html>`
|
|
839
|
+
- `--out <path>`
|
|
840
|
+
|
|
841
|
+
</details>
|
|
842
|
+
|
|
843
|
+
거버넌스 체인 검증 명령:
|
|
90
844
|
|
|
91
|
-
|
|
92
|
-
-
|
|
93
|
-
|
|
94
|
-
- `ec2_apply_instance_profile`
|
|
845
|
+
```bash
|
|
846
|
+
mcp-aws-manager governance verify --governance-log ./mcp-aws-governance-log.jsonl --strict
|
|
847
|
+
```
|
|
95
848
|
|
|
96
|
-
|
|
849
|
+
## 클라이언트 스모크 자동화
|
|
97
850
|
|
|
98
|
-
|
|
99
|
-
- `ec2_apply_instance_profile`: `{ "profile": "default", "region": "ap-southeast-1", "instanceId": "i-123", "instanceProfileName": "my-ssm-profile", "allowReplaceProfile": true }`
|
|
851
|
+
클라이언트별 스모크 체크:
|
|
100
852
|
|
|
101
|
-
|
|
853
|
+
```bash
|
|
854
|
+
npm run smoke:clients
|
|
855
|
+
npm run smoke:clients:strict
|
|
856
|
+
node scripts/smoke-clients.js --clients codex,claude --json-out ./smoke-report.json
|
|
857
|
+
```
|
|
102
858
|
|
|
103
|
-
-
|
|
104
|
-
-
|
|
105
|
-
- SSM/런타임: `SSM_ROLE_OR_AGENT_REQUIRED`, `SSM_RUNCOMMAND_PERMISSION_REQUIRED`
|
|
106
|
-
- 수동 모드: `MANUAL_SERVER_LIST_EMPTY`, `MANUAL_SERVER_HOST_REQUIRED`, `PEM_KEY_NOT_FOUND`, `PEM_MAPPING_REQUIRED`, `SSH_CLIENT_NOT_FOUND`
|
|
859
|
+
- 기본 모드: 상태를 리포트하고 종료코드 `0`
|
|
860
|
+
- `--strict`: 선택한 클라이언트 중 하나라도 비정상이면 non-zero 종료
|
|
107
861
|
|
|
108
|
-
##
|
|
862
|
+
## AWS E2E 시나리오 자동화
|
|
109
863
|
|
|
110
|
-
|
|
111
|
-
- `AWS_SSO_SETUP_GUIDE_KO.md`
|
|
864
|
+
실계정 시나리오(권한/리전/복구 경로) 점검:
|
|
112
865
|
|
|
113
|
-
|
|
866
|
+
```bash
|
|
867
|
+
npm run e2e:aws -- --profile default --region us-east-1 --out-dir ./.e2e-aws
|
|
868
|
+
npm run e2e:aws:strict -- --profile default --region us-east-1
|
|
869
|
+
```
|
|
114
870
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
- `
|
|
871
|
+
E2E 러너 검증 항목:
|
|
872
|
+
|
|
873
|
+
- 기본 관찰(observe) 흐름(JSON 계약 + `rawNormalized`)
|
|
874
|
+
- 잘못된 리전 입력 처리 경로
|
|
875
|
+
- mutable discover 확인 게이트(`CHANGE_CONFIRMATION_REQUIRED`)
|
|
876
|
+
- 확인 승인 경로(`--user-confirmation yes`)
|
|
877
|
+
- 강제 incident 에스컬레이션 페이로드 산출물(`INCIDENT_ESCALATION_RECOMMENDED`)
|
|
878
|
+
- 엔터프라이즈 정책 승인 티켓 게이트(`APPROVAL_TICKET_REQUIRED`)
|
|
879
|
+
- 거버넌스 해시 체인 검증(`governance verify --strict`)
|
|
880
|
+
|
|
881
|
+
<details>
|
|
882
|
+
<summary>권한 체크리스트</summary>
|
|
883
|
+
|
|
884
|
+
활성화한 기능에 따라 최소 권한이 달라집니다.
|
|
885
|
+
|
|
886
|
+
- Core inventory: `ec2:DescribeRegions`, `ec2:DescribeInstances`
|
|
887
|
+
- Lambda: `lambda:ListFunctions`
|
|
888
|
+
- ALB/TargetGroups: `elasticloadbalancing:DescribeLoadBalancers`, `elasticloadbalancing:DescribeTargetGroups`
|
|
889
|
+
- ASG: `autoscaling:DescribeAutoScalingGroups`
|
|
890
|
+
- RDS: `rds:DescribeDBInstances`
|
|
891
|
+
- ElastiCache: `elasticache:DescribeCacheClusters`
|
|
892
|
+
- Route53: `route53:ListHostedZones`, `route53:ListResourceRecordSets`
|
|
893
|
+
- VPC/Subnet/SecurityGroup: `ec2:DescribeVpcs`, `ec2:DescribeSubnets`, `ec2:DescribeSecurityGroups`
|
|
894
|
+
- ECS: `ecs:ListClusters`, `ecs:DescribeClusters`, `ecs:ListServices`, `ecs:DescribeServices`
|
|
895
|
+
- S3: `s3:ListAllMyBuckets`, `s3:GetBucketLocation`
|
|
896
|
+
- IAM: `iam:ListRoles`
|
|
897
|
+
- KMS: `kms:ListKeys`, `kms:DescribeKey`
|
|
898
|
+
- ACM: `acm:ListCertificates`, `acm:DescribeCertificate`
|
|
899
|
+
- Kinesis: `kinesis:ListStreams`, `kinesis:DescribeStreamSummary`
|
|
900
|
+
- MSK: `kafka:ListClustersV2`
|
|
901
|
+
- CloudWatch: `cloudwatch:DescribeAlarms`
|
|
902
|
+
- EBS: `ec2:DescribeVolumes`
|
|
903
|
+
- EFS: `elasticfilesystem:DescribeFileSystems`
|
|
904
|
+
- EKS: `eks:ListClusters`, `eks:DescribeCluster`
|
|
905
|
+
- API Gateway: `apigateway:GET`
|
|
906
|
+
- CloudFront: `cloudfront:ListDistributions`
|
|
907
|
+
- WAFv2: `wafv2:ListWebACLs`
|
|
908
|
+
- Shield: `shield:ListProtections`
|
|
909
|
+
- Step Functions: `states:ListStateMachines`
|
|
910
|
+
- CloudWatch Logs: `logs:DescribeLogGroups`
|
|
911
|
+
- X-Ray: `xray:GetGroups`
|
|
912
|
+
- Inspector2: `inspector2:ListFindings`
|
|
913
|
+
- Redshift: `redshift:DescribeClusters`
|
|
914
|
+
- OpenSearch: `es:ListDomainNames`, `es:DescribeDomain`
|
|
915
|
+
- Organizations: `organizations:ListAccounts`
|
|
916
|
+
- ControlTower: `controltower:ListLandingZones`
|
|
917
|
+
- CI/CD 분석 확장: `codepipeline:ListPipelines`, `codepipeline:ListPipelineExecutions`, `codebuild:ListProjects`, `codebuild:ListBuildsForProject`, `codebuild:BatchGetBuilds`, `codedeploy:ListApplications`, `codedeploy:ListDeploymentGroups`, `codedeploy:ListDeployments`, `codedeploy:BatchGetDeployments`
|
|
918
|
+
- 보안 분석 확장: `config:DescribeConfigRules`, `config:DescribeComplianceByConfigRule`, `acm:ListCertificates`, `acm:DescribeCertificate`
|
|
919
|
+
- FinOps 분석 확장: `ce:GetSavingsPlansUtilization`, `ce:GetReservationCoverage`
|
|
920
|
+
- Runtime snapshot: `ssm:SendCommand`, `ssm:GetCommandInvocation`, `ssm:DescribeInstanceInformation`
|
|
921
|
+
- Auto-remediation: `ec2:AssociateIamInstanceProfile`, optional `ec2:ReplaceIamInstanceProfileAssociation`, `iam:PassRole`
|
|
922
|
+
- Mutate 도구 확장:
|
|
923
|
+
- ECS: `ecs:DescribeServices`, `ecs:UpdateService`
|
|
924
|
+
- ASG: `autoscaling:SetDesiredCapacity`
|
|
925
|
+
- RDS: `rds:StartDBInstance`, `rds:StopDBInstance`, `rds:RebootDBInstance`
|
|
926
|
+
- EKS: `eks:DescribeNodegroup`, `eks:UpdateNodegroupConfig`
|
|
927
|
+
- Organizations fan-out(옵션): `organizations:ListAccounts`, `sts:AssumeRole`(대상 계정 role trust 필요)
|
|
928
|
+
|
|
929
|
+
수동 모드:
|
|
930
|
+
|
|
931
|
+
- 인벤토리는 사용자 제공 서버 목록 파일 사용(AWS API 불필요)
|
|
932
|
+
- 런타임 스냅샷은 직접 PEM SSH와 ProxyJump/Bastion 라우팅(`--ssh-proxy-jump`, `--ssh-bastion-*`)을 지원
|
|
933
|
+
|
|
934
|
+
</details>
|
|
935
|
+
|
|
936
|
+
## 관련 문서
|
|
937
|
+
|
|
938
|
+
문서 상태:
|
|
939
|
+
- Canonical(구현과 동기화 필수): `README.md`, `RESPONSE_COMPATIBILITY_POLICY.md`
|
|
940
|
+
- Reference(상세/비교 참고): `IMPLEMENTATION_INTEGRATIONS.md`, `MCP_DIFFERENTIATION.md`, `MCP_DIFFERENTIATION_KO.md`, `AGENT_WORKING_CONTEXT_KO.md`, `RECORDS_FIELD_REFERENCE_KO.md`
|
|
941
|
+
|
|
942
|
+
- `README_KO.md`: 한국어 개요/빠른 시작
|
|
943
|
+
- `IMPLEMENTATION_INTEGRATIONS.md`: API/CLI 연동 인벤토리
|
|
944
|
+
- `MCP_DIFFERENTIATION.md`: AWS MCP 대안 대비 차별점
|
|
945
|
+
- `MCP_DIFFERENTIATION_KO.md`: 한국어 차별화/선택 가이드
|
|
946
|
+
- `AGENT_WORKING_CONTEXT_KO.md`: 에이전트 협업 시 불변 원칙/작업 루프/operationId 빠른 참조
|
|
947
|
+
- `RECORDS_FIELD_REFERENCE_KO.md`: `records[]` 전수 필드(292개) 레퍼런스
|
|
948
|
+
- `RESPONSE_COMPATIBILITY_POLICY.md`: 응답 스키마/버전 호환 정책
|
|
949
|
+
- `schemas/mcp-tool-response.schema.json`: 표준 도구 응답 JSON 스키마
|
|
950
|
+
|
|
951
|
+
|