# AWS 部署

在 Amazon Web Services 上使用 EKS、RDS、ElastiCache 和 MSK/NATS 部署 Monetarie PIX。

## 前提条件

- 具有适当 IAM 权限的 AWS 账户
- AWS CLI 已配置
- `eksctl` 和 `kubectl` 已安装
- Route 53 中已注册域名

## 架构

```mermaid
graph TB
    R53[Route 53] --> ALB[Application Load Balancer]
    ALB --> EKS[EKS 集群<br/>3 节点]

    subgraph VPC
        EKS --> RDS[(RDS PostgreSQL 16<br/>多可用区)]
        EKS --> EC[(ElastiCache Redis 7)]
        EKS --> NATS[NATS on EC2<br/>3 节点集群]
    end

    EKS -->|出站| BACEN[BACEN RSFN]
```

## 基础设施设置

### VPC 和网络

```bash
# 创建具有公有和私有子网的 VPC
aws ec2 create-vpc --cidr-block 10.0.0.0/16

# 为 EKS、RDS、ElastiCache 创建私有子网
# 为 ALB 创建公有子网
# 配置 NAT 网关以访问 BACEN 出站连接
```

### EKS 集群

```bash
eksctl create cluster \
  --name monetarie-pix \
  --region sa-east-1 \
  --nodegroup-name workers \
  --node-type m5.2xlarge \
  --nodes 3 \
  --nodes-min 2 \
  --nodes-max 6 \
  --managed
```

### RDS PostgreSQL

```bash
aws rds create-db-instance \
  --db-instance-identifier monetarie-pix-db \
  --db-instance-class db.r6g.xlarge \
  --engine postgres \
  --engine-version 16.1 \
  --master-username monetarie_prod \
  --master-user-password "SECURE_PASSWORD" \
  --allocated-storage 500 \
  --storage-type gp3 \
  --multi-az \
  --vpc-security-group-ids sg-xxx \
  --db-subnet-group-name pix-db-subnet
```

关键 RDS 参数：

| 参数 | 值 | 用途 |
|------|-----|------|
| `max_connections` | 6000 | 支持 POOL_SIZE=200 x 4 repos x 4 pods |
| `shared_buffers` | 8 GB | 约为实例 RAM 的 25% |
| `effective_cache_size` | 24 GB | 约为实例 RAM 的 75% |

### ElastiCache Redis

```bash
aws elasticache create-replication-group \
  --replication-group-id monetarie-pix-redis \
  --replication-group-description "Monetarie PIX Redis" \
  --engine redis \
  --engine-version 7.1 \
  --cache-node-type cache.r6g.large \
  --num-cache-clusters 2
```

### NATS 集群 (EC2)

在 EC2 实例上部署 3 个启用 JetStream 的 NATS 节点：

```bash
# 在私有子网中启动 3 个 EC2 实例 (t3.xlarge)
# 安装 NATS Server 2.10 并启用 JetStream
# 配置节点间的集群路由
```

## 应用部署

### ECR 仓库

```bash
aws ecr create-repository --repository-name monetarie/pix-backend
aws ecr create-repository --repository-name monetarie/pix-frontend

# 构建并推送
docker build -t pix-backend:latest backend/
docker tag pix-backend:latest ACCOUNT.dkr.ecr.sa-east-1.amazonaws.com/monetarie/pix-backend:latest
docker push ACCOUNT.dkr.ecr.sa-east-1.amazonaws.com/monetarie/pix-backend:latest
```

### Secrets (AWS Secrets Manager)

```bash
aws secretsmanager create-secret \
  --name monetarie-pix/db-credentials \
  --secret-string '{"database-url":"postgres://...","secret-key-base":"..."}'
```

使用 External Secrets Operator 或 IRSA 将密钥注入到 pods 中。

### 部署到 EKS

```bash
kubectl create namespace pix
kubectl apply -f deploy/backend.yaml -n pix
kubectl apply -f deploy/admin-frontend.yaml -n pix
```

### ALB Ingress

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: pix-ingress
  namespace: pix
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:...
    alb.ingress.kubernetes.io/ssl-redirect: "443"
spec:
  rules:
    - host: pix.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: pix-backend
                port:
                  number: 4003
```

## 成本估算 (sa-east-1)

| 资源 | 实例 | 月费 (USD) |
|------|------|------------|
| EKS 集群 | 控制平面 | ~$73 |
| EC2 Workers (3x) | m5.2xlarge | ~$900 |
| RDS PostgreSQL | db.r6g.xlarge 多可用区 | ~$800 |
| ElastiCache | cache.r6g.large x2 | ~$400 |
| NATS EC2 (3x) | t3.xlarge | ~$300 |
| ALB | 标准 | ~$50 |
| **合计** | | **~$2,523** |

## 预期结果

完成此部署后：

- EKS 集群在 sa-east-1 运行，具有 3+ 个工作节点
- RDS 多可用区确保数据库高可用性
- ElastiCache Redis 用于缓存和速率限制
- NATS 集群用于 JetStream 消息传递
- ALB 具有 TLS 终止和 Route 53 DNS
