AWS
Referenčné rozloženie na ECS Fargate s RDS for PostgreSQL a nástrahy špecifické pre AWS.
Táto stránka opisuje časti a ich nastavenia, nie hotovú šablónu: každý účet AWS má vlastnú sieť, pomenovanie aj nástroje. Prepíšte ju do Terraformu, CloudFormation, CDK alebo konzoly podľa toho, čo používate.
Rozloženie
| Časť | Služba AWS | Nastavenia |
|---|---|---|
| Databáza | RDS for PostgreSQL 16–18 alebo externý poskytovateľ | db.t4g.small alebo väčšia, 20 GB gp3. Dáta zaberú asi 2,3 GB. |
serve |
Služba ECS na Fargate za Application Load Balancerom | 0,25 vCPU, 0,5 GB, jedna alebo viac úloh. |
sync |
Úloha ECS na Fargate spúšťaná cez EventBridge Scheduler | 0,5 vCPU, 1 GB, rozvrh rate(1 hour). |
migrate |
Rovnaká definícia úlohy ako sync, spustená raz pri každom vydaní |
Príkaz migrate s rolou pre migrácie. |
| Tajomstvá | Secrets Manager | Jedno tajomstvo pre každú databázovú rolu a odtlačky API kľúčov. |
| Logy | CloudWatch Logs (awslogs) |
Logy neobsahujú mená, dopyty ani identifikátory. |
Namiesto plánovanej úlohy môže sync bežať ako služba ECS s jednou úlohou a príkazom sync --every 1h. Obe možnosti
sú správne; plánovaná úloha medzi behmi nič nestojí.
Postup
Databáza
Vytvorte inštanciu v privátnych podsieťach. pg_trgm je na RDS dostupné bez zmeny parametrov. Raz sa pripojte
ako hlavný používateľ a vytvorte tri roly z Databázy. Hlavný používateľ RDS to
môže urobiť: nemusí byť skutočný superpoužívateľ.
Tajomstvá
Uložte REGISTER_MIGRATE_DATABASE_URL, REGISTER_SYNC_DATABASE_URL, REGISTER_DATABASE_URL a
REGISTER_API_KEYS do Secrets Manager. Každej definícii úlohy dajte cez pole secrets kontajnera len tajomstvo,
ktoré jej príkaz potrebuje; rola na spúšťanie úloh potrebuje secretsmanager:GetSecretValue len na tieto
tajomstvá.
Migrácia
Spustite jednorazovú úlohu s príkazom migrate a tajomstvom pre migrácie a počkajte na návratový kód 0.
Synchronizácia
Vytvorte rozvrh. Prvý beh stiahne celý snapshot RPO a trvá asi 15 minút; ďalšie behy trvajú sekundy až niekoľko minút. Prekrývajúci sa štart hneď skončí, takže dlhý prvý beh sa s ďalším nikdy nezrazí.
API
Vytvorte službu a load balancer s TLS na listeneri. API odpovedá 503, kým prvá synchronizácia nezverejní všetky
zdroje.
Definície kontajnerov
Podstatné časti, zástupné hodnoty sú v lomených zátvorkách:
{
"name": "sync",
"image": "<image>",
"command": ["sync"],
"secrets": [
{ "name": "REGISTER_SYNC_DATABASE_URL", "valueFrom": "<sync secret ARN>" }
],
"environment": [
{ "name": "REGISTER_WORK_DIR", "value": "/tmp/accquix-register" }
],
"logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "<group>", "awslogs-region": "<region>", "awslogs-stream-prefix": "sync" } }
}
{
"name": "serve",
"image": "<image>",
"command": ["serve"],
"portMappings": [{ "containerPort": 8080 }],
"secrets": [
{ "name": "REGISTER_DATABASE_URL", "valueFrom": "<api secret ARN>" },
{ "name": "REGISTER_API_KEYS", "valueFrom": "<api keys secret ARN>" }
]
}
Nástrahy
| Nástraha | Čo urobiť |
|---|---|
Kontrola zdravia load balancera na /readyz. /readyz vracia 503, kým sa prvá synchronizácia neskončí, takže cieľová skupina označí všetky úlohy za nezdravé a ECS ich v slučke nahrádza. |
Pre kontrolu zdravia cieľovej skupiny použite /livez. /readyz a /v1/sources sledujte v monitorovaní. |
Kontrola zdravia kontajnera. Obraz je distroless: nemá shell ani curl, takže kontrola CMD-SHELL vždy zlyhá. |
Kontrolu zdravia kontajnera vynechajte a spoľahnite sa na load balancer. |
RDS Proxy pre sync. Proxy pripína alebo narúša advisory lock a COPY. |
REGISTER_SYNC_DATABASE_URL nasmerujte na koncový bod inštancie. serve môže proxy používať. |
sslmode=verify-full na RDS. Certifikáty RDS podpisuje certifikačná autorita RDS, ktorá nie je v úložisku dôveryhodných certifikátov obrazu, takže spojenie zlyhá. |
Zostavte odvodený obraz s balíkom CA RDS a do URL pridajte sslrootcert=<cesta>, alebo v privátnej VPC použite sslmode=require. |
Koreňový súborový systém len na čítanie. S readonlyRootFilesystem nemôže sync zapisovať do pracovného priečinka. |
Pripojte zväzok úlohy (stačí dočasné úložisko) a nasmerujte naň REGISTER_WORK_DIR. |
App Runner alebo Lambda pre sync. Obe zastavia prácu, ktorá nie je požiadavkou; prvá synchronizácia beží asi 15 minút. |
Pre sync použite úlohy ECS. |
| Žiadny odchádzajúci internet. Úlohy v privátnych podsieťach bez NAT brány alebo verejnej IP sa k zdrojom nedostanú. | Pridajte NAT bránu alebo spúšťajte úlohy vo verejných podsieťach s verejnou IP a prísnou bezpečnostnou skupinou. |
| Externá databáza so zoznamom povolených IP. Úlohy na Fargate dostávajú meniace sa adresy. | Smerujte prevádzku cez NAT bránu s Elastic IP a povoľte túto adresu. |
Aktualizácie
- Zverejnite novú značku obrazu.
- Spustite úlohu
migrates novým obrazom a počkajte na návratový kód 0. - Aktualizujte obe definície úloh na nový obraz. Ďalší plánovaný
syncho použije;servesa nasadí cez nasadenie ECS.