
당신의 AWS를 파일시스템으로.

이렇게:
grep -l "AdministratorAccess" iam/users/*/policies.json
이 대신에:
aws iam list-users --query 'Users[].UserName' --output text | \
xargs -I{} sh -c 'aws iam list-attached-user-policies --user-name {} --query "AttachedPolicies[].PolicyArn" --output text' | \
grep AdministratorAccess
sisu는 AWS 리소스를 로컬 파일시스템으로 마운트합니다. JSON과 AWS CLI로 씨름하는 대신 이미 알고 있는 도구(grep, cat, diff, vim)를 사용하세요.
설계부터 AI 친화적: AI 도구는 서버에 SSH로 접속하거나 대화형 AWS CLI 세션을 실행할 수 없습니다. 하지만 sisu를 사용하면 전체 AWS 인프라가 어떤 AI든 읽을 수 있는 단순한 파일 경로가 됩니다. 원격 EC2 파일시스템은 ec2/<instance>/fs/ 경로로 접근할 수 있어서, AI가 SSH 없이도 /var/log, /etc 및 인스턴스의 모든 파일을 탐색할 수 있습니다.
현재 S3, SSM, IAM, VPC, Lambda, EC2, ECS, CloudFront, Secrets Manager, Route 53 및 CloudWatch Logs를 지원합니다.
go install github.com/semonte/sisu@latest
FUSE가 필요합니다:
sudo apt install fuse # Ubuntu/Debian
sudo yum install fuse # RHEL/CentOS
sisu
시작됐습니다. 이제 AWS가 손끝에 있습니다:
~/.sisu/mnt/
├── default/ # AWS profile
│ ├── global/ # IAM, S3, Route 53 (region-independent)
│ │ ├── iam/
│ │ ├── route53/
│ │ └── s3/
│ ├── us-east-1/ # Regional services
│ │ ├── cloudfront/
│ │ ├── ec2/
│ │ ├── ecs/
│ │ ├── lambda/
│ │ ├── logs/
│ │ ├── secrets/
│ │ ├── ssm/
│ │ └── vpc/
│ └── eu-west-1/
│ └── ...
├── prod/ # Other profiles from ~/.aws/credentials
└── staging/
작업이 끝나면 exit를 입력하세요.
# Who has admin access?
grep -l "AdministratorAccess" */global/iam/users/*/policies.json
# Security groups with SSH open
grep -r '"FromPort": 22' */us-east-1/vpc/*/security-groups/
# Roles that Lambda can assume
grep -l "lambda.amazonaws.com" */global/iam/roles/*/info.json
# Secrets in SSM?
grep -r "password" */us-east-1/ssm/
# Lambda functions with secrets in env vars
grep -r "PASSWORD\|SECRET\|API_KEY" */us-east-1/lambda/*/env.json
# Functions using deprecated runtimes
grep -r "python3.8\|nodejs16" */*/lambda/*/config.json
# EC2 instances with public IPs
grep -r "PublicIpAddress" */*/ec2/*/info.json
# Find stopped instances (wasting money?)
grep -r '"Name": "stopped"' */*/ec2/*/info.json
# Connect to an EC2 instance via SSM (no SSH keys needed!)
./default/us-east-1/ec2/i-abc123/connect
# View EC2 boot logs and kernel messages
cat default/us-east-1/ec2/i-abc123/console.log
# View all secrets
ls */us-east-1/secrets/
# Read a secret value
cat default/us-east-1/secrets/myapp/database/value
# List all DNS zones
ls */global/route53/
# View DNS records for a zone
cat default/global/route53/example.com/records.json
# Find all CNAME records
grep -r '"Type": "CNAME"' */global/route53/*/records.json
# Grep recent logs for errors
grep -i "error" default/us-east-1/logs/aws/lambda/my-function/latest.log
# View all log groups
ls */us-east-1/logs/
# List log streams (shows 20 most recent)
ls default/us-east-1/logs/aws/lambda/my-function/
# View events from a specific stream
cat default/us-east-1/logs/aws/lambda/my-function/2024_01_15_abc123/events.log
# ECS: Browse clusters, services, and tasks
ls default/us-east-1/ecs/my-cluster/my-service/
cat default/us-east-1/ecs/my-cluster/my-service/logs/latest.log
# CloudFront: View distributions and functions
ls default/us-east-1/cloudfront/distributions/
cat default/us-east-1/cloudfront/functions/my-auth/code.js
# S3: Check bucket policies and access settings
cat default/global/s3/my-bucket/.meta/policy.json
cat default/global/s3/my-bucket/.meta/public-access-block.json
# Compare IAM roles between accounts
diff prod/global/iam/roles/api/info.json staging/global/iam/roles/api/info.json
# Security group drift between regions
diff default/us-east-1/vpc/vpc-xxx/security-groups/sg-xxx.json default/eu-west-1/vpc/vpc-yyy/security-groups/sg-yyy.json
# Lambda config differences
diff prod/us-east-1/lambda/my-func/config.json staging/us-east-1/lambda/my-func/config.json
# Pretty print with jq
cat default/global/iam/roles/my-role/info.json | jq '.AssumeRolePolicyDocument'
# Count your roles
ls default/global/iam/roles/ | wc -l
# Find untagged resources
cat default/us-east-1/vpc/vpc-xxx/info.json | jq 'select(.Tags == null)'
# List all Lambda runtimes in use
grep -h "Runtime" */*/lambda/*/config.json | sort | uniq -c
cat default/us-east-1/ssm/myapp/database-url # read
echo "postgres://prod:5432" > default/us-east-1/ssm/database-url # write
vim default/us-east-1/ssm/myapp/config # edit
cp local.txt default/global/s3/my-bucket/backup/
cat default/global/s3/my-bucket/logs/app.log | grep ERROR
rm default/global/s3/my-bucket/old-file.txt
sisu # Start at root
sisu --profile prod # Start in prod/
sisu --profile prod --region us-east-1 # Start in prod/us-east-1/
sisu stop # Unmount
sisu --debug # Debug logging
로그 스트림 events.log 파일은 AWS에서 전체를 메모리에 로드하는 대신 지연(lazy) 스트리밍 방식으로 가져옵니다:
cat, grep, head, less와 함께 동작합니다# Fetches only enough batches to find the match
grep "ERROR" .../my-stream/events.log
# Fetches just the first batch
head -50 .../my-stream/events.log
# Scroll through with on-demand loading
less .../my-stream/events.log
# Will fetch all events
cat .../my-stream/events.log | wc -l
참고: tail은 파일 끝을 찾아가므로 스트리밍 파일에서는 제대로 동작하지 않습니다. 실제 파일 크기는 전체가 로드될 때까지 알 수 없기 때문입니다. 해결 방법으로 cat ... | tail을 사용하세요.
각 서비스의 로그는 리소스 바로 아래에 있습니다. 로그 그룹을 찾아 헤맬 필요가 없습니다:
# Lambda function logs
cat default/us-east-1/lambda/my-function/logs/latest.log
# EC2 instance logs (searches for log groups containing instance ID)
cat default/us-east-1/ec2/i-abc123/logs/latest.log
# ECS service logs
cat default/us-east-1/ecs/my-cluster/my-service/logs/latest.log
# CloudFront function logs
cat default/us-east-1/cloudfront/functions/my-auth/logs/latest.log
모든 통합 로그는 스트리밍을 사용합니다. 읽는 동안 이벤트를 온디맨드로 가져옵니다.
ECS 클러스터, 서비스, 작업을 탐색합니다:
ecs/
├── my-cluster/
│ ├── web-service/
│ │ ├── info.json # Service configuration
│ │ ├── logs/
│ │ │ └── latest.log # Streaming service logs
│ │ └── tasks/
│ │ └── abc123/
│ │ └── info.json # Task details
│ └── api-service/
│ └── ...
# List all ECS clusters
ls default/us-east-1/ecs/
# View service configuration
cat default/us-east-1/ecs/my-cluster/web-service/info.json
# Stream service logs
cat default/us-east-1/ecs/my-cluster/web-service/logs/latest.log
# List running tasks
ls default/us-east-1/ecs/my-cluster/web-service/tasks/
CloudFront 배포와 함수를 탐색합니다:
cloudfront/
├── distributions/
│ └── E1ABC123/
│ ├── info.json # Distribution config
│ └── origins.json # Origins with OAC/OAI info
└── functions/
└── my-auth/
├── code.js # Function source code
├── config.json # Function configuration
└── logs/
└── latest.log # Function execution logs
# List distributions
ls default/us-east-1/cloudfront/distributions/
# Check origin access configuration (debug S3 access issues!)
cat default/us-east-1/cloudfront/distributions/E1ABC123/origins.json
# View and edit CloudFront function code
cat default/us-east-1/cloudfront/functions/my-auth/code.js
# Debug function execution
cat default/us-east-1/cloudfront/functions/my-auth/logs/latest.log
각 S3 버킷에는 버킷 구성이 담긴 숨겨진 .meta/ 디렉터리가 있습니다:
# View bucket policy
cat default/global/s3/my-bucket/.meta/policy.json
# Check public access block settings
cat default/global/s3/my-bucket/.meta/public-access-block.json
CloudFront-to-S3 액세스 문제를 디버깅할 때 유용합니다!
각 EC2 인스턴스는 다음을 제공합니다:
ls default/us-east-1/ec2/i-abc123/
# info.json security-groups.json tags.json console.log connect fs/ logs/
SSM으로 연결 (SSH 키, 공용 IP 불필요):
./default/us-east-1/ec2/i-abc123/connect
Session Manager 플러그인이 필요합니다.
부팅 로그 및 커널 메시지 보기:
cat default/us-east-1/ec2/i-abc123/console.log
인스턴스 파일시스템 원격 탐색 (SSM Run Command 사용):
# List files on the instance
ls default/us-east-1/ec2/i-abc123/fs/etc/
# Read remote files
cat default/us-east-1/ec2/i-abc123/fs/etc/hostname
# Grep across remote logs
grep ERROR default/us-east-1/ec2/i-abc123/fs/var/log/syslog
# Compare configs between instances
diff prod/us-east-1/ec2/i-111/fs/etc/nginx/nginx.conf \
prod/us-east-1/ec2/i-222/fs/etc/nginx/nginx.conf
SSH 키나 개방된 포트가 필요 없습니다. 내부적으로 SSM Run Command를 사용합니다.
| 도구 | 용도 |
|---|---|
| fzf | 미리보기가 있는 퍼지 파인더 |
| jq | JSON 쿼리/변환 |
| difftastic | 구조적 diff (JSON 이해) |
# Browse and preview any resource interactively
find */global/iam/roles -name "info.json" | fzf --preview 'jq . {}'
# Find Lambda functions with high memory
jq -r 'select(.MemorySize > 512) | .FunctionName' */us-east-1/lambda/*/config.json
# Compare prod vs staging config
difft prod/us-east-1/lambda/api/config.json staging/us-east-1/lambda/api/config.json
단순한 파일일 뿐이므로 AI 도구가 AWS를 직접 읽고 분석할 수 있습니다:
cd ~/.sisu/mnt && claude
"Find security groups that allow SSH from 0.0.0.0/0"
"Review IAM roles for overly permissive policies"
"Compare prod and staging Lambda configs"
문제: ECS 서비스가 "No Container Instances were found in your cluster" 오류로 실패함
SSH 없이 sisu로 진단하기:
# Check cluster status - no instances registered
cat ecs/jobdeck-cluster/info.json | jq '.RegisteredContainerInstancesCount'
# → 0
# Check service config - using EC2 launch type
cat ecs/jobdeck-cluster/jobdeck-api/info.json | jq '.LaunchType, .FailedTasks'
# → "EC2", 136
# EC2 instance exists - check its ECS config
cat ec2/i-xxx/fs/etc/ecs/ecs.config
# → ECS_CLUSTER=jobdeck-cluster ✓
# Check ECS agent logs - no agent log!
ls ec2/i-xxx/fs/var/log/ecs/
# → ecs-volume-plugin.log (missing ecs-agent.log!)
# Check what AMI is running
cat ec2/i-xxx/fs/etc/image-id
# → image_name="amzn2-ami-minimal-hvm" ← NOT ECS-optimized!
근본 원인 발견: EC2 인스턴스가 ECS 최적화 AMI 대신 Amazon Linux 2 Minimal AMI를 사용하고 있습니다. Minimal AMI에는 ECS 패키지가 설치되어 있지만 에이전트 서비스가 기본적으로 활성화되어 있지 않습니다.
해결 방법: ECS 최적화 AMI를 사용하거나 user-data에 systemctl enable --now ecs를 추가하세요.
이 모든 디버깅은 Claude AI가 sisu를 통해 파일시스템을 탐색하면서 수행했습니다. 수동 SSH가 필요 없습니다!
MIT
| 서비스 | 읽기 | 쓰기 | 삭제 |
|---|
| S3 (객체, 버킷 정책, 액세스 설정) | ✓ | ✓ | ✓ |
| SSM Parameter Store | ✓ | ✓ | ✓ |
| IAM (사용자, 역할, 정책, 그룹) | ✓ | - | - |
| VPC (서브넷, 보안 그룹, 라우트) | ✓ | - | - |
| Lambda (구성, 정책, 환경 변수, 로그) | ✓ | - | - |
| EC2 (인스턴스, 보안 그룹, 태그, 로그, 원격 파일시스템) | ✓ | - | - |
| ECS (클러스터, 서비스, 작업, 로그) | ✓ | - | - |
| CloudFront (배포, 함수, 로그) | ✓ | - | - |
| Secrets Manager | ✓ | - | - |
| Route 53 (영역, 레코드) | ✓ | - | - |
| CloudWatch Logs | ✓ | - | - |