| name | doubt-driven-infra |
| description | Subjects non-trivial infrastructure decisions to adversarial review before they stand. Use when making production changes, security-sensitive modifications, irreversible operations, or working in unfamiliar infrastructure code. |
Doubt-Driven Infra
Overview
ํ์ ์ ์ ํ์ฑ์ด ์๋๋๋ค. ์ธํ๋ผ ๋ณ๊ฒฝ์ ๋น๊ฐ์ญ์ ์ด๊ณ ๋ธ๋์คํธ ๋ ๋์ด์ค๊ฐ ํฌ๋ฏ๋ก, ๋น์๋ช
ํ ๊ฒฐ์ ์ ๋ํด fresh-context adversarial review๋ฅผ ์ํํฉ๋๋ค.
์ด ์คํฌ์ /review๊ฐ ์๋๋๋ค. /review๋ ์์ฑ๋ ์ฐ์ถ๋ฌผ์ ๋ํ ํ์ ์
๋๋ค. ์ด ์คํฌ์ ์งํ ์ค์ธ ๊ฒฐ์ ์ ๋ํ ๊ต์ฐจ ๊ฒ์ฆ์
๋๋ค.
When to Use
๊ฒฐ์ ์ด ๋น์๋ช
(non-trivial) ํ ๊ฒฝ์ฐ:
- ํ๋ก๋์
ํ๊ฒฝ ๋ณ๊ฒฝ (terraform apply to prd)
- IAM ์ ์ฑ
์์ (๊ถํ ํ๋/์ถ์)
- Security Group ๊ท์น ๋ณ๊ฒฝ
- ๋คํธ์ํฌ ๊ตฌ์กฐ ๋ณ๊ฒฝ (VPC, Subnet, Route Table)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ (์์ง ์
๊ทธ๋ ์ด๋, ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ)
- ๋น๊ฐ์ญ์ ์์
(๋ฆฌ์์ค ์ญ์ , ๋ฐ์ดํฐ ๋ง์ด๊ทธ๋ ์ด์
)
- ์ต์ํ์ง ์์ ์ธํ๋ผ ์ฝ๋ ์์
์ ์ฉํ์ง ์๋ ๊ฒฝ์ฐ:
- ํ๊ทธ ๋ณ๊ฒฝ, ์ค๋ช
์์
- dev ํ๊ฒฝ ๋จ์ผ ๋ฆฌ์์ค ๋ณ๊ฒฝ
- terraform fmt, ๋ณ์๋ช
๋ฆฌ๋ค์ด๋ฐ
- ์ฌ์ฉ์๊ฐ ๋ช
์์ ์ผ๋ก ์๋ ์ฐ์ ์ ์์ฒญํ ๊ฒฝ์ฐ
The Process
Doubt cycle:
- [ ] Step 1: CLAIM โ ๋ณ๊ฒฝ ๋ด์ฉ + ์ ์์ ํ์ง ์ฃผ์ฅ ์์ฑ
- [ ] Step 2: EXTRACT โ ๋ณ๊ฒฝ ์ฝ๋/plan ๊ฒฐ๊ณผ๋ง ๋ถ๋ฆฌ (์ถ๋ก ๊ณผ์ ์ ๊ฑฐ)
- [ ] Step 3: DOUBT โ adversarial ๊ด์ ์์ ๋ฐ๋ฐ ์๋
- [ ] Step 4: RECONCILE โ ๋ฐ๊ฒฌ ์ฌํญ ๋ถ๋ฅ ๋ฐ ๋์
- [ ] Step 5: STOP โ ์ข
๋ฃ ์กฐ๊ฑด ์ถฉ์กฑ ํ์ธ
Step 1: CLAIM
๋ณ๊ฒฝ ๋ด์ฉ๊ณผ ์์ ์ฑ ์ฃผ์ฅ์ ๋ช
์ํฉ๋๋ค.
CLAIM:
- ๋ณ๊ฒฝ: prd-sg-web์ 443 ํฌํธ ์ธ๋ฐ์ด๋ ๊ท์น ์ถ๊ฐ
- ์์ ์ฑ ์ฃผ์ฅ: ALB์์๋ง ์ ๊ทผํ๋ฏ๋ก source๋ฅผ ALB SG๋ก ์ ํ
- ๋ธ๋์คํธ ๋ ๋์ด์ค: web tier๋ง ์ํฅ
- ๋กค๋ฐฑ: ๊ท์น ์ ๊ฑฐ (terraform apply ์ด์ ์ฝ๋)
Step 2: EXTRACT
terraform plan ๊ฒฐ๊ณผ ๋๋ ๋ณ๊ฒฝ ์ฝ๋๋ง ๋ถ๋ฆฌํฉ๋๋ค. ์์ ์ ์ถ๋ก ๊ณผ์ ์ ์ ๊ฑฐํฉ๋๋ค.
ARTIFACT:
resource "aws_security_group_rule" "web_https" {
type = "ingress"
from_port = 443
to_port = 443
protocol = "tcp"
source_security_group_id = aws_security_group.alb.id
security_group_id = aws_security_group.web.id
}
CONTRACT:
- 443 ํฌํธ๋ง ํ์ฉ
- source๋ ALB SG๋ง
- web SG์๋ง ์ ์ฉ
Step 3: DOUBT
adversarial ๊ด์ ์์ ๋ฐ๋ฐํฉ๋๋ค.
์ง๋ฌธ ๋ชฉ๋ก:
| ๊ฒ์ฆ ํญ๋ชฉ | ์ง๋ฌธ |
|---|
| ๋ฒ์ ์ด๊ณผ | ์ด ๊ท์น์ด ์๋ํ์ง ์์ ์ ๊ทผ์ ํ์ฉํ๋๊ฐ? |
| ์์กด์ฑ | ALB SG๊ฐ ์ด๋ฏธ ๊ณผ๋ํ๊ฒ ์ด๋ ค ์์ง ์์๊ฐ? |
| ์์ | ์ด ๋ณ๊ฒฝ ์ ์ ํ์ํ ์ ํ ์กฐ๊ฑด์ด ์๋๊ฐ? |
| ๋กค๋ฐฑ | ๋กค๋ฐฑ ์ ์๋น์ค ์ค๋จ์ด ๋ฐ์ํ๋๊ฐ? |
| State | terraform state์ ์ค์ ๋ฆฌ์์ค๊ฐ ์ผ์นํ๋๊ฐ? |
| ์๋ฌต์ ๊ฐ์ | "ALB์์๋ง ์ ๊ทผ"์ด๋ผ๋ ๊ฐ์ ์ด ๊ฒ์ฆ๋์๋๊ฐ? |
Step 4: RECONCILE
๋ฐ๊ฒฌ ์ฌํญ์ ๋ถ๋ฅํฉ๋๋ค.
| ๋ถ๋ฅ | ์กฐ์น |
|---|
| ์ค์ ์ํ | ๋ณ๊ฒฝ ์ค๋จ, ์์ ํ ์ฌ์๋ |
| ๊ฒ์ฆ ํ์ | ๋ช
๋ น์ด๋ก ํ์ธ ํ ์งํ |
| ์ฌ์ํ ์ฐ๋ ค | ๊ธฐ๋ก ํ ์งํ |
Step 5: STOP
์ข
๋ฃ ์กฐ๊ฑด:
- ๋ชจ๋ "์ค์ ์ํ" ํด์
- ๋ชจ๋ "๊ฒ์ฆ ํ์" ํญ๋ชฉ ํ์ธ ์๋ฃ
- 3ํ ์ฌ์ดํด ์ด๊ณผ ์ ์ฌ์ฉ์์๊ฒ ํ๋จ ์์
- ์ฌ์ฉ์๊ฐ ๋ช
์์ ์ผ๋ก ์งํ ์น์ธ
Verification Commands
DOUBT ๋จ๊ณ์์ ์ฌ์ฉํ๋ ๊ฒ์ฆ ๋ช
๋ น์ด:
aws ec2 describe-security-groups --group-ids <sg-id> \
--query 'SecurityGroups[].IpPermissions'
aws iam simulate-principal-policy --policy-source-arn <role-arn> \
--action-names <action> --resource-arns <resource>
terraform plan -detailed-exitcode
aws ec2 describe-network-interfaces --filters Name=group-id,Values=<sg-id>
Common Rationalizations
| Rationalization | Reality |
|---|
| "plan ํ์ธํ์ผ๋ ์์ ํฉ๋๋ค" | plan์ ๋
ผ๋ฆฌ์ ์ ํฉ์ฑ๋ง ๋ณด์ฌ์ค๋๋ค. ๋ณด์/์์กด์ฑ์ ๋ณ๋ ๊ฒ์ฆ์ด ํ์ํฉ๋๋ค. |
| "dev์์ ํ
์คํธํ์ต๋๋ค" | prd๋ ๋คํธ์ํฌ, ๊ถํ, ๋ฐ์ดํฐ๊ฐ ๋ค๋ฆ
๋๋ค. ํ๊ฒฝ ์ฐจ์ด๋ฅผ ๊ฒ์ฆํฉ๋๋ค. |
| "์์ ๋ณ๊ฒฝ์ด๋ผ doubt ๋ถํ์ํฉ๋๋ค" | SG ๊ท์น 1์ค์ด ์ ์ฒด ๋คํธ์ํฌ๋ฅผ ๋
ธ์ถํ ์ ์์ต๋๋ค. |
| "์๊ฐ์ด ์์ต๋๋ค" | 5๋ถ doubt๊ฐ ์ ์๊ฐ ์ฅ์ ๋ณต๊ตฌ๋ฅผ ๋ฐฉ์งํฉ๋๋ค. |
| "์ด์ ์๋ ์ด๋ ๊ฒ ํ์ต๋๋ค" | ์ด์ ๊ฒฐ์ ์ด ์ฌ๋ฐ๋ฅธ์ง๋ ๊ฒ์ฆ ๋์์
๋๋ค. |
Red Flags
- terraform apply ์ ์ DOUBT ์ฌ์ดํด ๋ฏธ์ํ
- "์์ ํ๋ค"๋ ์ฃผ์ฅ์ ๊ฒ์ฆ ๋ช
๋ น์ด ๊ฒฐ๊ณผ๊ฐ ์์
- ๋ธ๋์คํธ ๋ ๋์ด์ค ๋ฏธํ์
์ํ์์ ์งํ
- ์๋ฌต์ ๊ฐ์ ์ ๋ช
์ํ์ง ์์
- DOUBT ๋จ๊ณ์์ ๋ฐ๊ฒฌ๋ ์ํ์ ๋ฌด์ํ๊ณ ์งํ
- ๋กค๋ฐฑ ๊ณํ ์์ด ๋น๊ฐ์ญ์ ๋ณ๊ฒฝ ์ํ
Verification
DOUBT ์ฌ์ดํด ์๋ฃ ํ: