TypeScriptã®åå®å šæ§ãããŒã¿ããã¯ã¢ããã·ã¹ãã ãã©ã®ããã«å€é©ãããšã©ãŒãæžãããä¿¡é Œæ§ãé«ããã°ããŒãã«äŒæ¥ã®ããŒã¿æŽåæ§ã確ä¿ããããæ¢ããŸãã
TypeScriptããã¯ã¢ããã·ã¹ãã ïŒåå®å šæ§ã§ããŒã¿ä¿è·ã匷åãã
ããžã¿ã«åãé²ãçŸä»£ã«ãããŠãããŒã¿ã¯èŠæš¡ãå°ççãªå Žæã«é¢ããããããããçµç¹ã«ãšã£ãŠçåœç·ã§ããéèŠãªè²¡åèšé²ãã貎éãªç¥ç財ç£ãæ©å¯æ§ã®é«ã顧客æ å ±ã«è³ããŸã§ããã®ããŒã¿ã®æŽåæ§ãšå¯çšæ§ã¯æéèŠäºé ã§ããå ç¢ãªããã¯ã¢ããã·ã¹ãã ã¯åãªããããã°è¯ããã®ãã§ã¯ãªããããžãã¹ã®ç¶ç¶æ§ãèŠå¶éµå®ããããŠäžçäžã®ã¹ããŒã¯ãã«ããŒãšã®ä¿¡é Œé¢ä¿ãç¶æããããã®åºæ¬çãªèŠä»¶ã§ãããããããããã®ã·ã¹ãã ã®éçºãšä¿å®ã«ã¯ãç¹ã«åŸ®åŠãªãã°ã®é²æ¢ãšäžè²«ããããŒã¿åŠçã®ç¢ºä¿ã«ãããŠã倧ããªèª²é¡ã䌎ããŸããããã§ã匷åãªéçåä»ãæ©èœãåããTypeScriptããããä¿¡é Œæ§ãé«ããä¿å®å¯èœã§ãæçµçã«ã¯ããå®å šãªããŒã¿ä¿è·ãœãªã¥ãŒã·ã§ã³ãæ§ç¯ããããã®éçãæäŸããã²ãŒã ãã§ã³ãžã£ãŒãšããŠç»å ŽããŸãã
ãã®å æ¬çãªã¬ã€ãã§ã¯ãTypeScriptã®åå®å šæ§ã掻çšããŠããã¯ã¢ããã·ã¹ãã ã匷åããæœåšçãªé害ç¹ãå埩åã®æ±ã«å€ããæ¹æ³ãæ·±ãæãäžããŸããåä»ããããŠããªãããã¯ã¢ããããžãã¯ã«å åšãããªã¹ã¯ãTypeScriptããããã®ãªã¹ã¯ã軜æžããå ·äœçãªæ¹æ³ãããã³ããã¯ã¢ããã¢ãŒããã¯ãã£ã«åå®å šæ§ãçµ±åããããã®å®è·µçãªæŠç¥ãæ¢æ±ããåœéçãªãªãŒãã£ãšã³ã¹ã«å¯ŸããŠå¯èœãªéãå ç¢ã§ä¿¡é Œæ§ã®é«ãããŒã¿ä¿è·æŠç¥ãä¿èšŒããŸãã
ã°ããŒãã«ãªç¶æ³ã«ãããããŒã¿ä¿è·ã®éèŠæ§
ããŒããŠã§ã¢é害ããµã€ããŒæ»æã人çºçãã¹ãèªç¶çœå®³ãªã©ãããŒã¿æå€±ã®ã€ã³ã·ãã³ãã¯å£æ» çãªçµæãããããå¯èœæ§ããããŸããå€åœç±äŒæ¥ããäžå°äŒæ¥ãŸã§ããã®åœ±é¿ã¯å³æã®éçšåæ¢ã«ãšã©ãŸããŸãããããã«ã¯ãå€å€§ãªçµæžçæå€±ãè©å€ã®æå®³ãããŒã¿ã¬ãžãã³ã·ãŒããã©ã€ãã·ãŒèŠå¶ïŒGDPRãCCPAãLGPDãªã©ïŒãžã®äžéµå®ã«ããæ³çããã«ãã£ãé¡§å®¢ä¿¡é Œã®æ·±å»ãªäœäžãå«ãŸããå¯èœæ§ããããŸããé©åã«èšèšãããããã¯ã¢ããã·ã¹ãã ã¯ç©¶æ¥µã®ã»ãŒãã¬ãŒããšããŠæ©èœããè¿ éãã€å®å šã«éçšãå埩ã»åŸ©å ããææ®µãæäŸããŸãã
ãããããªã³ãã¬ãã¹ã€ã³ãã©ã¹ãã©ã¯ãã£ãè€æ°ã®ã¯ã©ãŠããããã€ããŒããã€ããªããèšå®ã倿§ãªããŒã¿åœ¢åŒã«ãŸãããçŸä»£ã®ããŒã¿ç°å¢ã®è€éãã¯ãããã¯ã¢ããã·ã¹ãã ã®éçºãæ¬è³ªçã«è€éã«ããŠããŸãããããã®ã·ã¹ãã ã¯ãããŒã¿ã®éžæãå§çž®ãæå·åã転éãä¿åãããã³æçµçãªåŸ©å ã®ããã®è€éãªããžãã¯ã䌎ãããšããããããŸããåã¹ãããã¯ãç¶¿å¯ã«ç®¡çããã³æ€èšŒãããªããã°ãæœåšçãªè匱æ§ãå°å ¥ããŸããããã¯ã¢ããã¹ã¯ãªããã®ãšã©ãŒã誀ã£ãŠèšå®ãããã¹ãã¬ãŒãžã¿ãŒã²ããããŸãã¯æ¬ é¥ã®ããããŒã¿å€æã¯ãæãå¿ èŠãšããããšãã«ããã¯ã¢ããã圹ã«ç«ããªããã埩æ§èšç»ã埩æ§ã®æªå€¢ã«å€ããŠããŸãå¯èœæ§ããããŸãã
ããã¯ã¢ããã·ã¹ãã éçºã«ãããäžè¬çãªèœãšã穎
- åä»ããããŠããªãèšå®ãã¹ïŒæè»ã§åä»ããããŠããªãèšå®ãªããžã§ã¯ãã«ããã誀ã£ããã¹ãè³æ Œæ å ±ããŸãã¯ä¿æããªã·ãŒã
- ããŒã¿äžäžèŽãšã©ãŒïŒã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãå§çž®ããŸãã¯æå·åäžã«äºæããªãåã®ããŒã¿ãåŠçããããšãããšãããã¯ã¢ãããç Žæããåå ãšãªããŸãã
- APIçµ±åã®åé¡ïŒã¯ã©ãŠãã¹ãã¬ãŒãžAPIïŒäŸïŒAmazon S3ãAzure Blob StorageãGoogle Cloud StorageïŒãŸãã¯å éšã¹ãã¬ãŒãžãµãŒãã¹ãšã®çžäºäœçšã«ãããäºææ§ã®ãªãããŒã¿æ§é ã
- 埩å ããžãã¯ã®æ¬ é¥ïŒããã¯ã¢ããã®éããã»ã¹ã§ããŒã¿ãè§£åã埩å·åã埩å ãããéã®ãšã©ãŒã«ãããäžå®å šãŸãã¯äœ¿çšäžèœãªåŸ©æ§ã«ã€ãªãããŸãã
- 人çºçãã¹ïŒç¹ã«åçåä»ãèšèªã§ã¯ãåé¡ãå®è¡æãŸã§è¡šé¢åããªãå¯èœæ§ããããããã¹ã¯ãªãããèšå®ã®æå倿Žããªã°ã¬ãã·ã§ã³ãåŒãèµ·ãããŸãã
TypeScriptã®åºç€ïŒéçåãã§ãã¯ã«ãããšã©ãŒé²æ¢
TypeScriptã¯ããªãã·ã§ã³ã®éçåä»ãã远å ããJavaScriptã®ã¹ãŒããŒã»ããã§ããããã«ããã倿°ã颿°ãã©ã¡ãŒã¿ãŒãããã³æ»ãå€ã®åãå®çŸ©ã§ããŸããTypeScriptã³ã³ãã€ã©ã¯ãã³ãŒããå®è¡ãããåã«ããããã®åå®çŸ©ã«å¯ŸããŠã³ãŒãããã§ãã¯ããŸãããã®äºåå®è¡æ€èšŒã¯ãããã¯ã¢ãããœãªã¥ãŒã·ã§ã³ã®ãããªè€éãªã·ã¹ãã ã«ãšã£ãŠéåžžã«éèŠã§ãã
éçåä»ããä¿¡é Œæ§ãã©ã®ããã«é«ããã
- æ©æã®ãšã©ãŒæ€åºïŒ
undefinedããããã£ã¢ã¯ã»ã¹ãã颿°ã«èª€ã£ãåã®åŒæ°ãæž¡ããªã©ãå€ãã®äžè¬çãªããã°ã©ãã³ã°ãã¹ã¯ãå®è¡æã§ã¯ãªãã³ã³ãã€ã«æã«ææãããŸããããã«ããããããã®ãšã©ãŒãéèŠãªããã¯ã¢ããæäœäžããããã¯ããã«æªãããšã«ã埩å 詊è¡äžã«çºçããå¯èœæ§ãå€§å¹ ã«äœæžãããŸãã - ã³ãŒãã®å¯èªæ§ãšä¿å®æ§ã®åäžïŒæç€ºçãªåã¢ãããŒã·ã§ã³ã¯çããããã¥ã¡ã³ããšããŠæ©èœããç¹ã«å€§èŠæš¡ãªããŒã ã倿§ãªèšèªçèæ¯ãæã€æ°ããã¡ã³ããŒããªã³ããŒãã£ã³ã°ããå Žåã«ãéçºè ãã³ãŒãããŒã¹ãçè§£ããããããŸãããã®æç¢ºãã¯ãæ¢åã®ããžãã¯ã誀解ããå¯èœæ§ãæžãããŸããããã¯ãé »ç¹ã«ã¯å€æŽãããªããå®ç§ã«ä¿¡é Œã§ããå¿ èŠãããã·ã¹ãã ã«ãšã£ãŠäžå¯æ¬ ã§ãã
- ãªãã¡ã¯ã¿ãªã³ã°ã®ä¿¡é Œæ§ïŒæ¢åã®ã³ãŒãã倿ŽããéãTypeScriptã®ã³ã³ãã€ã©ã¯ãå倿Žã«ãã£ãŠéäºææ§ãå°å ¥ãããå¯èœæ§ã®ãããã¹ãŠã®ç®æã匷調衚瀺ãããªãã¡ã¯ã¿ãªã³ã°ãã¯ããã«å®å šãªããã»ã¹ã«ããŸããããã¯ãæ°ããããŒã¿èŠä»¶ãã³ã³ãã©ã€ã¢ã³ã¹èŠä»¶ãæºããããã«ããã¯ã¢ããæŠç¥ãé²åãããäžã§éåžžã«è²Žéã§ãã
- éçºè äœéšã®åäžïŒææ°ã®çµ±åéçºç°å¢ïŒIDEïŒã¯TypeScriptã®åæ å ±ãæŽ»çšããŠãã€ã³ããªãžã§ã³ããªãªãŒãã³ã³ããªãŒããã·ã°ããã£ãã«ããã€ã³ã©ã€ã³ãšã©ãŒãã£ãŒãããã¯ãæäŸããçç£æ§ãåäžãããéçºæéãççž®ããŸããããã¯ãæéçå¶çŽã®ãããããžã§ã¯ãã«ãšã£ãŠéåžžã«éèŠãšãªãå¯èœæ§ããããŸãã
ããã¯ã¢ããã·ã¹ãã éçºãžã®åå®å šæ§ã®çµ±å
ããã¯ã¢ããã·ã¹ãã éçºã§TypeScriptã广çã«æŽ»çšããã«ã¯ãããŸããŸãªã¢ãŒããã¯ãã£ã¬ã€ã€ãŒãšéçºæ®µéã§åå®å šæ§ã®ååãé©çšãããå æ¬çãªã¢ãããŒããå¿ èŠã§ãã
1. å æ¬çãªããŒã¿ã¹ããŒããšã€ã³ã¿ãŒãã§ãŒã¹ã®å®çŸ©
åå®å šãªããã¯ã¢ãããžã®æåã®ã¹ãããã¯ãé¢äžãããã¹ãŠã®ããŒã¿ã®æ§é ã现å¿ã®æ³šæãæã£ãŠå®çŸ©ããããšã§ããããã«ã¯ãããã¯ã¢ãããããããŒã¿ïŒæ§é åãããŠããå ŽåïŒã ãã§ãªããããéèŠãªããšãšããŠãããã¯ã¢ããã·ã¹ãã èªäœã®ã¡ã¿ããŒã¿ãèšå®ãéçšããŒã¿ãå«ãŸããŸãã
-
ããã¯ã¢ããèšå®ïŒ
sourcePathsãdestinationBucketãretentionPolicyãencryptionKeyIdãscheduleãnotificationEmailsãªã©ã®ãã©ã¡ãŒã¿ãŒã®åãå®çŸ©ããŸããäŸïŒinterface BackupConfiguration { id: string; name: string; sourceType: 'filesystem' | 'database' | 'cloud-service'; sourceDetails: FileSystemSource | DatabaseSource | CloudServiceSource; destination: S3Destination | AzureBlobDestination | GCSDestination | LocalPathDestination; schedule: CronSchedule | IntervalSchedule; retentionPolicy: RetentionPolicy; encryptionEnabled: boolean; compressionEnabled: boolean; statusNotificationRecipients: string[]; lastRunTimestamp?: Date; } interface FileSystemSource { paths: string[]; excludePatterns?: string[]; } // ... other source and destination interfaces interface CronSchedule { type: 'cron'; cronExpression: string; } interface RetentionPolicy { strategy: 'latest-n' | 'daily' | 'weekly' | 'monthly' | 'yearly'; value: number; // e.g., keep latest 7 backups }ããã«ããããã¹ãŠã®èšå®ãªããžã§ã¯ããäºåå®çŸ©ãããæ§é ã«å³å¯ã«æºæ ãã誀åãéèŠãªãã©ã¡ãŒã¿ãŒã®æ¬ èœã«ããããã¯ã¢ããã®å€±æãé²ããŸãã
-
ããã¯ã¢ããã¡ã¿ããŒã¿ïŒããã¯ã¢ãããå®è¡ããããšãã¡ã¿ããŒã¿ïŒäŸïŒ
backupIdãtimestampãsizeãstatusãchecksumãfilesIncludedïŒãçæãããŸãããã®ã¡ã¿ããŒã¿ã®åãå®çŸ©ããããšã§ãäžè²«æ§ã確ä¿ãããä¿¡é Œæ§ã®é«ãã¯ãšãªãšåŸ©å ã容æã«ãªããŸããäŸïŒinterface BackupRecord { backupId: string; configurationId: string; timestamp: Date; status: 'success' | 'failure' | 'in-progress'; sizeBytes: number; compressedSizeBytes: number; location: string; // URL or path to the backup artifact checksum: string; // SHA256 or similar durationMs: number; logSummary: string; associatedTags: string[]; }ãã®ãããªåã¯ãã°ããŒãã«ãªããã¯ã¢ããã€ã³ãã³ããªã管çããããŸããŸãªã¹ãã¬ãŒãžãªãŒãžã§ã³ããããã€ããŒéã§ã®äžè²«ããã¬ããŒãäœæãšèªåæ€èšŒãå¯èœã«ããäžã§éåžžã«è²Žéã§ãã
2. åä»ããããå€æãšæ€èšŒã«ããããŒã¿æŽåæ§ã®ç¢ºä¿
ããŒã¿ã¯ãå§çž®ãæå·åããŸãã¯åœ¢åŒå€æãªã©ãäœããã®å€æãªãã«ãœãŒã¹ããããã¯ã¢ããå ã«ç§»åããããšã¯ãã£ãã«ãããŸãããåå®å šæ§ã¯ããããã®éèŠãªæ®µéã§ã®ãšã©ãŒãåçã«æžããããšãã§ããŸãã
-
å
¥å/åºåæ€èšŒïŒåã¬ãŒããŸãã¯æ€èšŒã©ã€ãã©ãªïŒäŸïŒZodãYupïŒãTypeScriptãšçµ±åããŠãå
¥åããŒã¿ãŸãã¯èšå®ãæ€èšŒããŸããããã«ãããäºæãããåã«æºæ ããããŒã¿ã®ã¿ããã€ãã©ã€ã³ãééããããšãä¿èšŒãããŸããäŸãã°ãç°å¢å€æ°ãAPIãªã¯ãšã¹ãããã£ãããã¯ã¢ãããã©ã¡ãŒã¿ãŒãšããŠåŠçããåã«æ€èšŒããããªã©ã§ãã
import { z } from 'zod'; const CronScheduleSchema = z.object({ type: z.literal('cron'), cronExpression: z.string().regex(/^(\*|([0-5]?\d)){1}(\/([0-5]?\d)){0,1} (\*|([0-5]?\d)){1}(\/([0-5]?\d)){0,1} (\*|([0-5]?\d)){1}(\/([0-5]?\d)){0,1} (\*|([0-5]?\d)){1}(\/([0-5]?\d)){0,1} (\*|([0-5]?\d)){1}(\/([0-5]?\d)){0,1}$/), // Simplified regex for example }); type CronSchedule = z.infer; try { const config = JSON.parse(process.env.BACKUP_SCHEDULE || '{}'); const schedule: CronSchedule = CronScheduleSchema.parse(config); // Proceed with type-safe schedule } catch (error) { console.error('Invalid schedule configuration:', error); process.exit(1); } -
åä»ããããããŒã¿ãã€ãã©ã€ã³ïŒããã¯ã¢ããããã»ã¹ã®å段éïŒäŸïŒ
compress(data: Buffer): Promise<Buffer>ãencrypt(data: Buffer, key: string): Promise<Buffer>ïŒã«å¯ŸããŠããã®å ¥åãšåºåã®åãæç€ºçã«å®£èšãã颿°ãå®çŸ©ããŸããããã«ãããããŒã¿ãäžè²«ããŠåŠçããã³å€æãããåé¢é£ã®ãšã©ãŒãäžæµã«äŒæããã®ãé²ããŸãã
3. 匷åãªåä»ããããAPIçµ±å
ããã¯ã¢ããã·ã¹ãã ã¯ãã¯ã©ãŠãã¹ãã¬ãŒãžãµãŒãã¹ãéç¥ãµãŒãã¹ããŸãã¯å éšç®¡çããŒã«ãšãã£ãå€éšAPIãšé »ç¹ã«ããåãããŸããTypeScriptã¯ããããã®çµ±åãå ç¢ã§ããããšãä¿èšŒããäžã§èšãç¥ããªã䟡å€ãæäŸããŸãã
- ãµãŒãã¹SDKïŒå€ãã®ã¯ã©ãŠããããã€ããŒã¯TypeScriptäºæã®SDKïŒäŸïŒTypeScriptãµããŒãä»ãã®AWS SDK for JavaScriptïŒãæäŸããŠããŸããããããå©çšããããšã§ãAPIãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®åãã§ãã¯ãããã«å©çšã§ãããããã€åã«äžæ£ç¢ºãªãã©ã¡ãŒã¿ãŒãäºæããªãæ»ãæ§é ãææã§ããŸãã
-
ã«ã¹ã¿ã APIã¯ã©ã€ã¢ã³ãïŒç¬èªã®APIã®å Žåããªã¯ãšã¹ããã€ããŒããšã¬ã¹ãã³ã¹æ§é ã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããŸããããã«ãããããã¯ã¢ããã·ã¹ãã ãæ£ãããã©ãŒããããããããŒã¿ãéä¿¡ããåä¿¡ããããŒã¿ãæ£ããè§£éããããšãä¿èšŒãããããã¯ã¢ããæäœã忢ããããä¿¡é Œæ§ãäœäžããããããäžè¬çãªçµ±åãã°ãé²ããŸãã
interface S3UploadParams { Bucket: string; Key: string; Body: Buffer | Readable; ContentType?: string; ServerSideEncryption?: 'AES256' | 'aws:kms'; // ... other S3 specific params } async function uploadToS3(params: S3UploadParams): Promise<S3UploadResult> { // AWS S3 client integration logic // ... }
4. åå®å šæ§ã«ããå ç¢ãªãšã©ãŒåŠçãšãã®ã³ã°
ããã¯ã¢ããã·ã¹ãã ã§é害ãçºçããå Žåãäœããã©ãã§åé¡ãçºçããããçè§£ããããšã¯ãè¿ éãªè§£æ±ºã«ãšã£ãŠæãéèŠã§ããåå®å šæ§ã¯ãšã©ãŒåŠçãšãã®ã³ã°ã«ãŸã§åã³ã蚺æãããå¹ççã«ããããšãã§ããŸãã
-
åä»ãããããšã©ãŒãªããžã§ã¯ãïŒç¹å®ã®é害ã¢ãŒããã«ãã»ã«åããã«ã¹ã¿ã ãšã©ãŒåïŒäŸïŒ
ConfigurationErrorãStorageConnectionErrorãDataCorruptionErrorïŒãå®çŸ©ããŸããããã«ãããããæ£ç¢ºãªãšã©ãŒåŠçããžãã¯ãšããæç¢ºãªãšã©ãŒã¡ãã»ãŒãžãå¯èœã«ãªããŸããclass StorageConnectionError extends Error { constructor(message: string, public readonly connectionDetails: object) { super(message); this.name = 'StorageConnectionError'; } } try { // Attempt connection throw new StorageConnectionError('Failed to connect to S3', { bucket: 'my-backup-bucket' }); } catch (error) { if (error instanceof StorageConnectionError) { console.error(`ERROR: ${error.message} for bucket: ${error.connectionDetails.bucket}`); // Specific recovery action } else { console.error('An unexpected error occurred:', error); } } -
æ§é åãã°ïŒãã®ã³ã°ã©ã€ãã©ãªã¯äžè¬çã«äžè¬çãªã¡ãã»ãŒãžãåŠçããŸãããæ§é åããããã°ãšã³ããªïŒäŸïŒ
LogEvent: { level: 'info' | 'error', message: string, context: object }ïŒã®åãå®çŸ©ããããšã§ãåºåããããã°ã®äžè²«æ§ã確ä¿ãããŸããããã«ãããç£èŠã·ã¹ãã ïŒSplunkãELKã¹ã¿ãã¯ãDatadogãªã©ïŒãã°ããŒãã«ãªéçšå šäœããã®éèŠãªã€ãã³ããããããã€ãªãŒãžã§ã³ã«é¢ãããç°¡åã«è§£æããŠã¢ã©ãŒããçºããããšã容æã«ãªããŸãã
åå®å šãªããã¯ã¢ããã¢ãŒããã¯ãã£ã®èšèš
åã ã®ã³ã³ããŒãã³ããè¶ ããŠãã¢ãŒããã¯ãã£ã¬ãã«ã§åå®å šæ§ãé©çšããããšã§ãã·ã¹ãã å šäœã®æŽåæ§ãšå埩åãä¿èšŒãããŸãã
ã¢ãžã¥ã©ãŒãã€éå±€åãããèšèš
广çãªããã¯ã¢ããã·ã¹ãã ã¯éåžžãéå±€åã¢ãŒããã¯ãã£ã«åŸããŸããTypeScriptã¯ãããã®ã¬ã€ã€ãŒéã«æç¢ºãªå¥çŽïŒã€ã³ã¿ãŒãã§ãŒã¹ïŒã匷å¶ããå¶çºçãªæžå¿µäºé ã®æŒæŽ©ãããŒã¿æ§é ã®èª€çšãé²ãããšãã§ããŸãã
-
ããŒã¿ãœãŒã¹å±€ïŒããŒã¿å
ããããŒã¿ãèªã¿åã責任ããããŸããã€ã³ã¿ãŒãã§ãŒã¹ã¯ãããŒã¿ãã©ã®ããã«å
¬éãããããå®çŸ©ããŸãïŒäŸïŒ
interface DataSource { readData(path: string): Promise<Buffer> }ïŒã -
åŠçå±€ïŒå§çž®ãæå·åãéè€æé€ãªã©ã®å€æãåŠçããŸãããã®å±€ã®é¢æ°ã¯ãå³å¯ã«åä»ããããå
¥åãåãåããå³å¯ã«åä»ããããåºåãçæããŸãïŒ
compress(input: Buffer): BufferïŒã -
ã¹ãã¬ãŒãžå±€ïŒã¹ãã¬ãŒãžã¿ãŒã²ãããšã®çžäºäœçšã管çããŸããã€ã³ã¿ãŒãã§ãŒã¹ã¯ãããã¯ã¢ããã®ã¢ããããŒããããŠã³ããŒãããªã¹ãã¢ããã®ããã®ã¡ãœãããå®çŸ©ããŸãïŒ
interface StorageProvider { upload(data: Buffer, key: string): Promise<string> }ïŒã - ãªãŒã±ã¹ãã¬ãŒã·ã§ã³å±€ïŒåºç€ãšãªãå±€ã®åä»ããããã€ã³ã¿ãŒãã§ãŒã¹ãå©çšããŠãããã¯ã¢ããããã»ã¹å šäœã調æŽããŸãã
åã«ãã£ãŠåŒ·å¶ããããã®ã¢ãžã¥ãŒã«æ§ã¯ãããå±€ã§ã®å€æŽãä»ã®å±€ãç Žå£ããå¯èœæ§ãäœãããããšãæå³ããŸããããã¯ãä¿¡é Œæ§ãæãªãããšãªãæ°ããæè¡ãèŠå¶èŠä»¶ã«é©å¿ããªããã°ãªããªãè€éãªã·ã¹ãã ãç¶æããäžã§éèŠãªåŽé¢ã§ãã
ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãšãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã«ãããåã®æŽåæ§ã®ç¢ºä¿
ããã¯ã¢ããã·ã¹ãã ãå«ã忣ã·ã¹ãã ã«ãããäžè¬çãªèª²é¡ã¯ãããŒã¿ããã©ã³ã¹ããŒã圢åŒïŒäŸïŒJSONãProtocol BuffersãAvroïŒã«å€æãããéãããã³ãã®éã®å€ææã«åæ å ±ãä¿æããããšã§ããèšå®ãªããžã§ã¯ããã¡ã¿ããŒã¿ã¬ã³ãŒããããã«ã¯ããã¯ã¢ãããããå°ããªæ§é åããŒã¿ãã¡ã€ã«ãæ±ãå Žåã§ããåã®æŽåæ§ãç¶æããããšãéèŠã§ãã
- ã¹ããŒãå®çŸ©èšèªïŒSDLïŒïŒè€éãªããŒã¿ã®å ŽåãTypeScriptãšäžŠè¡ããŠã¹ããŒãå®çŸ©èšèªã䜿çšããããšã§ã远å ã®æ€èšŒã¬ã€ã€ãŒãæäŸã§ããŸããProtocol BuffersãGraphQLã®ãããªããŒã«ã¯ããã®ã¹ããŒãå®çŸ©ããçŽæ¥TypeScriptåãçæã§ãããããã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããã·ãªã¢ã©ã€ãºãããããŒã¿åœ¢åŒãšå®å šã«äžèŽããããšãä¿èšŒãããŸããããã¯ãããŒã¿ããããã¯ãŒã¯å¢çãè¶ããŠè»¢éãããããç°ãªãèšèªã§æžãããã·ã¹ãã ã«ãã£ãŠæ¶è²»ãããå¯èœæ§ã®ãã圢åŒã§ä¿åããããããå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã
-
åãªãã¬ã¯ã·ã§ã³ã«ããã©ã³ã¿ã€ã æ€èšŒïŒTypeScriptã®åã¯å®è¡æã«æ¶å»ãããŸããã
class-transformerã®ãããªã©ã€ãã©ãªãæ€èšŒãã¬ãŒã ã¯ãŒã¯ïŒZodãYupïŒã䜿çšãããšãå®è¡æã«JSONããã®ä»ã®åœ¢åŒãTypeScriptã€ã³ã¿ãŒãã§ãŒã¹ã«å¯ŸããŠæ€èšŒã§ããã¹ããŒããå®çŸ©ã§ããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠäœ¿çšãããåã«ãååŸãããããŒã¿ãæåŸ ãããæ§é ãšäžèŽããããšã確èªããããã«ã埩å ããã»ã¹äžã«äžå¯æ¬ ã§ãã
ã°ããŒãã«ããã¯ã¢ããã·ã¹ãã ã®ããã®å®è·µçãªå®è£ æŠç¥
åå®å šãªããã¯ã¢ããã·ã¹ãã ã广çã«å®è£ ããã«ã¯ãTypeScriptãéçºããã³éçšã¯ãŒã¯ãããŒã«çµ±åããå¿ èŠããããŸãã
1. åãã§ãã¯ã䌎ãããŒãžã§ã³ç®¡çãšã³ãŒãã¬ãã¥ãŒ
ãã¹ãŠã®ããã¯ã¢ããé¢é£ã®ã³ãŒããã¹ã¯ãªãããèšå®ãã¡ã€ã«ã«å ç¢ãªããŒãžã§ã³ç®¡çã·ã¹ãã ïŒäŸïŒGitïŒãå©çšããŸããTypeScriptã®ã³ã³ãã€ã©ããã¬ã³ãããããã¯ãŸãã¯CIãã€ãã©ã€ã³ã«çµ±åããŸããåãã§ãã¯ã«å€±æããå Žåããã«ãªã¯ãšã¹ãã¯ããŒãžã§ããªãããã«ãã¹ãã§ããããã«ãããã©ããªã«å°ããªå€æŽã§ãã£ãŠãåã®äžè²«æ§ãç¶æãããã°ããŒãã«ãªéçšã«åœ±é¿ãäžããå¯èœæ§ã®ãããªã°ã¬ãã·ã§ã³ãé²ããŸãã
2. TypeScriptã«ããèªåãã¹ã
ããã¯ã¢ããã·ã¹ãã ã«ãšã£ãŠãå æ¬çãªãã¹ãã¯äžå¯æ¬ ã§ããTypeScriptã¯ããã¹ãããŒã¿ãšã¢ãã¯ãªããžã§ã¯ããã·ã¹ãã ãæåŸ ããå®éã®ããŒã¿åãšäžèŽããããšãä¿èšŒããããšã§ããããè£å®ããŸããããã¯ããã¹ããããæ£ç¢ºã§ä¿¡é Œæ§ãé«ãããšãæå³ããŸãã
-
ãŠããããã¹ãïŒåã
ã®é¢æ°ïŒäŸïŒ
compressãencryptãuploadïŒãå³å¯ã«åä»ããããå ¥åã§ãã¹ãããå³å¯ã«åä»ããããåºåãã¢ãµãŒãããŸãã - çµ±åãã¹ãïŒç°ãªãã¢ãžã¥ãŒã«ïŒäŸïŒãœãŒã¹ãªãŒããŒããã³ã³ãã¬ããµãŒãã¹ãã¬ãŒãžã¢ããããŒããŒãžïŒéã®çžäºäœçšãæ€èšŒããŸããTypeScriptã¯ããããã®ã¢ãžã¥ãŒã«éã®ããŒã¿å¥çŽãéµå®ãããŠããããšãä¿èšŒããã®ã«åœ¹ç«ã¡ãŸãã
- ãšã³ãããŒãšã³ãïŒE2EïŒãã¹ãïŒå®å šãªããã¯ã¢ããããã³åŸ©å ãµã€ã¯ã«ãã·ãã¥ã¬ãŒãããŸããE2Eãã¹ãã¯ã·ã¹ãã åäœã«çŠç¹ãåœãŠãŸãããã³ãŒãã¬ãã«ã§ã®TypeScriptã¯åºç€ãšãªãå®è£ ãå¥å šã§ããããšãä¿èšŒããåé¢é£ã®ãšã©ãŒã§ã¯ãªãè«ççãªãšã©ãŒãææããäžã§E2Eãã¹ããããä¿¡é Œæ§ã®é«ããã®ã«ããŸãã
3. ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³/ç¶ç¶çãããã€ã¡ã³ãïŒCI/CDïŒ
ãã«ãããã¹ãããããã€ããã»ã¹ãèªååããŸããåãã§ãã¯ïŒtsc --noEmitïŒãCIãã€ãã©ã€ã³ã®å¿
é ã¹ãããã§ããããšã確èªããŠãã ãããåãã§ãã¯ã倱æããå Žåããã«ãã¯å€±æãããããã€ããããªãŒãžã§ã³ã«é¢ä¿ãªããæœåšçã«å£ããã³ãŒããæ¬çªç°å¢ã«å°éããã®ãé²ããŸããããã¯ãå®å®æ§ãäžå¯æ¬ ãªããã¯ã¢ããã·ã¹ãã ã«ãšã£ãŠç¹ã«éèŠã§ãã
4. ããã¢ã¯ãã£ããªç£èŠãšã¢ã©ãŒã
åå®å šæ§ããã£ãŠããã©ã³ã¿ã€ã ã®åé¡ã¯çºçããå¯èœæ§ããããŸããããã¯ã¢ããã·ã¹ãã ã®å¥å šæ§ãããã©ãŒãã³ã¹ãæå/倱æçãå æ¬çã«ç£èŠããŸããåè¿°ããããã«ãåä»ãããããã°æ§é ã䜿çšããããšã§ãç£èŠãœãªã¥ãŒã·ã§ã³ã®æå¹æ§ãå€§å¹ ã«é«ããããšãã§ããŸããã¯ãªãã£ã«ã«ãªã€ãã³ãïŒäŸïŒããã¯ã¢ããã®å€±æãããã¯ã¢ããæéã®å»¶é·ã埩å ã®å€±æïŒã«å¯ŸããŠã¢ã©ãŒããèšå®ããèªå修埩ãããªã¬ãŒããããç°ãªãã¿ã€ã ãŸãŒã³ã®éçšããŒã ã«éç¥ãããããããšãã§ããŸãã
5. 培åºããããã¥ã¡ã³ãäœæãšãã¬ãŒãã³ã°
åå®çŸ©èªäœãåªããããã¥ã¡ã³ããšããŠæ©èœããŸããããããã¢ãŒããã¯ãã£äžã®æ±ºå®ãéçšæé ã埩æ§ã©ã³ããã¯ã«é¢ããè£è¶³ããã¥ã¡ã³ãã¯æ¥µããŠéèŠã§ããéçºããŒã ãšéçšããŒã ã«å¯Ÿãã䜿çšãããåå®å šãªèŠçŽãšããŒã«ã«é¢ãããã¬ãŒãã³ã°ãæäŸããã°ããŒãã«ãªåŸæ¥å¡å šäœã«ããã£ãŠä¿¡é Œæ§ãšçްéšãžã®æ³šæã®æåãè²ã¿ãŸãã
åå®å šãªããã¯ã¢ããã·ã¹ãã ã®ã°ããŒãã«ãªèæ ®äºé
åœå¢ãè¶ããŠéçšãããã·ã¹ãã ã§ã¯ãããã€ãã®è¿œå ã®èŠå ãé¢ä¿ããTypeScriptã®èŠåŸãç¹ã«äŸ¡å€ãçºæ®ããŸãã
ããŒã¿ã¬ãžãã³ã·ãŒãšèŠå¶éµå®ïŒäŸïŒGDPRãCCPAãLGPDïŒ
ã°ããŒãã«ãªããŒã¿èŠå¶ã¯ãå€ãã®å ŽåãããŒã¿ãã©ãã«ä¿åãããªããã°ãªããªããïŒããŒã¿ã¬ãžãã³ã·ãŒïŒãšãã©ã®ããã«æ±ãããªããã°ãªããªããïŒããŒã¿ãã©ã€ãã·ãŒïŒãèŠå®ããŸããåå®å šãªèšå®ã¯ããããã®ããªã·ãŒã匷å¶ããã®ã«åœ¹ç«ã¡ãŸãã
-
ãã±ãŒã·ã§ã³åºæã®èšå®ïŒã¹ãã¬ãŒãžã®å®å
ã«å¯ŸããŠ
regionãŸãã¯dataCenterIdãæç€ºçã«èŠæ±ããåãå®çŸ©ããããããã³ã³ãã©ã€ã¢ã³ã¹ã«ãŒã«ã«ãªã³ã¯ãããŸããäŸãã°ãEuropeanBackupConfigurationåã¯ãdestination.regionãEUããŒã¹ã®ããŒã¿ã»ã³ã¿ãŒã«å¶éãããããããŸãããinterface EuropeanBackupConfiguration extends BackupConfiguration { destination: S3Destination | AzureBlobDestination | GCSDestination; // Enforce EU region for destination destination: { region: 'eu-central-1' | 'eu-west-1' | 'eu-north-1' | 'etc...' }; } - åæç®¡çã¡ã¿ããŒã¿ïŒãŠãŒã¶ãŒããŒã¿ãããã¯ã¢ããããå Žåãåã¯ãåæç¶æ³ãããŒã¿åé¡ïŒäŸïŒPIIãæ©å¯ïŒãä¿ææéã瀺ãã¡ã¿ããŒã¿ãäžè²«ããŠææããåŠçãããããšãä¿èšŒããããŸããŸãªåœéãã©ã€ãã·ãŒæ³ãžã®éµå®ãæ¯æŽããŸãã
ãã«ãã¯ã©ãŠãããã³ãã€ããªããã¯ã©ãŠãæŠç¥
å€ãã®ã°ããŒãã«çµç¹ã¯ãè€æ°ã®ã¯ã©ãŠããããã€ããŒïŒäŸïŒAWSãAzureãGoogle CloudïŒãŸãã¯ãã€ããªããã¢ãããŒãïŒãªã³ãã¬ãã¹+ã¯ã©ãŠãïŒã掻çšããŠããŸããTypeScriptã®ç°ãªãã¹ãã¬ãŒãžãããã€ããŒåãã®æç¢ºãªã€ã³ã¿ãŒãã§ãŒã¹ãšåãå®çŸ©ããèœåã¯ããã®è€éæ§ã®ç®¡çãã¯ããã«å®¹æã«ããŸãã
-
æœè±¡åãããã¹ãã¬ãŒãžã€ã³ã¿ãŒãã§ãŒã¹ïŒæ±çšçãª
StorageProviderã€ã³ã¿ãŒãã§ãŒã¹ãäœæããç¹å®ã®ã¯ã©ãŠãã¯ã©ã€ã¢ã³ãïŒäŸïŒAWSS3ProviderãAzureBlobProviderïŒã«ãã£ãŠå®è£ ãããŸããããã«ãããã³ã¢ããã¯ã¢ããããžãã¯ã¯ãããã€ããŒã«äŸåããªããŸãŸãšãªããåç¹å®ã®å®è£ å ã§åå®å šæ§ã確ä¿ãããŸãã - äžè²«ãããšã©ãŒãããã³ã°ïŒãããã€ããŒåºæã®ãšã©ãŒãå ±éã®åä»ãããããšã©ãŒåã«ãããã³ã°ãã倿§ãªã¯ã©ãŠãç°å¢å šäœã§çµ±äžããããšã©ãŒåŠçæŠç¥ãæäŸããŸãã
ã¹ã±ãŒã©ããªãã£ãããã©ãŒãã³ã¹ããªãœãŒã¹ç®¡ç
TypeScriptèªäœãå®è¡æããã©ãŒãã³ã¹ãçŽæ¥å·Šå³ããããã§ã¯ãããŸãããããããä¿é²ããæç¢ºæ§ãšæ£ç¢ºæ§ã¯ã鿥çã«é«æ§èœã§ã¹ã±ãŒã©ãã«ãªã·ã¹ãã ã«è²¢ç®ããŸããå®è¡æã®ãã°ãå°ãªããã°ããããã°ã«è²»ããæéãæžããæé©åã«æéãå²ãããšãã§ããŸããããã«ãèšå®ãæ£ããé©çšãããããšãä¿èšŒããããšã§ã忣ç°å¢å šäœã§ããã¯ã¢ããããã»ã¹ã«å¯ŸãããªãœãŒã¹å²ãåœãŠããã广çã«ç®¡çã§ããŸãã
åå®å šãªããã¯ã¢ããã®ããã®é©åãªããŒã«ãšã©ã€ãã©ãªã®éžæ
TypeScriptã§åå®å šãªããã¯ã¢ããã·ã¹ãã ãæ§ç¯ããã®ã«åœ¹ç«ã€ããã€ãã®ããŒã«ãšã©ã€ãã©ãªããããŸãã
-
æ€èšŒã©ã€ãã©ãªïŒ
ZodãYupãJoi- èšå®ãç°å¢å€æ°ãããŒã¿ãã€ããŒãã®ã¹ããŒãå®çŸ©ãšå®è¡ææ€èšŒã«åªããŠããŸãã - ã¯ã©ãŠãSDKïŒã»ãšãã©ã®äž»èŠãªã¯ã©ãŠããããã€ããŒã¯ãè±å¯ãªåå®çŸ©ãæäŸããTypeScript察å¿SDKïŒäŸïŒAWS SDK for JavaScript v3ãAzure SDKsãGoogle Cloud Node.js SDKsïŒãæäŸããŠããŸãã
-
ãã¹ããã¬ãŒã ã¯ãŒã¯ïŒ
JestãMochawithChai- TypeScriptãšå®å šã«äºææ§ããããåå®å šãªãã¹ããäœæã§ããŸãã -
ãã«ãããŒã«ïŒ
WebpackãRollupãesbuild- TypeScriptã³ãŒããæ¬çªç°å¢å¯Ÿå¿ã®JavaScriptã«ã³ã³ãã€ã«ããããã«äžå¯æ¬ ã§ãã -
ã³ã³ããåïŒ
DockerãKubernetes- äžè²«æ§ã®ãããããã€ã¡ã³ãç°å¢ã®ããã«ãåãã§ãã¯ãããã³ãŒããäžçäžã®ã©ãã§ãäºæž¬å¯èœã«å®è¡ãããããšãä¿èšŒããŸãã
çµè«ïŒä¿¡é Œã§ããããŒã¿ä¿è·ã®åºç€ãšããŠã®åå®å šæ§
ããŒã¿ããã¯ã¢ããã·ã¹ãã ã¯ãããããçµç¹ã«ãšã£ãŠç©¶æ¥µã®ã»ãŒããã£ãããã§ãããã®ä¿¡é Œæ§ã¯äº€æžã®äœå°ããããŸãããTypeScriptã®éçåä»ããæ¡çšããããšã§ãéçºè ã¯ãããã®éèŠãªã·ã¹ãã ãã¯ããã«é«ãä¿¡é Œæ§ãšå ç¢æ§ã§æ§ç¯ã§ããŸããããŒã¿ã®ã¹ããŒãã现å¿ã®æ³šæãæã£ãŠå®çŸ©ããäžè²«ããAPIçµ±åã匷å¶ããããšããããšã©ãŒåŠçãåçåããã°ããŒãã«ãªããŒã¿èŠå¶ãžã®æºæ ã確ä¿ããããšãŸã§ãåå®å šæ§ã¯å ç¢ãªããã¯ã¢ãããœãªã¥ãŒã·ã§ã³ã®ããããåŽé¢ã«æµžéããŠããŸãã
ã°ããŒãã«ã«çžäºæ¥ç¶ãããç°å¢ã§äºæ¥ãå±éããçµç¹ã«ãšã£ãŠãããã¯ã¢ããã·ã¹ãã éçºã«TypeScriptãæè³ããããšã¯ãå®å®æ§ãå®å¿ããããŠæçµçã«ã¯æ°žç¶çãªããžãã¹ç¶ç¶æ§ãžã®æè³ã§ããããã¯ãååçãªãããã°ããèœåçãªãšã©ãŒé²æ¢ãžãšç§»è¡ããããŒã¿åŸ©æ§ã·ããªãªãšããçå®ã®ç¬éã蚪ãããšãã«ãããã¯ã¢ããã·ã¹ãã ãæåŸ éãã«æ©èœããæã貎éãªè³ç£ã§ããããŒã¿ãã©ãã«ååšãã誰ãããã«äŸåããŠãããã«é¢ãããããããä¿è·ããããšãä¿èšŒãããã®ã§ãã